这次依然是补作业,之前在写仿“探探”左滑/右滑的效果的时候,设计稿底部的喜欢Icon其实是有类似于Twitter点赞那种的动效的,但是因为时间原因我偷懒没写。
  惯例先上效果图:

  GitHub地址:https://github.com/yumi0629/FlutterUI/tree/master/lib/likebutton

  整体算法是参照了GitHub上star最多的jd-alexander大佬写的LikeButton,我进行了调整,并最终用Flutter实现。
  一点小缺陷:现在的实现方式,icon大小没法自适应,需要初始化布局的时候手动传入一个size。

设计思路

  我们将动画放慢,很明显整体动画由三部分组成:中间Icon的放大、底部圆环的交替和外部烟花散开的效果:

整体布局

  因为是层叠布局,我们依旧是使用Stack来实现,底部圆环的交替和外部烟花散开的效果是使用的CustomPaint来绘制,而中间的小图标则是使用的普通Widget实现:

Stack(alignment: Alignment.center,children: <Widget>[CustomPaint(size: Size(widget.width, widget.width),painter: DotPainter(),),CustomPaint(isComplex: true,size: Size(widget.width * 0.35, widget.width * 0.35),painter: CirclePainter(),Container(width: widget.width,height: widget.width,alignment: Alignment.center,child: Transform.scale(scale: isLiked ? scale.value : 1.0,child: GestureDetector(child: Icon(),onTap: _onTap,),),),],);

  Paint的绘制在这里就不多说了,因为基本都是数学问题。整体效果的实现主要是要学会用一个Controller来控制多个动画。

动画控制 Staggered Animation

  这一期主要是想跟大家讲讲如何用一个Controller来控制多个动画同时进行,也就是Flutter中的Staggered Animation(交错动画)。
  我们可以定义很多个Animation,将他们和同一个controller绑定:

Animation<double> outerCircle = new Tween<double>(begin: 0.1,end: 1.0,).animate(new CurvedAnimation(parent: _controller,curve: new Interval(0.0,0.3,curve: Curves.ease,),),);Animation<double> innerCircle = new Tween<double>(begin: 0.2,end: 1.0,).animate(new CurvedAnimation(parent: _controller,curve: new Interval(0.2,0.5,curve: Curves.ease,),),);Animation<double> 

  上面的例子中,outerCircleinnerCircle共享同一个_controller,而各自的播放顺序通过Interval来控制:outerCircle的动画时间为整体进度的0.0~0.3,innerCircle的动画时间为整体进度的0.2~0.5。对于单个动画的进度,我们可以通过outerCircle.valueinnerCircle.value来获取,单个动画的进度范围依然是0.0~1.0,所以绘制每一组动画时,不需要去手动转换。

绘制中的一些坑

  这次碰到的主要问题是paintblendMode属性有坑,因为底部两个圆环在绘制时的思路是:大圆环绘制到一半时,开始绘制小圆环将其遮盖住,但是小圆环的颜色我们没法设定,因为我们不知道画布是什么颜色的,因此没法用相同的颜色去遮盖住大圆环。这个问题可以通过设置paintblendMode属性为BlendMode.clear解决,看名字就很好理解,就是清楚之前的绘制区域,但是这个BlendMode.clear有bug。
  如果你直接向下面这样写,那么你会发现,clear掉的部分会变成黑色:

  解决方法就是在绘制前保存一下当前layer:

canvas.saveLayer(Offset.zero & size, Paint());
canvas.drawCircle(Offset(center, center), 20.0, circlePaint);
canvas.drawCircle(Offset(center, center), 10.0, maskPaint);
canvas.restore();

用Flutter实现一个仿Twitter的点赞效果相关推荐

  1. 仿抖音点赞效果实现 ——————自定义View

    玩过抖音的人应该都知道抖音的点赞效果挺酷炫的,而作为码农我们一定想知道它是怎么实现的.先上效果图: 实现原理非常的简单,直接上代码: /*** Description: 自定义 仿抖音动画类* Dat ...

  2. 仿Twitter的公告效果

    2019独角兽企业重金招聘Python工程师标准>>> <ul id="twitter"> <li>第一条消息</li> &l ...

  3. pythoni屏幕连点_【Flutter组件】仿抖音双击点赞弹出爱心效果(可连点)

    效果 简介 仿抖音点赞手势,单击暂停,双击点赞,可连续点击添加多个爱心,特点如下 全部效果为代码绘制(爱心图标来自Material Icon的图标) 套上在目标Widget外即可使用 提供单击与点赞的 ...

  4. 【Flutter组件】仿抖音双击点赞弹出爱心效果(可连点)

    效果 简介 仿抖音点赞手势,单击暂停,双击点赞,可连续点击添加多个爱心,特点如下 全部效果为代码绘制(爱心图标来自Material Icon的图标) 套上在目标Widget外即可使用 提供单击与点赞的 ...

  5. 多图弹出最后变成心形html,【Flutter组件】仿抖音双击点赞弹出爱心效果(可连点)...

    效果 简介 仿抖音点赞手势,单击暂停,双击点赞,可连续点击添加多个爱心,特点如下 全部效果为代码绘制(爱心图标来自Material Icon的图标) 套上在目标Widget外即可使用 提供单击与点赞的 ...

  6. Flutter组件:仿抖音双击点赞弹出爱心效果

    效果 简介 仿抖音点赞手势,单击暂停,双击点赞,可连续点击添加多个爱心,特点如下 全部效果为代码绘制(爱心图标来自Material Icon的图标) 套上在目标Widget外即可使用 提供单击与点赞的 ...

  7. 用 Flutter 写一个精美的登录页面(最新版)

    用 Flutter 写一个精美的登录页面(最新版) 主体结构 标题 输入框 登录按钮 其他登录方式 注册按钮 完整源码 参考了博客:用flutter写一个精美的登录页面.但是那篇文章是 18 年的,较 ...

  8. android仿网易云音乐引导页、仿书旗小说Flutter版、ViewPager切换、风扇叶片效果等源码...

    2019独角兽企业重金招聘Python工程师标准>>> Android精选源码 复现网易云音乐引导页效果 高仿书旗小说 Flutter版,支持iOS.Android Android ...

  9. android点赞取消赞功能吗,Android 仿微博的点赞功能的实现原理(持续点赞再取消)...

    搜索热词 产品需求,实现类似微博的持续点赞再取消功能,因为自己也偶尔刷微博,对这功能有一定的使用上的了解, 至于微博点赞的具体实现我并不知道,微博点赞在断网的情况下依然能点赞,不会提示网络异常,等有网 ...

最新文章

  1. python中的format函数_python中的format 函数是什么?如何使用?
  2. MTK深圳公司嵌入式软件工程师笔试题(含部分答案)
  3. api权限管理系统与前后端分离实践
  4. IBM中国开发中心吉燕勇: 通过Cloud Data Services打造新型认知计算数据分析云平台...
  5. 【洛谷 3372】线段树 1
  6. IIS 日志文件位置
  7. [强]VC 6.0 可以这样创建对话框
  8. 行业看点 | 量子计算时代即将到来?华人科学家揭秘“天使粒子”背后故事……...
  9. vc中如何将一个工程的资源复制到另外一个工程?
  10. python32什么意思_“python2”和“python3”有什么区别?
  11. 为什么南派三叔要封笔?
  12. 螃蟹学PHP设计模式之访问者模式
  13. python设计模式-模板方法模式 1
  14. Rust : AES算法加密、解密
  15. 基于C语言的基础学习Java
  16. Laravel 框架 - 模板继承
  17. 39、VS838红外线接收实验
  18. Webcontent 和WebRoot的区别
  19. 网站设计流程分为哪几个步骤
  20. 计算机流程图设计教程,流程图制作工具分享,在电脑上就可以画图

热门文章

  1. Call requires API level 16 (current min is 15):
  2. 创龙Xilinx Artix-7系列FPGA开发板的拨码开关、拓展IO
  3. bash逐行读取文件
  4. 5s插上电信卡显示无服务器,苹果5s装上电信卡肿么是无服务啊
  5. basic在c语言中是常量吗,QBASIC中的常量
  6. SAP内向交货详细解释
  7. 关于C#使用socks5做代理
  8. 出行即服务MaaS精华主题汇总(至2022年12月06日)
  9. java 32位可用内存_JVM内存不要超过32G
  10. Python抓取网页中的动态序列化数据