2017-05-09 3 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> 

、歌の期間だけの設定MAX、たとえば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); 
を作成
関連する問題