Android 动画之属性动画


属性动画
属性动画在指定时长内改变一个属性的值 (属性指一个对象的一个变量) 可以定义一个属性动画随着时间变化改变一个对象的属性, 不管这个对象是否画到屏幕上。

可以为属性动画设定如下属性:
    1. Duration: 动画的时间, 默认为300ms.
    2. Time interpolation:时间插值函数. (指定属性值变化的快慢)
    3. Repeat count and behavior:重复次数与行为, 可以指定在动画结束时是否要重复执行动画和重复执行的次数. 也可以指定动画按照原来的方式倒着播放, 如果这样设置, 它会先正着播放, 再倒着播放,如此反复到最大播放次数.
    4. Animator sets:动画集合, 可以把一系列动画组成逻辑的集合, 让他们一起播放或者按顺序播放.
    5. Frame refresh delay:刷新的频率, 默认为10ms, 最终的刷新频率依赖与系统当前的负载和系统定时器的精度.

1. 属性动画是怎样工作的
        ValueAnimator对象记录了动画的时间, 比如动画执行多长时间了和被动画的属性的当前值. ValueAnimator封装了一个TimeInterpolator(它定义了动画的插值函数)和一个TypeEvalutor(它定义了怎样计算被做动画的属性)

        为了起动一个动画, 创建一个ValueAnimator并且给出你要做动画的属性的初始值和最终值和动画的时间. 当调用start()时, 动画就开始了. 在整个动画期间, ValueAnimator基于动画的时间和已经流逝的时间来计算流逝分数(介于0和1之间)
        流逝的分数代表了动画已完成部分的时间, 0表示完成0%, 1表示完成100%.

        当ValueAnimator计算完流逝分数时, 它会调用被设置的TimeInterpolator, 去计算一个插值分数. 插值分数把流逝分数和时间插值映射到一个新的分数. 当插值分数计算完了, ValueAnimator会调用合适的TypeEvalutor, 根据插值分数、起始值和最终值计算正在动画的属性的值.

2. 属性动画和视图动画的不同
        1. 视图动画只能给View对象做动画.
            视图动画只能给View对象的一些属性做动画, 如缩放和旋转, 但背景色却不能被做动画.
        2. 视图动画只是改变了视图被绘制的位置, 而不是View对象本身. 比如可以通过视图动画让按钮穿过屏幕,但是响应点击事件的位置却没有改变.
        3. 属性动画能够给任何对象的任何属性做动画, 而且对象本身确实被修改了. 可以指定要做动画的属性, 还可以设置插值函数和各个动画的同步.
        4. 视图动画代码比较简单.

3. 属性动画的API
3.1 Animator
3.1.1 ValueAnimator:属性动画的主要时序引擎, 它也计算被动画的属性的值. 它包含了核心的计算动画的值的功能, 也包括每一个动画的信息如是否重复, 更新事件的监听器和设置计算自定义类型的能力. 为属性做动画有两个要点: 计算被动画属性的值和把这些值设置到被动画的对象上.ValueAnimator不实施第二点, 所以使用者必须自己监听由ValueAnimator计算出来的值并且根据你的逻辑来修改你要做动画的对象.

3.1.2 ObjectAnimator:ValueAnimator的子类, 它允许你设置一个目标对象和属性去做动画. 当这个类计算完一个新值的时候, 它就相更新相应的属性. 这个类在使用时有一些限制, 比如在目标对象中必须有相应的更新属性的方法.

3.1.3 AnimatorSet:提供了把动画组合在一起的机制, 使不同的动画可以以某种关系在一起运行. 可以设置动画一起运行或者顺序运行或者在一个给定延迟后运行.

3.2 Evaluator
    Evaluator告诉属性动画系统怎样计算给定属性的值. 它使用Animator类提供的时序数据, 动画的起始和终止值
    计算被动画的属性的值

    IntEvaluator:计算int属性的默认Evaluator
    FloatEvaluator:计算float属性的默认Evaluator
    ArgbEvaluator:计算颜色属性的默认Evaluator
    TypeEvaluator:如果要做动画的属性非上述三个, 或者想改变上述三个属性的默认行为, 可以实现这个接口.

3.3 Interpolator
    时间插值器定义了动画中的特定值(做为时间的函数)是怎样计算出来的.
    AccelerateDecelerateInterpolator
    AccelerateInterpolator
    AnticipateInterpolator
    AnticipateOvershootInterpolator
    BounceInterpolator
    CycleInterpolator
    DecelerateInterpolator
    LinearInterpolator
    OvershootInterpolator:

    TimeInterpolator:一个可以实现自定义插值器的接口

4. 指定KeyFrame(关键帧)
  一个KeyFrame对象由一个时间/值对组成, 可以用它定义一个动画在一个特定时间的状态. 每一个KeyFrame可以指定它自己的插值器, 用于控制上一个关键帧和当前关键帧中间这段时间的行为.

5. 给View做动画
  属性动画系统比视图动画系统多了一些优点. 视图动画系统只是改变View的绘制方式, 但并不改变View本身. 如点击事件的响应的位置不会因为绘制的位置不同而改变. 属性动画可以通过改变View对象的真实属性做动画. 然后View自动调用它的invalidate()方法刷新屏幕.
  View中可以做属性动画的属性有
  translationX和translationY:控制View的位置
  rotation, rotationX, rotationY:控制在2D和3D坐标系中相对于坐标原点的旋转.
  scaleX, scaleY:控制一个View对象相对于坐标原点的缩放.
  pivotX, pivotY:View对象进行旋转和缩放所发生的点的位置, 默认为View对象的中心.
  x, y:描述View在其容器中的最终位置.
  alpha:View的透明度.

5.1 使用ViewPropertyAnimator做动画
      ViewPropertyAnimator可以给几个属性做并行动画处理, 它的行为和ObjectAnimator很像,但是做多属性的动画时会更加高效.
      PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 50f);
      PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("y", 100f);
      ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvyY).start();

5.2 在XML中声明动画
      为了区分新的属性动画API, 应该把属性动画的xml文件放在res/animator中而不是res/anim.
      xml中支持如下三个标签
      ValueAnimator - <animator>
      ObjectAnimator - <objectAnimator>
      AnimatorSet - <set>

<set Android:ordering="sequentially">
    <set>
        <objectAnimator
            android:propertyName="x"
            android:duration="500"
            android:valueTo="400"
            android:valueType="intType"/>
        <objectAnimator
            android:propertyName="y"
            android:duration="500"
            android:valueTo="300"
            android:valueType="intType"/>
    </set>
    <objectAnimator
        android:propertyName="alpha"
        android:duration="500"
        android:valueTo="1f"/>
</set>

 

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
    R.anim.property_animator);
set.setTarget(myObject);
set.start();

相关内容