2011-06-05 56 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(); 
    }