Android 动画之属性动画ObjectAnimator

Android 动画之布局动画相关文章
Android 动画之视图动画
Android 动画之插值器
Android 动画之属性动画ValueAnimator
Android 动画之属性动画ObjectAnimator
Android 动画之集合动画AnimatorSet
Android 动画之布局动画
上一篇文章讲了ValueAnimator,本文接下来要讲解就是ObjectAnimator,其实ObjectAnimator是ValueAnimator的子类,所以ValueAnimator有的方法ObjectAnimator也是可以用的,既然是它的子类,我们就来看下ObjectAnimator新增了一些什么新的方法。

XML中的用法

文件保存路径

res/animator/filename.xml

语法:

"string"
android:duration="int"
android:valueFrom="float | int | color"
android:valueTo="float | int | color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["repeat" | "reverse"]
android:valueType=["intType" | "floatType"]/>

例子

res/animator/objectanimator.xml

"1.0" encoding="utf-8"?>
"http://schemas.android.com/apk/res/android"
    android:propertyName="translationX"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:duration="3000"
    android:valueType="floatType"
    android:valueFrom="300"
    android:valueTo="-300"/>

代码中的应用

ObjectAnimator xmlAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this, R.animator.objectanimator);
xmlAnimator.setTarget(textView);
xmlAnimator.start();

ObjectAnimator比ValueAnimator多了一个setTarget的方法,ObjectAnimator直接使用要修改属性值的对象,不像ValueAnimator是通过监听数值变化,再做相应的处理。在代码简洁性上来说,ObjectAnimator比ValueAnimator更好。

Android 动画之属性动画ObjectAnimator_第1张图片

代码中动态创建

ObjectAnimator提供了3中不同的实现方式,下面我们将一一讲解,对于其不同类型的数值变化,就不过多介绍了,下面来看,分别是那三种实现方式:

1. ofFloat(Object target, String propertyName, float… values)

ObjectAnimator translationxanimator = ObjectAnimator.ofFloat(textView, "TranslationX", 300, -100);
translationxanimator.setDuration(3*1000);
translationxanimator.start();

与ValueAnimator相比ObjectAnimator多了两个参数,分别为Object target和String propertyName,第一个参数表示的是将要改变属性的对象,第二个参数表示要改变的是哪个属性,通过上面代码我们知道,第二个参数我们传的是TranslationX,而TextView对应的方法是setTranslationX,所以从这里可以看出来,我们要改变某个属性值时,只要将setXXX后面的XXX作为String传给第二个参数就好了,当然第一个X没有大小区分也就是说可以是xXX。

2. ofFloat(T target, Property property, float… values)

这个方法与第一个方法不同的地方是需要实现Property

Property property = new Property (Float.class, "rotation") {

    @Override
    public void set(TextView object, Float value) {
        object.setRotation(value.floatValue());
    }

    @Override
    public Float get(TextView object) {
        return object.getRotation();
    }
};

上面的代码中,我们实现了Property,从中可以看出将要修改的对象为TextView,属性为rotatiion,属性值的参数为float类型,其中实现了set和get方法,分别对TextView的对象做了setRotation和getRotation的调用。
Property实现后就可以使用ObjectAnimator.ofFloat(T target, Property property, float… values)来现实相关动画啦,上代码。

ObjectAnimator propertyAnimator = ObjectAnimator.ofFloat(textView, property, 90, 360, 180, 0);
propertyAnimator.setDuration(3*1000);
propertyAnimator.start();

第一个参数传的是TextView的对象,第二个就是实现的Property对象,后面的参数就是将要变化的值。看ObjectAnimator的动画实现,代码量还是非常简洁的。

3. ofPropertyValuesHolder(Object target, PropertyValuesHolder… values)

ofPropertyValuesHolder的调用不同之处就第二个参数了PropertyValuesHolder,PropertyValuesHolder我们先来看下它提供那些方法。

ofFloat(String propertyName, float... values)
ofFloat(Property property, float... values)
ofInt(String propertyName, int... values)
ofInt(Property property, int... values)
ofObject(String propertyName, TypeEvaluator evaluator, Object... values)
ofObject(Property property, TypeEvaluator evaluator, V... values)
ofKeyframe(String propertyName, Keyframe... values)
ofKeyframe(Property property, Keyframe... values)

