我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何利用Flutter制作一个摸鱼桌面版App

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何利用Flutter制作一个摸鱼桌面版App

这篇文章将为大家详细讲解有关如何利用Flutter制作一个摸鱼桌面版App,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

    Win10商店上架了一款名为《摸鱼》的App,在下载打开之后,这个App会让你的电脑进入一个假更新的画面,让别人以为你的电脑正在升级,这时候你就可以休息一下,优雅地喝一杯咖啡。 顿时这个念头划过了我的脑海:好东西,但是我用的是 MacBook,不能用这个应用。但是貌似我可以自己写一个?

    准备工作

    年轻最需要的就是行动力,想到就干,尽管我此刻正在理顺 DevFest 的讲稿,但丝毫不妨碍我用 10 分钟写一个 App。于是我打出了一套组合拳:

    flutter config --enable-macos-desktopflutter create --platforms=macos touch_fish_on_macos

    一个支持 macOS 的 Flutter 项目就创建好了。(此时大约过去了 1 分钟)

    开始敲代码

    找到资源

    我们首先需要一张高清无码的 图片,这里你可以在网上进行搜寻,有一点需要注意的是,使用 LOGO 要注意使用场景带来的版权问题。找到图片后,丢到 assets/apple-logo.png,并在 pubspec.yaml 中加上资源引用:

    flutter:  use-material-design: true+ assets:+   - assets/apple-logo.png

    思考布局

    我们来观察一下 macOS 的启动画面,有几个要点:

    如何利用Flutter制作一个摸鱼桌面版App

    LOGO 在屏幕中间,固定大小约为 100dp;

    LOGO 与进度条间隔约 100 dp;

    进度条高度约 5dp,宽度约 200dp,圆角几乎完全覆盖高度,值部分为白色,背景部分为填充色+浅灰色边框。

    (别问我为什么这些东西能观察出来,问就是天天教 UI 改 UI。)

    确认了大概的布局模式,接下来我们开始搭布局。(此时大约过去了 2 分钟)

    实现布局

    首先将 LOGO 居中、着色、设定宽度为 100,上下间隔 100:

    return Center(  child: Column(    mainAxisAlignment: MainAxisAlignment.center,    children: <Widget>[      const Spacer(),      Padding(        padding: const EdgeInsets.symmetric(vertical: 100),        child: Image.asset(          'assets/apple-logo.png',          color: CupertinoColors.white, // 使用 Cupertino 系列的白色着色          width: 100,        ),      ),      const Spacer(),    ],  ),);

    然后在下方放一个相对靠上的进度条:

    return Center(  child: Column(    mainAxisAlignment: MainAxisAlignment.center,    children: <Widget>[      const Spacer(),      Padding(        padding: const EdgeInsets.symmetric(vertical: 100),        child: Image.asset(          'assets/apple-logo.png',          color: CupertinoColors.white, // 使用 Cupertino 系列的白色          width: 100,        ),      ),      Expanded(        child: Container(          width: 200,          alignment: Alignment.topCenter, // 相对靠上中部对齐          child: DecoratedBox(            border: Border.all(color: CupertinoColors.systemGrey), // 设置边框            borderRadius: BorderRadius.circular(10), // 这里的值比高大就行          ),          child: ClipRRect(            borderRadius: BorderRadius.circular(10), // 需要进行圆角裁剪            child: LinearProgressIndicator(              value: 0.3, // 当前的进度值              backgroundColor: CupertinoColors.lightBackgroundGray.withOpacity(.3),              color: CupertinoColors.white,              minHeight: 5, // 设置进度条的高度            ),          ),        ),      ),    ],  ),);

    到这里你可以直接 run,一个静态的界面已经做好了。(此时大约过去了 4 分钟)

    打开 App,你已经可以放在一旁挂机了,老板走到你的身边,可能会跟你闲聊更新的内容。但是,更新界面不会动,能称之为更新界面? 当老板一而再再而三地从你身边经过,发现还是这个进度的时候,也许就已经把你的工资划掉了,或者第二天你因为进办公室在椅子上坐下而被辞退。

    那么下一步我们就要思考如何让它动起来。

    思考动画

    来看看启动动画大概是怎么样的:

    如何利用Flutter制作一个摸鱼桌面版App

    开始是没有进度条的;

    进度条会逐级移动、速度不一定相等。

    基于以上两个条件,我设计了一种动画处理方式:

    • 构造分段的时长 (Duration),可以自由组合由多个时长;

    • 动画通过时长的数量决定每个时长最终的进度;

    • 每段时长控制起始值到结束值的间隔。

    只有三个条件,简单到起飞,开动!(此时大约过去了 5 分钟)

    实现动画

    开局一个 AnimationController:

    class _HomePageState extends State<HomePage> with SingleTickerProviderStateMixin {  /// 巧用 late 初始化,节省代码量  late final AnimationController _controller = AnimationController(vsync: this);   /// 启动后等待的时长  Duration get _waitingDuration => const Duration(seconds: 5);   /// 分段的动画时长  List<Duration> get _periodDurations {    return <Duration>[      const Duration(seconds: 5),      const Duration(seconds: 10),      const Duration(seconds: 4),    ];  }   /// 当前进行到哪一个分段  final ValueNotifier<int> _currentPeriod = ValueNotifier<int>(1);

    接下来实现动画方法,采用了递归调用的方式,减少调用链的控制:

    @overridevoid initState() {  super.initState();  // 等待对应秒数后,开始进度条动画  Future.delayed(_waitingDuration).then((_) => _callAnimation());} Future<void> _callAnimation() async {  // 取当前分段  final Duration _currentDuration = _periodDurations[currentPeriod];  // 准备下一分段  currentPeriod++;  // 如果到了最后一个分段,取空  final Duration? _nextDuration = currentPeriod < _periodDurations.length ? _periodDurations.last : null;  // 计算当前分段动画的结束值  final double target = currentPeriod / _periodDurations.length;  // 执行动画  await _controller.animateTo(target, duration: _currentDuration);  // 如果下一分段为空,即执行到了最后一个分段,重设当前分段,动画结束  if (_nextDuration == null) {    currentPeriod = 0;    return;  }  // 否则调用下一分段的动画  await _callAnimation();}

    以上短短几行代码,就完美的实现了进度条的动画操作。(此时大约过去了 8 分钟)

    最后一步,将动画、分段二者与进度条绑定,在没进入分段前不展示进度条,在动画开始后展示对应的进度:

    ValueListenableBuilder<int>(  valueListenable: _currentPeriod,  builder: (_, int period, __) {    // 分段为0时,不展示    if (period == 0) {      return const SizedBox.shrink();    }    return DecoratedBox(      decoration: BoxDecoration(        border: Border.all(color: CupertinoColors.systemGrey),        borderRadius: BorderRadius.circular(10),      ),      child: ClipRRect(        borderRadius: BorderRadius.circular(10),        child: AnimatedBuilder( // 使用 AnimatedBuilder,在动画进行时触发更新          animation: _controller,          builder: (_, __) => LinearProgressIndicator(            value: _controller.value, // 将 controller 的值绑定给进度            backgroundColor: CupertinoColors.lightBackgroundGray.withOpacity(.3),            color: CupertinoColors.white,            minHeight: 5,          ),        ),      ),    );  },)

    大功告成,总共用时 10 分钟,让我们跑起来看看效果。(下图 22.1 M)

    如何利用Flutter制作一个摸鱼桌面版App

    打包发布

    发布正式版的 macOS 应用较为复杂,但我们可以打包给自己使用,只需要一行命令即可:flutter build macos。

    成功后,产物将会输出在 build/macos/Build/Products/Release/touch_fish_on_macos.app,双击即可使用

    关于如何利用Flutter制作一个摸鱼桌面版App就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    如何利用Flutter制作一个摸鱼桌面版App

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    如何利用Flutter制作一个摸鱼桌面版App

    这篇文章将为大家详细讲解有关如何利用Flutter制作一个摸鱼桌面版App,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Win10商店上架了一款名为《摸鱼》的App,在下载打开之后,这个Ap
    2023-06-22

    怎么用PyQT5制作一个桌面摸鱼工具

    这篇文章主要介绍“怎么用PyQT5制作一个桌面摸鱼工具”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用PyQT5制作一个桌面摸鱼工具”文章能帮助大家解决问题。按键功能控制q 退出B 书签功能F
    2023-06-29

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录