属性动画是android API11之后加入的。其创建过程同样分为代码动态创建跟xml静态创建。
主要有三类:ValueAnimator,ObjectAnimator,AnimatorSet。以动态创建为例,xml中创建跟tween动画类似。(唯一区别是使用AnimatorInflater.loadAnimator()来加载动画,用setTarget(object)来将动画放到对象上)(在实际开发中建议使用代码来动态创建属性动画)
ObjectAnimator.ofFloat(objAnimator,"translationX", objAnimator.getWidth()/3).start();
ValueAnimator colorAnimator=ObjectAnimator.ofInt(valueAnimator,"backgroundColor",0xffff8080,0xff8080ff);
colorAnimator.setDuration(2500);
colorAnimator.setEvaluator(newArgbEvaluator());
colorAnimator.setRepeatCount(ValueAnimator.INFINITE);//动画重复次数
colorAnimator.setRepeatMode(ValueAnimator.REVERSE);
colorAnimator.start();
当然也可以添加对应的属性变化监听:
colorAnimator.addUpdateListener(newAnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimatoranimation) {
int current=(Integer)animation.getAnimatedValue();
}
});
其中current获得的就是动画当前的属性值,可以根据当前属性值对v对象进行相关改变。
AnimatorSet set =new AnimatorSet();
set.playTogether(
ObjectAnimator.ofFloat(animatorSet,"scaleX", 1,1.5f),
ObjectAnimator.ofFloat(animatorSet,"scaleY", 1,1.5f),
ObjectAnimator.ofFloat(animatorSet,"alpha", 1,0.25f,1)
);
set.setDuration(4000).start();
注意,在使用属性动画改编对象的属性时,对象必须提供对应属性的set,get方法。
例如,当要更改button的宽度时一般是这么做:
ObjectAnimator.ofInt(btn,"width", 300).setDuration(4000).start();
只不过上面这段代码不起作用,因为button继承自textview,而textview的setWidth方法不是设置view的宽度。所以上面属性动画无效。
可以更改为如下:
Static class TargetView{
View target;
TargetView(Viewview)
{
target=view;
}
publicint getWidth()
{
returntarget.getLayoutParams().width;
}
publicvoid setWidth(int width)
{
target.getLayoutParams().width=width;
target.requestLayout();
}
}
TargetView targetView =new TargetView(btn);
ObjectAnimator.ofInt(targetView,"width", 300).setDuration(4000).start();
TimeInterpolator时间插值器,linearInterpolator(线性插值器,匀速动画),AccelerateDecelerateInterpolator(加速减速插值器,两头慢中间快),DeceleraterInterpolator(减速插值器)
TypeEvaluator类型估值算法(估值器)有IntEvaluator,FloatEvaluator,ArgbEvaluator。其中动画的默认刷新率为10ms/帧。