PropertyValuesHolder
不管是ObjectAnimator还是ValueAnimator都有其他的创造实例的函数。
ObjectAnimator
public static ObjectAnimator ofPropertyValuesHolder(Object target, PropertyValuesHolder... values)
ValueAnimator
public static ValueAnimator ofPropertyValuesHolder(PropertyValuesHolder... values)
This class holds information about a property and the values that that property should take on during an animation. PropertyValuesHolder objects can be used to create animations with ValueAnimator or ObjectAnimator that operate on several different properties in parallel.
这个是PropertyValuesHolder的官方说明,简单来说就是保存了动画过程中所需要的值。
这里就以ObjectAnimator来说明,我们在调用ofInt和ofFloat之后,内部也会调用PropertyValuesHolder来帮我们创建动画。
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values) {
ObjectAnimator anim = new ObjectAnimator(target, propertyName);
anim.setFloatValues(values);
return anim;
}
public void setFloatValues(float... values) {
if (values == null || values.length == 0) {
return;
}
if (mValues == null || mValues.length == 0) {
setValues(PropertyValuesHolder.ofFloat("", values));
} else {
PropertyValuesHolder valuesHolder = mValues[0];
valuesHolder.setFloatValues(values);
}
// New property/values/target should cause re-initialization prior to starting
mInitialized = false;
}
具体源码感兴趣可以自己看。
所以我们也可以用PropertyValuesHolder来构造动画
PropertyValuesHolder常用的构造方法
public static PropertyValuesHolder ofInt(String propertyName, int... values)
public static PropertyValuesHolder ofFloat(String propertyName, float... values)
public static PropertyValuesHolder ofObject(String propertyName, TypeEvaluator evaluator,Object... values)
public static PropertyValuesHolder ofKeyframe(String propertyName, Keyframe... values)
这里讲一下最后一个方法ofKeyframe。首先我们需要知道什么是Keyframe,Keyframe就是关键帧的意思,Keyframe也有ofInt,ofFLoat等方法。
public static Keyframe ofInt(float fraction, int value)
ofInt这里有两个参数。
- fraction:动画进度
- value:动画对应的值 例如ofInt(0.25,25)意思就是动画进行到25%的时候,对应的值是25,View中需要set的指是25。 这样的话我们就可以自己手动取控制动画速率等,不用重写插值器和Evaluator。
ViewPropertyAnimator
View新增了一个方法
public ViewPropertyAnimator animate()
可以返回一个ViewPropertyAnimator对象,ViewPropertyAnimator可以直接设置View动画:
将View的透明度设置为0
- view.animate().alpha(0f) 将View在X轴移动50
- view.animate().x(50) 使用该类就会很方便的设置动画。
还有其他常用属性:
ViewGroup动画
1、android:animateLayoutChanges,设置后会对ViewGroup中添加或者删除控件的时候,会有动画,改动画不能自定义。
2、LayoutTransition,可以实现在ViewGroup中动态添加删除其中的控件时指定动画,可以自定义。