美文网首页
无法实现的属性动画怎么办

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

作者: 离人歌 | 来源:发表于2017-02-20 17:28 被阅读9次

    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();

    相关文章

      网友评论

          本文标题:无法实现的属性动画怎么办

          本文链接:https://www.haomeiwen.com/subject/dreewttx.html