Android 动画之属性动画ObjectAnimator

来源:互联网 发布:湄公河大案泰国 知乎 编辑:程序博客网 时间:2024/04/30 15:51

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

这里写图片描述

XML中的用法

文件保存路径

res/animator/filename.xml

语法:

<objectAnimatorandroid:propertyName="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

<?xml version="1.0" encoding="utf-8"?><objectAnimator xmlns:android="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更好。

这里写图片描述

代码中动态创建

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<T, Float> property, float… values)

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

Property<TextView, Float> property = new Property<TextView, Float> (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<T, Float> 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<?, Float> property, float... values)ofInt(String propertyName, int... values)ofInt(Property<?, Integer> property, int... values)ofObject(String propertyName, TypeEvaluator evaluator, Object... values)ofObject(Property property, TypeEvaluator<V> 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

0 0
原创粉丝点击