如何使用动画来制作SeekBar动画效果

8

我是新手,对Android不太熟悉。我想尝试为水平SeekBar添加动画效果,但一直没有成功。

我只想要一个动画效果,在一定时间内(比如1分钟),SeekBar就能显示进度。

有人可以给出建议/想法/代码片段吗?应该使用哪种动画,比如ObjectAnimator或ValueAnimator?还需要定义一个run方法来将滑块动画到下一个位置吗?(不确定!)

提前感谢您的帮助。

1个回答

15

其中一种方法是使用ValueAnimator:

final SeekBar seekBar = findViewById(R.id.seekBar);
ValueAnimator anim = ValueAnimator.ofInt(0,seekBar.getMax());
anim.setDuration(1000);
anim.addUpdateListener(new AnimatorUpdateListener() {

        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            int animProgress = (Integer) animation.getAnimatedValue();
            seekBar.setProgress(animProgress);
        }
    });

另一种方法可能是(尚未测试):

final SeekBar seekBar =  findViewById(R.id.seekBar); 
ObjectAnimator anim = ObjectAnimator.ofFloat(seekBar, "progress", 0,seekBar.getMax());
anim.setDuration(10000);
anim.start();

5
尝试使用第二个选项时,在查看日志的视图上无法响应SeekBar,我收到了警告错误“在目标类android.widget.seekbar上找不到类型为float的setProgress()方法。”这是因为当前语法设置的方式 ObjectAnimator 期望SeekBar实例具有 setProgress(float val) 方法,但我猜SeekBar只有一个 setProgress(int val) 方法。要使其工作,请在处理SeekBar时使用 ObjectAnimator.ofInt 而不是 ObjectAnimator.ofFloat - Marquis Blount
@MarquisBlount 哥们,谢谢你,我遇到了一个问题:“在目标类X上找不到类型为float的setProgress()方法。” 你的评论很有帮助 :) - Al-Mothafar
@Al-Mothafar,如果没有看到你的代码,很难给出明确的答案。我不知道你是选择选项1还是选项2。 - Marquis Blount
@MarquisBlount 我尝试了第二个选项,并使用了ofInt方法,像这样:final ObjectAnimator progressBarAnimator = ObjectAnimator.ofInt(this, "animateProgress", start, end),而这是扩展ProgressBar的类。 - Al-Mothafar
@Al-Mothafar,我想我知道这里出了什么问题。简而言之,您的类扩展了ProgressBar,但缺少了“setProgress(int progress)”方法!我认为您需要在扩展ProgressBar的类中覆盖该方法。因此,在setProgress(int progress)的覆盖方法中,您可以只调用super。如果这样行得通,请告诉我,然后我会解释为什么要这样做。 - Marquis Blount
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接