如果想同时改变多个属性,一般的思路就是组合动画,AnimatorSet来处理,这里还有一种比较先进点的方式:PropertyValuesHolder 可以将多个属性的改变放在一个容器中,可以理解adapter的ViewHolder;
PropertyValuesHolder是API Level 11 加进来的,根据名称可以判断出某种属性的持有者,使用工厂方法构造PropertyValuesHolder对象,指定属性名和属性值;
//一个动画改变多个属性
//PropertyValuesHolder holder]
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 0, 0.5f*example.getWidth());
PropertyValuesHolder pvhY=PropertyValuesHolder.ofFloat("y",0,example.getHeight());
PropertyValuesHolder ppvhAlpha=PropertyValuesHolder.ofFloat("alpha",1,0);
ObjectAnimator.ofPropertyValuesHolder(example, pvhX,pvhY,ppvhAlpha).setDuration(3000).start();
View的多属性动画的另外一种方式:使用ViewPropertyAnimator
ViewPropertyAnimator是API Level 12引入的,他是用来做针对View对象的多个属性动画功能
(前面的PropertyValuesHolder对象是正对所有对象,范围更广
如果要同时变换一个View的多个属性的话,ViewPropertyAnimator提供了一种更方便和更适合的方案,而且由于多个属性的invalidate方法同意管理,而不是之前的分别调用。所以还有一些性能的变化。注意ViewPropertyAnimator这个泪的对象不是油构造的,而是通过View的animate()方法返回的.
源码:
/**
* This method returns a ViewPropertyAnimator object, which can be used to animate
* specific properties on this View.
*
* @return ViewPropertyAnimator The ViewPropertyAnimator associated with this View.
*/
public ViewPropertyAnimator animate() {
if (mAnimator == null) {
mAnimator = new ViewPropertyAnimator(this);
}
return mAnimator;
}
调用方式:
v.animate().x(0.5f*example.getWidth()).y(example.getHeight()).setDuration(3000).start();
关键帧KeyFrame:
PropertyValuesHolder的工厂方法里面,除了整形ofInt(),浮点型ofFloat类型ofObject()之外,还有一种,ofKeyFrame().
KeyFrame类型对象由一个time/value键值对组成,定义了指定时间点的指定值.
每一个keyFrame还可以拥有自己的interpolator,控制了前一个关键帧到这一个关键帧之间的时间动画行为:
KeyFrame对象的构造也可以是工厂方法:ofInt(),ofFloat(),ofObject()
KeyFrame对象构造完成之后就可以用ofKeyFrame()工厂方法来构造PropertyValuesHolder对象
Keyframe k1=Keyframe.ofFloat(0,0);
k1.setInterpolator(new LinearInterpolator());
Keyframe k2=Keyframe.ofFloat(0.5f,400);
k2.setInterpolator(new BounceInterpolator());
Keyframe k3=Keyframe.ofFloat(1,800);
k3.setInterpolator(new BounceInterpolator());
PropertyValuesHolder holder = PropertyValuesHolder.ofKeyframe("y", k1, k2, k3);
ObjectAnimator.ofPropertyValuesHolder(ball,holder).setDuration(3000).start();