《Android自定义控件入门与实战》读书笔记--第3章 属性动画

3.1 ValueAnimator 的基本使用

3.1.1 概述

1.视图动画:补间动画、逐帧动画
2.属性动画:ValueAnimator、ObjectAnimator
  1. 不同
类型 引入时间不同 包名 命名不同
视图动画 API 1 android.view.animation XXXAnimation
属性动画 API 11 android.animator XXXAnimator
  1. 视图动画仅能对指定的控件做动画,属性动画是通过改变某一控件的属性值来做动画。

3.1.2 ValueAnimator 的简单使用

  1. 针对值,不会对控件执行任何操作。
ValueAnimator animator =  ValueAnimator.ofInt(0, 400);
animator.setDuration(6000);        
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
         @Override
         public void onAnimationUpdate(ValueAnimator animation) {
              int curValue = (Integer)animation.getAnimatedValue();
          }
      });
animator.start();

3.1.3 常用函数

1.ofInt()ofFloat()
2.getAnimatedValue()
3.setDuration()
4.setRepeatCount()  循环次数
5.setRepeatMode()   
  ValueAnimation.RESTART 正序
  ValueAnimation.REVERSE 倒序
6.cancel() 取消

//两个监听器
7.addUpdateListener()
8.addListener()
//移除
9.removeUpdateListener()
10.removeAllUpdateListeners()

11.removeListener()
12.removeAllListeners()

3.2 自定义插值器与 Evaluator

  1. 当前动画的数值进度
input:当前动画的进度,取值 0-1
getInterpolation:实际进度
class MyInterpolator implements TimeInterpolator{
        @Override
        public float getInterpolation(float input) {
            return 0;
        }
}

3.2.2 Evaluator

  1. 转换器,它能把小数进度转换成对应的数值位置
  2. 根据数值进度计算当前值
public  class MyEvaluator implements TypeEvaluator<Integer>{
        @Override
        public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
            return null;
        }
    }
  1. ArgbEvaluator:颜色值过度

3.3 ValueAnimator 进阶-ofObject

public static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values)

3.4 ObjectAnimator

  1. 继承 ValueAnimator
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values){}
  1. 通过指定属性所对应的 set 函数来做动画
  2. 注意点:
  • 必须存在 set 函数
  • set 函数必须采用驼峰命名

3.4.2 ObjectAnimator 动画原理

  1. ValueAnimator:定义动画区间 -> 插值器(返回当前动画数值进度)-> Evaluator(根据数值进度计算当前值)-> 监听器返回
  2. ObjectAnimator:定义动画对象及区间 -> 插值器(返回当前动画数值进度)-> Evaluator(根据数值进度计算当前值)-> 调用 set 函数(根据属性拼装 set 函数 并反射调用,变将当前值作为参数传入)

3.4.4 何时需要实现对应属性的 get 函数

  1. ofObject 函数而言,不一定存在初始值,要有对应的 get 函数
  2. 动画只有一个过渡值是,系统才会调用对应属性的 get 函数来得到动画的初始值,不存在,会去动画参数类型的默认值作为初始值。

3.5 组合动画-AnimatorSet

3.5.1 playSequentially() 和 playTogther()

  1. 前者表示所有动画依次播放,后者表示所有动画一起播放
  2. 开始动画时,只是把每个空间的动画激活,至于每个控件自身的动画是否延时、是否无限循环,之语空间自身的动画设定有关,与函数本身无关。

3.5.2 AnimatorSet.Builder

AnimatorSet.Builder builder = animator.play(tvAnimator1);
builder.with(tvAnimator2);

1.paly() 先播放那个动画
2.with() 一起播放
3.before() 先执行这个动画,再执行前面的动画
4.after()  先执行前面动画,再执行这个动画
5.after(long delay)  延迟执行

3.5.4 常用函数

1.setTarget() 设置 ObjectAnimator 动画目标控件
2.setStartDelay() 设置延时开始动画时长 不会覆盖单个动画的延时

3.5.5 示例:路径动画

3.6 Animator 动画 XML 实现

1.<animator> 对应 ValueAnimator
2.<objectAnimator> 对应 ObjectAnimator
3.<set> 对应 AnimatorSet
发布了44 篇原创文章 · 获赞 15 · 访问量 4万+

猜你喜欢

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