在Android中使用ValueAnimator重置Seekbar

时间:2019-03-20 15:07:50

标签: java android animation

我想让按钮在按下按钮的同时将搜索栏的进度缓慢地变回特定值。就像,搜索栏的当前进度是150,它的标准值为100,我想在按下按钮时将进度减小到100,并在搜索栏上移动1个单位需要0.1秒。 我正在尝试使用ValueAnimator

    main_seekbar_speed_reset.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

             ValueAnimator animator = ValueAnimator.ofInt(main_seekbar_speed.getProgress(), 100);;


            switch(event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    animator = ValueAnimator.ofInt(main_seekbar_speed.getProgress(), 100);
                    animator.setDuration(Math.abs(main_seekbar_speed.getProgress() - 100)*100);
                    animator.start();
                    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                        @Override
                        public void onAnimationUpdate(ValueAnimator valueAnimator) {
                            main_seekbar_speed.setProgress((int)valueAnimator.getAnimatedValue());
                        }
                    });
                    case MotionEvent.ACTION_UP:
                        animator.end();
            }

            return false;
        }
    });

但是此代码会立即将其重置。

编辑

我忘了在每个案例的末尾添加break;。 这意味着switch经历了所有情况,因此animator.end()总是被最后调用,这每次将seekbar的进度设置为最终动画值(100)。 另外,animator.end()表示动画制作者立即结束;它会跳到应该在动画结尾处的最后一个值。

MotionEvent.ACTION_DOWNMotionEvent.ACTION_UP都创建了一个新的ValueAnimator,因此释放按钮不会影响触摸按钮时创建的ValueAnimator。应该在侦听器外部声明它。

所以工作代码:

`

    final ValueAnimator animator = ValueAnimator.ofInt(main_seekbar_speed.getProgress(), 100);
    main_seekbar_speed_reset.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch(event.getAction()) {
                case MotionEvent.ACTION_DOWN:

                    animator.setIntValues(main_seekbar_speed.getProgress(), 100);
                    animator.setDuration(Math.abs(main_seekbar_speed.getProgress() - 100)*100);
                    animator.start();
                    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                        @Override
                        public void onAnimationUpdate(ValueAnimator valueAnimator) {
                            main_seekbar_speed.setProgress((int)valueAnimator.getAnimatedValue());
                        }
                    });
                    break;
                case MotionEvent.ACTION_UP:
                    animator.pause();
                    break;
            }

            return false;
        }
    });`

0 个答案:

没有答案