Property Animation Part III(属性动画 第三部分)

如何使用TypeEvaluator

如果你想实现一个安卓系统中没有的动画类型,,你可以通过实现TypeEvaluator接口创建自己的计算实现。在Android系统已实现的类型有int(IntEvaluator),float(FloatEvaluator),或颜色(ArgbEvaluator)。

TypeEvaluator接口中只有一个evaluate()方法需要实现。这个方法会在动画的当前点返回对应的属性值。 下面是FloatEvaluator类的实现代码

{public Object evaluate(float fraction, Object startValue, Object endValue) {float startFloat = ((Number) startValue).floatValue();return startFloat + fraction * (((Number) endValue).floatValue() – startFloat);}}

注意:当ValueAnimator(或ObjectAnimator)运行时,它会根据interpolator类计算当前运行部分的动画的数值(0和1之间),然后计算出具体是哪类插值。插值百分比就是TypeEvaluator接收的部分参数,所以当计算动画部分时,无需再考虑interpolator。

如何使用Interpolators

Interpolators定义了一个动画过程中的指定值的计算结果。例如,你可以指定在整个动画过程中线性发生动画,即动画在整个时间内均匀地移动,或者你可以指定在整个动画过程中发生非线性发生动画,比如,在动画的开头或结尾加速或减速。

在整个动画系统中Interpolators会得到已经执行的动画百分比。Interpolators会修改这个百分比以符合它所定义的动画类型。Android系统在android.view.animation包中提供一组通用的Interpolators实现。如果这些都不符合你的需要,你可以实现 TimeInterpolator接口来创建一个。

下面两个例子展示了AccelerateDecelerateInterpolator 和LinearInterpolator 是如何计算这个百分比数值的。

AccelerateDecelerateInterpolator

public float getInterpolation(float input) {return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;}

LinearInterpolator

(float input) {return input;}

下表是根据这些计算得来的在1000毫秒内的数据:

经过时间(ms) 线性(LinearInterpolator) 非线性(AccelerateDecelerateInterpolator)

0 0 0

200 .2 .1

400 .4 .345

600 .6 .8

800 .8 .9

1000 1 1

如表所示,该LinearInterpolator变化值,以相同的速度,200ms经过0.2。AccelerateDecelerateInterpolator同前面相比在200ms到600ms之间速度较快、600ms到1000ms之间速度较慢。

如何指定关键帧

一个关键帧的对象由时间/值对组成,你可以在一个动画的具体时间定义一个特定的状态。每个关键帧也可以有自己的Interpolators控制在一上个关键帧和当前关键帧时间的动画行为。

为了实例化一个关键帧的对象,你必须使用ofint(),offloat() ofobject()这三个工厂方法之一,来对应关键帧的类型。然后调用ofkeyframe()工厂方法来获得一个PropertyValuesHolder对象。一旦你有了以上两个对象,你就可以使用它们来实现一个动画效果。示例代码如下所示

Keyframe kf0 = Keyframe.ofFloat(0f, 0f);Keyframe kf1 = Keyframe.ofFloat(.5f, 360f);Keyframe kf2 = Keyframe.ofFloat(1f, 0f);PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe(“rotation”, kf0, kf1, kf2);ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(target, pvhRotation)rotationAnim.setDuration(5000ms);如何对View对象添加属性动画

属性动画系统在对view添加的动画是流畅的。视图动画系统转化的视图对象的改变仅仅是基于视图的绘制。因为视图本身没有绘制的功能,这种绘制由每个视图的容器来处理。这导致在视图动起来的同时,视图对象本身没有变化。即使绘制的位置已经同原来位置有所不同。在Android 3.0以后,可以使用属性动画和添加对应的setter和getter方法来解决这个问题。

属性动画系统可以将屏幕上的视图通过改变该对象的实际属性使之动起来。此外,当View对象的属性发生改变时,它也会自动调用invalidate()方法刷新屏幕。新特性下视图中的支持动画的属性有:

想针对View的某个属性添加动画,比如如颜色或rotation,你只需要创建一个属性动画来指定视图的属性,例如:

ObjectAnimator.ofFloat(myView, “rotation”, 0f, 360f);如何使用ViewPropertyAnimator

ViewPropertyAnimator的提供了一个简单的方法来同时对一个对象的一些属性进行修改。它的所做的就像一个ObjectAnimator,因为它修改View的属性的实际值,但当同时修改多个属性时会更有效。此外,使用ViewPropertyAnimator代码更简洁也更容易阅读。下面的代码片段展示了在使用多个ObjectAnimator对象的不同,一个ObjectAnimator对象,以及ViewPropertyAnimator对视图的x、y属性进行修改时候的区别

多个ObjectAnimator

ObjectAnimator animX = ObjectAnimator.ofFloat(myView, “x”, 50f);ObjectAnimator animY = ObjectAnimator.ofFloat(myView, “y”, 100f);AnimatorSet animSetXY = new AnimatorSet();animSetXY.playTogether(animX, animY);animSetXY.start();

一个ObjectAnimator

PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat(“x”, 50f);PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat(“y”, 100f);ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvyY).start();

ViewPropertyAnimator

myView.animate().x(50f).y(100f);如果在XMl中定义属性动画

属性动画系统允许通过XML定义动画来替代编码。通过在XML中定义你的动画,你可以很容易地在多个页面和动画队列中重用你的动画。

上帝从不埋怨人们的愚昧,人们却埋怨上帝的不公平

Property Animation Part III(属性动画 第三部分)

相关文章:

你感兴趣的文章:

标签云: