Flutter 来一个笑嘻嘻的动态表情
前言
身在孤岛有很多无奈,比如说程序员属于比较偏门的职业。尤其是早些年,在行业里跳过几次槽后,可能你就已经认识整个圈子的人了😂😂😂。然后,再跳槽很可能就再次“偶遇”前同事了,用大潘的口头语来说就是:“好尴尬呀”。因此, 问起职业,往往只能是回答是搞计算机的。结果可能更尴尬,问的人可能笑嘻嘻地瞅着你,像看怪物一样看着你,接着突然冒出一句灵魂拷问:“我家电脑坏了,你能修不?”不过也不奇怪,那个时候在岛上重装一个 Windows XP 系统都需要 100 大洋。唉,当初后悔没在中关村的鼎好多学习攒机技术……
这个印象太深刻,本篇我们就用动画复现一下这种表情,效果如下图所示。
AnimatedContainer 介绍
在实现之前,先介绍一个新组件 —— AnimatedContainer
。看这个名字就知道和 Container
有关,实际上AnimatedContainer
是 Flutter 中的一个动画容器,Container
有的属性基本上它都有,我们看一下二者的构造方法的区别。
可以看到,实际上 AnimatedContainer
和 Container
只差了 3 个属性,而这三个属性就是控制动画的参数:
curve
:动画曲线,默认是线性;duration
:动效时长参数;onEnd
:动效结束后的回调方法。
AnimatedContainer
的特性是所有涉及外观的属性都会生成一个过渡动效,当这些外观属性发生改变的时候就会使用生成的的动效来完成过渡,从而展现出动画效果。像我们要实现的笑嘻嘻的表情其实就是利用 AnimatedContainer
实现的。关于AnimatedContainer
的使用可以查看官方文档:AnimatedContainer 的使用。
组件结构
我们的笑嘻嘻动效,底部是一个圆形脑袋,上面有两颗眼睛和一个嘴巴,其中眼睛和嘴巴有移动动效,而眼睛的眼珠还有方向的动效。这些动效都可以使用AnimatedContainer
来实现。大的页面结构如下:
细节实现
脑袋这个很容易,直接用原型裁剪,设置尺寸和底色即可:
眼睛左眼和右眼有点不一样,眼球实际就是AnimatedContainer
使用 borderRadius
裁剪为圆形,而眼珠是AnimatedContainer
的子组件 —— 黑色的圆圈。具体实现向左或向右看使用一个变量 seeLeft
控制,而向左向右的转换过渡效果都由 AnimatedContainer
控制。
seeLeft = true
,向左看:眼珠对齐的方式是bottomLeft
,左眼纵向方向上稍微往下移一点;右眼往左移动一定的位置,这样就会有向左看的效果了;seeLeft = false
,向右看:眼珠对齐的方式是bottomRight
,右眼纵向方向上稍微往下移一点;左眼往右移动一定的位置,这样就会有向右看的效果了;
实现代码如下:
这里的眼珠对齐使用的就是AnimatedContainer
的 alignment
参数控制,而眼球的位置使用 Matrix4
的平移实现:
笑脸的实现使用ClipPath
,绘制两条弧线就可以了,然后平移的幅度和眼珠保持一致,就可以感觉是转头的效果了,AnimatedContainer
部分的代码如下:
笑嘻嘻的嘴巴的裁剪类 SmileClipPath
代码如下:
最后,控制状态变量 seeLeft
的变化通过一个按钮点击触发就好了。
最终运行效果如下,完整代码已提交至:动画相关代码。
总结
本篇主要介绍 AnimatedContainer
的使用,对于要对 Container
实现动效的场合,可以直接使用AnimatedContainer
进行替换,然后通过更改AnimatedContainer
的属性就可以实现过渡动效了。比如官网就搞了个随机的形状、弧度和颜色的动效,看着也挺有趣的。
版权声明: 本文为 InfoQ 作者【岛上码农】的原创文章。
原文链接:【http://xie.infoq.cn/article/64890128ee47b97475b88706f】。文章转载请联系作者。
评论