Android开发艺术探索第七章 关于属性动画的记录
如果想要属性动画生效,必须满足两个条件:
- object必须要提供setAbc方法,如果动画的时候没有专递初始值,那么还要提供getAbc方法,因为系统要去取abc属性的值,(如果这条不满足,程序直接crash)。
- object的setAbc对属性abc所做的改变必须能够通过某种方法反应出来,比如会带来UI的改变,(如果这条不满足,无效果但不会crash)。
针对上述问题,官方提供的解决方法:
1.给你的对象加上get 和 set方法,如果你有权限的话。
2.采用一个类来包装原始对象,间接为其提供get和set方法
3.采用ValueAnimator,监听动画过程,自己实现属性的改变。
第一点,很难改变官方控件
第二点,如下
{
...
Button button = (Button) findViewById(R.id.btn);
ViewWrapper viewWrapper = new ViewWrapper(button);
ObjectAnimator translationY = ObjectAnimator.ofInt(viewWrapper, "width", viewWrapper.getWidth(), 500);
translationY.setStartDelay(2000);
translationY.setDuration(3000);
translationY.start();
}
public class ViewWrapper{
private View mView;
public ViewWrapper(){
}
public ViewWrapper(View view){
this.mView = view;
}
public int getWidth(){
return mView.getLayoutParams().width;
}
public void setWidth(int width){
mView.getLayoutParams().width = width;
mView.requestLayout();
}
}
第三点:
final Button button = (Button) findViewById(R.id.btn);
final int width = button.getLayoutParams().width;
//来一个估值算法
final IntEvaluator intEvaluator = new IntEvaluator();
//为了获取一个标准的百分比,将1,增加到100
ValueAnimator valueAnimator = ObjectAnimator.ofInt(1,100);
//添加监听
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//获取当前进度 占动画总进度的比例
float fraction = animation.getAnimatedFraction();
//通过比例估算宽度,再设置给button
button.getLayoutParams().width = intEvaluator.evaluate(fraction,width,500);
button.requestLayout();
}
});
valueAnimator.setStartDelay(2000);
valueAnimator.setDuration(5000).start();
网友评论