返回顶部
首页 > 资讯 > 移动开发 >利用Flutter制作一个摸鱼桌面版App
  • 556
分享到

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

2024-04-02 19:04:59 556人浏览 独家记忆
摘要

目录准备工作开始敲代码找到资源思考布局实现布局思考动画实现动画结语Win10商店上架了一款名为《摸鱼》的App,在下载打开之后,这个App会让你的电脑进入一个假更新的画面,让别人以为

Win10商店上架了一款名为《摸鱼》的App,在下载打开之后,这个App会让你的电脑进入一个假更新的画面,让别人以为你的电脑正在升级,这时候你就可以休息一下,优雅地喝一杯咖啡。 

顿时这个念头划过了我的脑海:好东西,但是我用的是 MacBook,不能用这个应用。但是貌似我可以自己写一个?

准备工作

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


Flutter config --enable-macos-desktop
flutter 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 的启动画面,有几个要点:

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

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

思考动画

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

开始是没有进度条的;

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

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

  • 构造分段的时长 (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);

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


@override
void 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)

打包发布

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

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

结语

可能大多数人都没有想到,编写一个 Flutter 应用,跑在 macOS 上,能有这么简单。当然,看似短暂的 10 分钟并没有包括安装环境、搜索素材、提交到 git 的时间,但在这个时间范围内,完成相关的事情也是绰绰有余。

到此这篇关于利用Flutter制作一个摸鱼桌面版App的文章就介绍到这了,更多相关Flutter摸鱼App内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 利用Flutter制作一个摸鱼桌面版App

