我想让按钮在按下按钮的同时将搜索栏的进度缓慢地变回特定值。就像,搜索栏的当前进度是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_DOWN
和MotionEvent.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;
}
});`