Android 动画之属性动画ObjectAnimator

Android 动画之布局动画相关文章
Android 动画之视图动画
Android 动画之插值器
Android 动画之属性动画ValueAnimator
Android 动画之属性动画ObjectAnimator
Android 动画之集合动画AnimatorSet
Android 动画之布局动画
上一篇文章讲了ValueAnimator,本文接下来要讲解就是ObjectAnimator,其实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"]/>

例子

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值