本文链接: https://lsjlt.com/news/160666.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 利用Flutter制作一个摸鱼桌面版App
    目录准备工作开始敲代码找到资源思考布局实现布局思考动画实现动画结语Win10商店上架了一款名为《摸鱼》的App,在下载打开之后,这个App会让你的电脑进入一个假更新的画面,让别人以为...
    99+
    2024-04-02
  • 如何利用Flutter制作一个摸鱼桌面版App
    这篇文章将为大家详细讲解有关如何利用Flutter制作一个摸鱼桌面版App,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Win10商店上架了一款名为《摸鱼》的App,在下载打开之后,这个Ap...
    99+
    2023-06-22
  • 怎么用PyQT5制作一个桌面摸鱼工具
    这篇文章主要介绍“怎么用PyQT5制作一个桌面摸鱼工具”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用PyQT5制作一个桌面摸鱼工具”文章能帮助大家解决问题。按键功能控制q 退出B 书签功能F ...
    99+
    2023-06-29
  • 基于PyQT5制作一个桌面摸鱼工具
    目录前言按键功能控制主要功能核心代码前言 现在我能一整天都严肃地盯着屏幕,看起来就像在很认真地工作, 利用摸鱼,打开小说,可实行完美摸鱼,实时保存进度 用PYQT5 Mock一个摸鱼...
    99+
    2024-04-02
  • 详解用flutter制作上班摸鱼应用
    网上最近看到了个摸鱼应用,还挺好玩的,我就自己用flutter写了一个。 之前我有用flutter制作过mobile应用,但是没有在desktop尝试过;毕竟2.0大更新,我这里就在...
    99+
    2024-04-02
  • 怎么用flutter制作上班摸鱼应用
    小编给大家分享一下怎么用flutter制作上班摸鱼应用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!网上最近看到了个摸鱼应用,还挺好玩的,我就自己用flutter写了一个。之前我有用flutter制作过mobile应用,但...
    99+
    2023-06-29
  • 基于Python绘制一个摸鱼倒计时界面
    目录前言实现过程前言 前段时间在微博看到一段摸鱼人的倒计时模板,感觉还挺有趣的。 于是我用了一小时的时间写了个页面出来 摸鱼办地址 (当然是摸鱼的时间啦)。 模板是这样的: 摸鱼办...
    99+
    2024-04-02
  • 利用Android怎么制作一个APP登录界面
    这期内容当中小编将会给大家带来有关利用Android怎么制作一个APP登录界面,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。布局的xml文件<&#63;xml version="1...
    99+
    2023-05-31
    android pp
  • 利用Android制作一个APP首页
    本篇文章给大家分享的是有关利用Android制作一个APP首页,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首页展示LRecyclerView作为主框架,轮播图以及分类网格列表...
    99+
    2023-05-31
    android pp
  • 如何基于Python绘制一个摸鱼倒计时界面
    这篇文章将为大家详细讲解有关如何基于Python绘制一个摸鱼倒计时界面,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。实现过程首先要知道、除了静态文字之外的比如当前日期、距离节日放假的天数等都是动态返回的,...
    99+
    2023-06-22
  • Python摸鱼神器之利用树莓派opencv人脸识别自动控制电脑显示桌面
    前言 老早就看到新闻员工通过人脸识别监控老板来摸鱼。 有时候摸鱼太入迷了,经常在上班时间玩其他的东西被老板看到。自从在咸鱼上淘了一个树莓派3b,尝试做了一下内网穿透,搭建网站就吃...
    99+
    2024-04-02
  • 基于Python制作一个桌面宠物
    目录获取素材图片窗体设置随机展示宠物图片添加动作右键菜单今天,我们来分享一个宠物桌面小程序,全程都是通过 PyQT 来制作的,对于 Python GUI 感兴趣的朋友,千万不要错过哦...
    99+
    2022-12-08
    Python实现桌面宠物 Python桌面宠物
  • 用Python制作一个可以聊天的皮卡丘版桌面宠物
    目录导语开发工具原理简介步骤实现导语 前段时间有小伙伴留言说想让我带大家写写桌面小挂件,今天就满足一下留过类似言的小伙伴的请求呗~不过感觉写桌面的挂历啥的没意思,就简单带大家做一只桌...
    99+
    2024-04-02
  • 怎么用Python制作一个可以聊天的皮卡丘版桌面宠物
    这篇文章主要介绍了怎么用Python制作一个可以聊天的皮卡丘版桌面宠物,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。开发工具Python版本:3.6.4相关模块:PyQt5模...
    99+
    2023-06-29
  • 使用小程序制作一个电子木鱼,功德+1
    此文主要通过小程序制作一个敲木鱼的小工具,在心烦意乱的时候缓解一下焦虑。 一、创建小程序 二、设计页面 三、代码块 四、拓展开发 ...
    99+
    2023-09-10
    小程序 微信小程序 前端 木鱼 电子功德 电子木鱼
  • 如何利用PyQt5制作一个简单的登录界面
    目录环境配置额外工具配置生成UI界面总结环境配置 新建python虚拟环境并激活 conda create -n pyqt python=3.8 conda activate py3...
    99+
    2024-04-02
  • 怎么在android中利用recyclerview制作一个聊天界面
    本篇文章给大家分享的是有关怎么在android中利用recyclerview制作一个聊天界面,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实现代码:package c...
    99+
    2023-05-31
    android recyclerview recycle
  • 怎么利用PyQt5制作一个简单的登录界面
    这篇文章主要介绍“怎么利用PyQt5制作一个简单的登录界面”,在日常操作中,相信很多人在怎么利用PyQt5制作一个简单的登录界面问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么利用PyQt5制作一个简单的登...
    99+
    2023-07-02
  • 怎么用Flutter快速制作一个水印组件
    本篇内容介绍了“怎么用Flutter快速制作一个水印组件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!效果通过child属性将水印叠加给子组...
    99+
    2023-07-05
  • 利用Matlab制作一款3D版2048小游戏
    其实逻辑和2维版本完全一样,就不进行详细解说了,直接看效果: 效果: 目前界面还不咋好看,期待大家的优化 还是键盘↑↓←→操作嗷 完整代...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作