这里只介绍ofFloat(String propertyName, float… values)和ofKeyframe(String propertyName, Keyframe… values)的用法,其他使用大同小异,ofObjcet的使用就是需要实现自定义的TypeEvaluator,这个在ValueAnimator中讲解过就不多说了。

- PropertyValuesHolder.ofFloat(String propertyName, float… values)

通过其参数,我们可以看出它和ObjectAnimator的方式差不多,只是少了一个object对象,也就是说PropertyValuesHolder只指定了要变化的属性,但没有指定那个对象要做相应的属性变化。而ObjectAnimator.ofPropertyValuesHolder(Object target, PropertyValuesHolder… values)可以传入多个PropertyValuesHolder对象,也就是说我们可以用ObjectAnimator.ofPropertyValuesHolder实现多个属性同时改变。代码如下:

PropertyValuesHolder valuesHodlerA = PropertyValuesHolder.ofFloat("scaleX", 0.0f, 1.5f, 1.0f);
PropertyValuesHolder valuesHodlerB = PropertyValuesHolder.ofInt("BackgroundColor", 0xffff0000, 0x9900ff33, 0xff8800ff);
PropertyValuesHolder valuesHodlerC = PropertyValuesHolder.ofFloat("rotation", 0, 270, 0);
valuesHodlerB.setEvaluator(new ArgbEvaluator());
ObjectAnimator valuesHolder = ObjectAnimator.ofPropertyValuesHolder(textView, valuesHodlerA, valuesHodlerB, valuesHodlerC);
valuesHolder.setDuration(3*1000);
valuesHolder.start();

- PropertyValuesHolder.ofKeyframe(String propertyName, Keyframe… values)

keyframe顾名思义就是关键帧的意思(纯属个人理解),要使用ofKeyframe,我们就得先学会使用Keyframe,先来看下Keyframe提供的方法:

ofInt(float fraction, int value)
ofInt(float fraction)
ofFloat(float fraction, float value)
ofFloat(float fraction)
ofObject(float fraction, Object value)
ofObject(float fraction)

从上面的方法中,我们可以看出Keyframe提供的就是哪个fraction时,其对应的值是多少。既然这样,我们就直接上代码了,有一点还需要强调的就是fraction为0时表示开始,fraction为1时表示结束。

Keyframe keyframeA = Keyframe.ofFloat(0.0f, 1);
Keyframe keyframeB = Keyframe.ofFloat(0.1f, 0);
Keyframe keyframeC = Keyframe.ofFloat(0.2f, 1);
Keyframe keyframeD = Keyframe.ofFloat(0.3f, 0);
Keyframe keyframeE = Keyframe.ofFloat(0.4f, 1);
Keyframe keyframeF = Keyframe.ofFloat(0.5f, 0);
Keyframe keyframeG = Keyframe.ofFloat(0.6f, 1);
Keyframe keyframeH = Keyframe.ofFloat(0.7f, 0);
Keyframe keyframeI = Keyframe.ofFloat(0.8f, 1);
Keyframe keyframeJ = Keyframe.ofFloat(0.9f, 0);
Keyframe keyframeK = Keyframe.ofFloat(1.0f, 1);

PropertyValuesHolder keyframeHodler = PropertyValuesHolder.ofKeyframe("alpha", keyframeA, keyframeB, keyframeC, keyframeD, keyframeE, keyframeF, keyframeG, keyframeH, keyframeI, keyframeJ, keyframeK);
ObjectAnimator keyframeAnimator = ObjectAnimator.ofPropertyValuesHolder(textView, keyframeHodler);
keyframeAnimator.setDuration(3*1000);
keyframeAnimator.start();

这里实现的效果就是textview的透明度不断变化,实现一闪一闪的效果。
**强调一下ObjectAnimator.ofPropertyValuesHolder方法中的PropertyValuesHolder参数当传入多个对象时,它的动画效果是同时执行的,而不是依次执行。并且查看源码知道ObjectAnimator的ofInt,ofFloat,ofObject最终都是通过设置PropertyValuesHolder属性实现的,只不过它们只设置了一个PropertyValuesHolder属性。
**

源代码

参考文章

Animation Resources
自定义控件三部曲之动画篇(七)——ObjectAnimator基本使用
自定义控件三部曲之动画篇(八)——PropertyValuesHolder与Keyframe

你可能感兴趣的:(android,animation)