2017-05-09 58 views
-2

是否有可能創建一個進度條,可以根據歌曲開始播放的時間以及歌曲的時間長短來爲歌曲的剩餘時間製作動畫效果?只用時間戳創建進度條?

例如,一個收集時間播放的int開始,並且再次比較ms的長度?

我理解這個概念,但不能完全包裝如何在我的腦海中做到這一點!

編輯:爲了澄清,我可以得到剩餘時間和時間的整數,但我不知道如何將它們組合成一個動畫條,然後以XML顯示它。

回答

0

創建自定義animatedProgressBar

public class AnimateProgressBar extends ProgressBar { 

    private static final Interpolator DEFAULT_INTERPOLATER = new AccelerateDecelerateInterpolator(); 

    private ValueAnimator animator; 
    private ValueAnimator animatorSecondary; 
    private boolean animate = true; 

    public AnimateProgressBar(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public AnimateProgressBar(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public AnimateProgressBar(Context context) { 
     super(context); 
    } 

    public boolean isAnimate() { 
     return animate; 
    } 

    public void setAnimate(boolean animate) { 
     this.animate = animate; 
    } 

    @Override 
    public synchronized void setProgress(int progress) { 
     if (!animate) { 
      super.setProgress(progress); 
      return; 
     } 
     if (animator != null) 
      animator.cancel(); 
     if (animator == null) { 
      animator = ValueAnimator.ofInt(getProgress(), progress); 
      animator.setInterpolator(DEFAULT_INTERPOLATER); 
      animator.addUpdateListener(new AnimatorUpdateListener() { 
       @Override 
       public void onAnimationUpdate(ValueAnimator animation) { 
        AnimateProgressBar.super.setProgress((Integer) animation.getAnimatedValue()); 
       } 
      }); 
     } else 
      animator.setIntValues(getProgress(), progress); 
     animator.start(); 

    } 

    @Override 
    public synchronized void setSecondaryProgress(int secondaryProgress) { 
     if (!animate) { 
      super.setSecondaryProgress(secondaryProgress); 
      return; 
     } 
     if (animatorSecondary != null) 
      animatorSecondary.cancel(); 
     if (animatorSecondary == null) { 
      animatorSecondary = ValueAnimator.ofInt(getProgress(), secondaryProgress); 
      animatorSecondary.setInterpolator(DEFAULT_INTERPOLATER); 
      animatorSecondary.addUpdateListener(new AnimatorUpdateListener() { 
       @Override 
       public void onAnimationUpdate(ValueAnimator animation) { 
        AnimateProgressBar.super.setSecondaryProgress((Integer) animation 
          .getAnimatedValue()); 
       } 
      }); 
     } else 
      animatorSecondary.setIntValues(getProgress(), secondaryProgress); 
     animatorSecondary.start(); 
    } 

    @Override 
    protected void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
     if (animator != null) 
      animator.cancel(); 
     if (animatorSecondary != null) 
      animatorSecondary.cancel(); 
    } 

} 

佈局

<FrameLayout 
     android:id="@+id/progress_bar_frame" 
     android:layout_below="@+id/appbar" 
     android:layout_width="match_parent" 
     android:layout_height="3dp"> 

     <my.gov.islam.smarthalal.ui.custom.AnimateProgressBar 
      android:id="@+id/progress_bar" 
      android:layout_width="match_parent" 
      android:layout_height="8dp" 
      style="?android:attr/progressBarStyleHorizontal" 
      android:layout_marginTop="-3dp" 
      android:layout_gravity="top" 
      android:max="100" 
      android:progressDrawable="@drawable/progress_bar_webview" 
      android:background="@android:color/transparent"/> 

    </FrameLayout> 
代碼

,歌曲的持續時間只設置最大,例如currentTime的/ TOTALTIME * 100

example : currentTime = 30 seconds 
      totalTime = 280 seconds 

progressBar.setMax(100); // set the maximum in persentage 

then, in song callback method, 

progressBar.setProgress(currentTime/280 * 100);