4.1 PropertyValuesHolder 和 Keyframe
4.1.1 PropertyValuesHolder
- 保存了动画过程中所需要操作的属性和对应的值
1.ofInt()
2.ofFloat()
3.ofObjec()
4.1.2 Keyframe
- 关键帧:控制动画速率,包含:时间点和位置
Keyframe frame0 = Keyframe.ofFloat(0f,0);
Keyframe frame2 = Keyframe.ofFloat(0.1f,-20f);
Keyframe frame2 = Keyframe.ofFloat(1f,0);
PropertyValuesHolder frameHolder = PropertyValuesHolder.ofKeyframe("rotation",frame0,frame1,frame2);
ObjectAnimator.ofPropertyValueHolder(iv,frameHolder).start();
- 在使用 ofObject() 需要调用 frameHolder.setEvaluator 函数设置 Evaluator
- 去掉帧
- 去掉第 0 帧,第一个帧为起始位置
- 去掉结束帧,最后一个帧为结束位置
- 至少要有 2 帧
4.2 ViewPropertyAnimator
tv.animate().alpha(0f);
可以设置监听器
tv.animate().alpha(0f).setListener()
4.2.3 性能考量
- 没有像 ObjectAnimator 使用反射或 JNI 技术,根据预设的每一个动画帧计算出对应的所有属性值,并且设置给控件,然后调用 invalidate() 重绘。
4.3 为 ViewGroup 内的组件添加动画
- 方式
- layoutAnimation 标签与 LayoutAnimationController
- gridlayoutAnimation 标签与 GridlayoutAnimationController
- android:animatelayoutChanges=“true” 属’性
- LayoutTransition(可以实现 ViewGroup 动态添加或删除其中的控件时指定动画)
4.3.2 LayoutTransition
LayoutTransition transition = new LayoutTransition();
ObjectAnimator rotation = ObjectAnimator.ofFloat(null, "rotation", 0f, 90f, 0f);
transition.setAnimator(LayoutTransition.DISAPPEARING,rotation);
ll.setLayoutTransition(transition);
- 设置监听 addTransitionListener()
4.4 开源动画库 NIneOldAndroids
4.4.2 NineOldAndroids 中的 ViewHelper
- 判断版本 -> 小于 API 11 时候 会调用 AnimatorProxy 类中的 wrap() 函数对 View 进行包装