无法实现的属性动画怎么办

Android开发艺术探索第七章 关于属性动画的记录

如果想要属性动画生效,必须满足两个条件:

  1. object必须要提供setAbc方法,如果动画的时候没有专递初始值,那么还要提供getAbc方法,因为系统要去取abc属性的值,(如果这条不满足,程序直接crash)。
  2. 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();

你可能感兴趣的:(无法实现的属性动画怎么办)