Android 动画之布局动画相关文章
Android 动画之视图动画
Android 动画之插值器
Android 动画之属性动画ValueAnimator
Android 动画之属性动画ObjectAnimator
Android 动画之集合动画AnimatorSet
Android 动画之布局动画
上一篇文章讲了ValueAnimator,本文接下来要讲解就是ObjectAnimator,其实ObjectAnimator是ValueAnimator的子类,所以ValueAnimator有的方法ObjectAnimator也是可以用的,既然是它的子类,我们就来看下ObjectAnimator新增了一些什么新的方法。
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更好。
ObjectAnimator提供了3中不同的实现方式,下面我们将一一讲解,对于其不同类型的数值变化,就不过多介绍了,下面来看,分别是那三种实现方式:
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。
这个方法与第一个方法不同的地方是需要实现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
ObjectAnimator propertyAnimator = ObjectAnimator.ofFloat(textView, property, 90, 360, 180, 0);
propertyAnimator.setDuration(3*1000);
propertyAnimator.start();
第一个参数传的是TextView的对象,第二个就是实现的Property对象,后面的参数就是将要变化的值。看ObjectAnimator的动画实现,代码量还是非常简洁的。
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 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中讲解过就不多说了。
通过其参数,我们可以看出它和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();
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