更多知识,更多乐趣

当前位置:首页软件开发Android → Android 动画之属性动画ObjectAnimator

Android 动画之属性动画ObjectAnimator

时间:2018-04-11 04:09:29来源:互联网我要评论(0)

ObjectAnimator是ValueAnimator的子类,所以ValueAnimator有的方法ObjectAnimator也是可以用的,既然是它的子类,我们就来看下ObjectAnimator新增了一些什么新的方法。

XML中的用法

文件保存路径

res/animator/filename.xml

语法:

<objectAnimator
android: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"]/>123456789

例子

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"/>12345678

代码中的应用

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

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();123

与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();
    }
};123456789101112

上面的代码中,我们实现了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();123

第一个参数传的是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)12345678

这里只介绍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();1234567

- 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)123456

从上面的方法中,我们可以看出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();12345678910111213141516

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


相关文章

网友评论

热门评论

最新评论

发表评论 查看所有评论()

昵称:
表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
字数: 0/500 (您的评论需要经过审核才能显示)

关于万荚 | 联系方式 | 发展历程 | 版权声明 | 帮助(?) | 网站地图 | 友情链接

Copyright 2005-2018 16WJ.COM 〖万荚网〗 版权所有 桂ICP备18000060号 |

声明: 本站所有文章来自互联网 如有异议 请与本站联系