《Android自定义控件入门与实战》读书笔记--第4章 动画进阶

4.1 PropertyValuesHolder 和 Keyframe

4.1.1 PropertyValuesHolder

  1. 保存了动画过程中所需要操作的属性和对应的值
1.ofInt()
2.ofFloat()
3.ofObjec()

4.1.2 Keyframe

  1. 关键帧:控制动画速率,包含:时间点和位置
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();
  1. 在使用 ofObject() 需要调用 frameHolder.setEvaluator 函数设置 Evaluator
  2. 去掉帧
  • 去掉第 0 帧,第一个帧为起始位置
  • 去掉结束帧,最后一个帧为结束位置
  • 至少要有 2 帧

4.2 ViewPropertyAnimator

tv.animate().alpha(0f);
可以设置监听器
tv.animate().alpha(0f).setListener()

4.2.3 性能考量

  1. 没有像 ObjectAnimator 使用反射或 JNI 技术,根据预设的每一个动画帧计算出对应的所有属性值,并且设置给控件,然后调用 invalidate() 重绘。

4.3 为 ViewGroup 内的组件添加动画

  1. 方式
  • 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);
//设置transition
ll.setLayoutTransition(transition);
  1. 设置监听 addTransitionListener()

4.4 开源动画库 NIneOldAndroids

4.4.2 NineOldAndroids 中的 ViewHelper

  1. 判断版本 -> 小于 API 11 时候 会调用 AnimatorProxy 类中的 wrap() 函数对 View 进行包装
发布了44 篇原创文章 · 获赞 15 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_44947117/article/details/104277093