用Flutter实现一个仿Twitter的点赞效果
这次依然是补作业,之前在写仿“探探”左滑/右滑的效果的时候,设计稿底部的喜欢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>
上面的例子中,outerCircle
和innerCircle
共享同一个_controller
,而各自的播放顺序通过Interval
来控制:outerCircle
的动画时间为整体进度的0.0~0.3,innerCircle
的动画时间为整体进度的0.2~0.5。对于单个动画的进度,我们可以通过outerCircle.value
和innerCircle.value
来获取,单个动画的进度范围依然是0.0~1.0,所以绘制每一组动画时,不需要去手动转换。
绘制中的一些坑
这次碰到的主要问题是paint
的blendMode
属性有坑,因为底部两个圆环在绘制时的思路是:大圆环绘制到一半时,开始绘制小圆环将其遮盖住,但是小圆环的颜色我们没法设定,因为我们不知道画布是什么颜色的,因此没法用相同的颜色去遮盖住大圆环。这个问题可以通过设置paint
的blendMode
属性为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的点赞效果相关推荐
- 仿抖音点赞效果实现 ——————自定义View
玩过抖音的人应该都知道抖音的点赞效果挺酷炫的,而作为码农我们一定想知道它是怎么实现的.先上效果图: 实现原理非常的简单,直接上代码: /*** Description: 自定义 仿抖音动画类* Dat ...
- 仿Twitter的公告效果
2019独角兽企业重金招聘Python工程师标准>>> <ul id="twitter"> <li>第一条消息</li> &l ...
- pythoni屏幕连点_【Flutter组件】仿抖音双击点赞弹出爱心效果(可连点)
效果 简介 仿抖音点赞手势,单击暂停,双击点赞,可连续点击添加多个爱心,特点如下 全部效果为代码绘制(爱心图标来自Material Icon的图标) 套上在目标Widget外即可使用 提供单击与点赞的 ...
- 【Flutter组件】仿抖音双击点赞弹出爱心效果(可连点)
效果 简介 仿抖音点赞手势,单击暂停,双击点赞,可连续点击添加多个爱心,特点如下 全部效果为代码绘制(爱心图标来自Material Icon的图标) 套上在目标Widget外即可使用 提供单击与点赞的 ...
- 多图弹出最后变成心形html,【Flutter组件】仿抖音双击点赞弹出爱心效果(可连点)...
效果 简介 仿抖音点赞手势,单击暂停,双击点赞,可连续点击添加多个爱心,特点如下 全部效果为代码绘制(爱心图标来自Material Icon的图标) 套上在目标Widget外即可使用 提供单击与点赞的 ...
- Flutter组件:仿抖音双击点赞弹出爱心效果
效果 简介 仿抖音点赞手势,单击暂停,双击点赞,可连续点击添加多个爱心,特点如下 全部效果为代码绘制(爱心图标来自Material Icon的图标) 套上在目标Widget外即可使用 提供单击与点赞的 ...
- 用 Flutter 写一个精美的登录页面(最新版)
用 Flutter 写一个精美的登录页面(最新版) 主体结构 标题 输入框 登录按钮 其他登录方式 注册按钮 完整源码 参考了博客:用flutter写一个精美的登录页面.但是那篇文章是 18 年的,较 ...
- android仿网易云音乐引导页、仿书旗小说Flutter版、ViewPager切换、风扇叶片效果等源码...
2019独角兽企业重金招聘Python工程师标准>>> Android精选源码 复现网易云音乐引导页效果 高仿书旗小说 Flutter版,支持iOS.Android Android ...
- android点赞取消赞功能吗,Android 仿微博的点赞功能的实现原理(持续点赞再取消)...
搜索热词 产品需求,实现类似微博的持续点赞再取消功能,因为自己也偶尔刷微博,对这功能有一定的使用上的了解, 至于微博点赞的具体实现我并不知道,微博点赞在断网的情况下依然能点赞,不会提示网络异常,等有网 ...
最新文章
- python中的format函数_python中的format 函数是什么?如何使用?
- MTK深圳公司嵌入式软件工程师笔试题(含部分答案)
- api权限管理系统与前后端分离实践
- IBM中国开发中心吉燕勇: 通过Cloud Data Services打造新型认知计算数据分析云平台...
- 【洛谷 3372】线段树 1
- IIS 日志文件位置
- [强]VC 6.0 可以这样创建对话框
- 行业看点 | 量子计算时代即将到来?华人科学家揭秘“天使粒子”背后故事……...
- vc中如何将一个工程的资源复制到另外一个工程?
- python32什么意思_“python2”和“python3”有什么区别?
- 为什么南派三叔要封笔?
- 螃蟹学PHP设计模式之访问者模式
- python设计模式-模板方法模式 1
- Rust : AES算法加密、解密
- 基于C语言的基础学习Java
- Laravel 框架 - 模板继承
- 39、VS838红外线接收实验
- Webcontent 和WebRoot的区别
- 网站设计流程分为哪几个步骤
- 计算机流程图设计教程,流程图制作工具分享,在电脑上就可以画图