(内容来源于Android开发艺术探索)
一 理解插值器和估值器
1.插值器TimeInterpolator:根据时间流失的百分比计算出当前属性值改变的百分比。
2.估值器 TypeEvaluator:根据当前属性值改变的百分比,计算出改变后的属性值
它们是实现非匀速动画的重要手段。自定义1需要实现Interpolator或者TimeInterpolator。自定义2需要实现TypeEvaluator。
二丶对任意View的属性做动画。
对任意控件的某一属性做动画是有条件的。
1.首先该控件的该属性 需要有get set方法。因为属性动画会根据外界传入的值,不断的调用它的set方法,重新设置新的值,使其逐渐靠近目标值。
2.通过该属性设对UI进行改变能有直观的效果。例如,改变宽高,位置。
注意:以上两个条件缺一不可。
当该属性没有get,set方法时,可以采用两种方式:
1.用一个类包装该View
private class ViewWrapper{
private View mTarget;
public ViewWrapper(View mTarget){
this.mTarget=mTarget;
}
//有价值的任意属性
public int getWidth(){
return mTarget.getLayoutParams().width;
}
public void setWidth(int width){
mTarget.getLayoutParams().width=width;
mTarget.requestLayout();
}
}
ViewWrapper target=new ViewWrapper(mButton);
ObjectAnimation.ofInt(target,"width",500)...
2.采用属性动画监听
private void domyAnimation(final View target,final int startInt,final int endInt){
ValueAnimator valueAnimator=ValueAnimator.ofInt(1, 100);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
//根据估值器计算出 改变后属性
private IntEvaluator intEvaluator=new IntEvaluator();
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//获得当前的进度值
int currentValue= (Integer) animation.getAnimatedValue();
//得到当前进度在整个动画中的比例
float fraction=animation.getAnimatedFraction();
//根据该比例改变view的某个属性
target.getLayoutParams().width=intEvaluator.evaluate(fraction,startInt,endInt);
target.requestLayout();
}
});
valueAnimator.setDuration(500).start();
}
mButton.onClickListener(..){
domyAnimation(targetView,100,200);
}
未完待续