animationseekbar进度

我有一个屏幕有4个search栏(如下图所示)。 如果用户移动B,则C或DI计算三者的平均值,并将A的setProgress设置为平均值。 这是很容易的部分。 我想要做的是使进度条A有一个animation,以便它不会一次性跳跃(例如从25到75)。

什么是build议的方式来animationA? 我得到了一个简单的animation,但我每50ms调用一个TimerTask,以单位值递增或递减A,直到达到所需的位置。 但是效率不高。

注意:我有一个自定义的Seekbar对象,我使用它创build了seekBar的A,B,C和D.对不起,我真的不能分享代码,但很乐意澄清任何事情。

在这里输入图像说明

我猜这太晚了。 但是我find了一个使用ValueAnimator实现这个function的方法。

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); } }); anim.start(); 

这适用于任何Android版本,不使用任何animation。

 private void animateSeek(final SeekBar mSeek, final int toVal) { new Thread(new Runnable() { @Override public void run() { while (true) { if (mSeek.getProgress() == toVal) { break; } int mProgress = mSeek.getProgress(); if (mProgress < toVal) { mProgress++; } else if (mProgress > toVal) { mProgress--; } mSeek.setProgress(mProgress); try { Thread.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } 

如果您使用的是Honeycomb,那么您可以使用ViewPropertyAnimator http://android-developers.blogspot.com/2011/05/introducing-viewpropertyanimator.html

3.0之前的animation是相当有限的,但作为您的方法的替代,您可以使用animation侦听器:

 anim.setAnimationListener(new AnimationListener() { public void onAnimationStart(Animation anim) { //moveseekbar } public void onAnimationRepeat(Animation anim) {} public void onAnimationEnd(Animation anim) { //call animation again if movement not complete } }); 

不要忘记调用setFillAfter(boolean fillAfter),因为animation<3.0并不实际移动视图。 这只是幻想,观点已经转移。 重要的区别,如果你仍然希望seekbar继续接触触摸。

我通过迭代计数器任务而不是单位增量来减less迭代次数。 仍希望更好的答案:-)

我需要的代码就像@sidhanshu_udawat所做的一样。 那是一个很好的基础。 大赢,因为它运行在自己的线程上。 感谢这个例子。

但是,当我拿这个代码并且尝试时,有一个问题是它会增加然后停止。

我改变了代码(粘贴在下面),现在如果你发送你的search栏代码如下,你会看到,seekbaranimation上下的规模。

正在运行 – 从您的活动中控制

另外,我需要停止animation,当有人点击一个button,所以我添加了布尔isRunning作为我的活动成员。 现在当他们点击button时,我将isRunnig设置为false,SeekBar停止。

设置您的SeekBar像下面,然后调用该方法:

 animSeekBar.incrementProgressBy(1); animSeekBar.setMax(100); animateSeek(animSeekBar,100); private void animateSeek(final SeekBar mSeek, final int toVal) { new Thread(new Runnable() { @Override public void run() { boolean isIncrementing = true; int mProgress = 0; isRunning = true; while (isRunning) { if (isIncrementing){ mProgress++; } else{ mProgress--; } mSeek.setProgress(mProgress); if (mProgress >= toVal) { isIncrementing = false; } else if (mProgress <= 0) { isIncrementing = true; } try { Thread.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); }