2011-06-05 133 views
10

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

什么是动画A的推荐方法?我得到了一个简单的动画,但我每50ms调用一次TimerTask,以单位值递增或递减A,直到达到所需的位置。但它效率不高。

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

enter image description here

+0

最重要的问题是哪些事件您更新seekbars?我有一个类似的情况(3条0-100),所有三条一起应该总是100 ...作品没有“跳跃”对我来说......那么A会更新哪个事件? – WarrenFaith 2011-06-05 16:47:17

+0

无论B,C还是D改变,我都重新计算3的平均值并将其设置为A的值。这仅在用户只需点击3个seekBars而不是在持续改变时完成。 – 2011-06-05 17:17:49

+0

啊好吧,现在我明白了... – WarrenFaith 2011-06-05 17:51:26

回答

0

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

0

如果您正在使用蜂窝那么你可以使用ViewPropertyAnimator http://android-developers.blogspot.com/2011/05/introducing-viewpropertyanimator.html

3.0之前的动画是相当有限的,但作为一种替代你的方法,你可以使用一个动画监听器:

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) ,因为动画< 3.0没有执行移动视图。它只是让人觉得这个观点已经发生了变化。重要的区别是,如果您仍然希望seekbar继续接收触摸。

+0

我没有使用3.0 :-( – 2011-06-05 16:40:03

+0

我将在这里使用哪个动画? – 2011-06-08 11:36:04

9

我想它为时已晚。但是我找到了一种使用ValueAnimator实现此功能的方法。

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

这在Android API级别低于11时不起作用。 – 2015-01-16 20:22:01

+0

为什么不使用ObjectAnimator? – acntwww 2015-05-04 14:58:59

1

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

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

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

但是,当我拿着该代码并尝试它时,出现了一个问题,它会增加然后停止。

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

isRunning - 控制从活动

而且,我需要停止动画当有人点击一个按钮,所以我增加了布尔isRunning作为我的活动成员。现在,当他们点击按钮时,我将isRunnig设置为false,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(); 
    }