一.需求说明
公司新版本的业务需求中,有个交互需要使用动画,就是在TV大屏的界面中, 左右两边各有一列纵向排列水平居中的工具栏按钮,但是两边互斥显示,左边展开时右边收起成单个按钮,右边展开时左边收起成单个按钮,点击单个按钮再展开大致这样.
二.想法
接到这个需求时,因为觉得动画操作的UI元素不多,相对简单,因此想借此机会学习下MotionLayout的动画,毕竟Android官方之前大力介绍的.于是周末花了两天的时间学习了下,还是有一些心得.
三.心得
1
MotionLayout虽然是用于处理动画,但是就像它的名字,它更偏向于处理移位运动的UI元素.如果需要控制的元素仅仅是大小、显隐这些属性的变化,单纯的属性动画就可以,没有必要使用MotionLayout
2
MotionLayout还是在ConstraintLayout动画的基础上,在MotionScene中描述动画开始和结束时的View状态.这在基于XML的View体系下有一个明显的好处就是:动画的丰富处理都在MotionScene中完成,不需要在业务代码逻辑插入动画逻辑处理, 相比属性动画,如果开发人员并没有一个良好的开发习惯,会将属性动画的代码分散到各处,混淆业务逻辑.相比传统anim文件定义又很灵活.
3
MotionLayout的动画目前只能作用于直接子View,如果业务场景适合使用MotionLayout,那动画元素就不能出现布局层级嵌套.这就需要开发人员作出取舍,是为了布局层次清楚的嵌套布局而放弃MotionLayout,还是为了使用MotionLayout快速实现动画效果而牺牲层次清楚的嵌套布局.而这一点也恰恰说明使用MotionLayoutUI元素不能过多
4
对View处理visible和gone不友好,建议使用visible和invisible配合,以及alpha,这一点可以自行实践体会.
5
如果参与动画的元素过多,再配合KeyFrameSet使用时,如果使用不当, 可能会有动画元素闪屏(闪动、闪烁)的问题.