ConstraintLayout 除了将布局平坦化,提高 UI 性能,还有一个很有用的功能:只用很少的代码就能实现非常酷的动画(要求 API 9 以上)。
代码少到什么程度呢?少到像下面这样,只要 4 行!
1 2 3 4 5
|
val constraintSet = ConstraintSet() constraintSet.clone(context, R.layout.second_keyframe)
TransitionManager.beginDelayedTransition(myView) constraintSet.applyTo(myView)
|
如何用四行代码搞定动画
。
ConstraintLayout 动画的基本用法如下:
1 2 3 4 5
|
val constraintSet = ConstraintSet() constraintSet.clone(context, R.layout.second_keyframe)
TransitionManager.beginDelayedTransition(myView) constraintSet.applyTo(myView)
|
当然,也可以指定自定义的过渡效果。(实际上你不指定过度效果的情况下,系统会使用默认的过渡效果
AutoTransition
)
1 2 3 4 5 6 7 8 9
|
val constraintSet = ConstraintSet() constraintSet.clone(context, R.layout.second_keyframe)
val transition = ChangeBounds() transition.interpolator = AnticipateOvershootInterpolator(1.0f)
TransitionManager.beginDelayedTransition(myView) constraintSet.applyTo(myView)
|
TransitionManager
在 Constrainlayout 中启动了一个延时动画,TransitionManager 在交换两种布局时自动使用动画效果。
ConstraintLayout 动画工作原理
对此有介绍,总结如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
val constraintSetOne = ConstraintSet()
constraintSetOne.clone(constraintLayoutId)
val constraintSetTwo = ConstraintSet()
constraintSetTwo.clone(R.layout.other)
TransitionManager.beginDelayedTransition(constraintView)
constraintSetTwo.applyTo(constraintView)
|
Q: 会有重复代码吗? A: 不会。会自动重用第一个 layout 中的样式,比如字体大小和颜色
Q: 在旧设备上可以运行吗? A: 支持 API 9 以上的设备,对于不支持的设备直接显示第一个 layout,不会有动画效果
Q: 也可以使用 ObjectAnimator 实现相同的动画效果,ConstraintLayout 有什么好处? A: 代码量少,开发效率高,无需手写各种数学计算
注意:ConstraintLayout 动画只对直接子元素起作用
Constraint-Layout-Animations
其中的视差效果非常有意思
creating-awesome-animations-using-constraintlayout
ConstraintSetZone
BasicTransition