属性动画详解之ObjectAnimator、ValueAnimator、PropertyValuesHolder、Keyframe 之间关系

来源:互联网 发布:php常用的系统函数 编辑:程序博客网 时间:2024/05/17 14:25

说太多不容易理解,就直接上代码了,下面是用基于属性动画不同的方式实现同一种动画效果

ObjectAnimator

    ObjectAnimator.ofFloat(example, "rotationX", 0, 360).setDuration(3000).start();    ObjectAnimator.ofFloat(example, "rotationY", 0, 360).setDuration(3000).start();

ValueAnimator

   ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 360);   valueAnimator.setDuration(3000);   valueAnimator.setTarget(example);   valueAnimator.addUpdateListener(   new ValueAnimator.AnimatorUpdateListener() {   public void onAnimationUpdate(                           ValueAnimator animation) {                 float value = (float) animation.getAnimatedValue();                  example.setRotationX(value);                    }                });    valueAnimator.start();

PropertyValuesHolder

PropertyValuesHolder propertyValuesHolderX =      PropertyValuesHolder.ofFloat("rotationX", 0, 360);PropertyValuesHolder propertyValuesHolderY =     PropertyValuesHolder.ofFloat("rotationY", 0, 360);ObjectAnimator.ofPropertyValuesHolder(example,propertyValuesHolderX, propertyValuesHolderY).setDuration(3000).start();

Keyframe

 // Keyframe 可以对每一个时间段设置插值器 Keyframe keyframe = Keyframe.ofFloat(0, 0);          keyframe.setInterpolator(new LinearInterpolator()); Keyframe keyframe1 = keyframe.ofFloat(0.5f, 180);          keyframe1.setInterpolator(new OvershootInterpolator()); Keyframe keyframe2 = keyframe.ofFloat(1, 360);          keyframe2.setInterpolator(new BounceInterpolator());PropertyValuesHolder propertyValuesHolder =PropertyValuesHolder.ofKeyframe("rotationX", keyframe,                                           keyframe1, keyframe2);Keyframe keyframe3 = Keyframe.ofFloat(0, 0);         keyframe3.setInterpolator(new LinearInterpolator());Keyframe keyframe4 = keyframe.ofFloat(0.5f, 180);         keyframe4.setInterpolator(new OvershootInterpolator());Keyframe keyframe5 = keyframe.ofFloat(1, 360);         keyframe5.setInterpolator(new BounceInterpolator());PropertyValuesHolder propertyValuesHolder1 = PropertyValuesHolder.ofKeyframe("rotationY", keyframe, keyframe1, keyframe2);ObjectAnimator.ofPropertyValuesHolder(example, propertyValuesHolder, propertyValuesHolder1).setDuration(3000).start();

ObjectAnimator: 
      动画生成的原理就是通过差值器计算出来的一定规律变化的数值作用到对象上来实现对象效果的变化,因此我们可以使用ObjectAnimator来生成这些数,然后在动画重绘的监听中,完成自己的效果。

应用: 动画更新的过程中会不断更新该属性,所以对象必须提供该属性的处理方法  (getXXX,setXXX)

ValueAnimator: 
      ValueAnimator是计算动画过程中变化的值,包含动画的开始值,结束值,持续时间等属性。但并没有把这些计算出来的值应用到具体的对象上面,所以也不会有什么的动画显示出来。要把计算出来的值应用到对象上,必须为ValueAnimator注册一个监听器ValueAnimator.AnimatorUpdateListener,该监听器负责更新对象的属性值。在实现这个监听器的时候,可以通过getAnimatedValue()的方法来获取当前帧的值。

应用:对象没有提供属性的getset处理方法时,可以使用ValueAnimator配合AnimatorUpdateListener实现

Keyframe: 
      Keyframe是一个时间/值对,用于定义在某个时刻动画的状态。比如Keyframe.ofInt(.5f, Color.RED)定义了当动画进行了50%的时候,颜色的值应该是Color.RED。

应用:通过它可以定义一个在特定时间的特定状态,而且在两个keyFrame之间可以定义不同的Interpolator,就相当多个动画的拼接,第一个动画的结束点是第二个动画的开始点。巧妙使用可实现强大的动画效果

PropertyValuesHolder:
   PropertyValuesHolder保存了view的属性的信息以及在动画进行过程中该属性的值。通过 PropertyValuesHolder.ofKeyframe方法来构建PropertyValuesHolder的实例,改方法接收一个属性名以及 多个Keyframe对象作为参数。当你想通过动画改变多个属性的时候PropertyValuesHolder就非常有用

应用:如果需要对一个View的多个属性进行动画可以用ViewPropertyAnimator类,该类对多属性动画进行了优化,会合并一些invalidate()来减少刷新视图
0 0
原创粉丝点击