-2
是否有可能創建一個進度條,可以根據歌曲開始播放的時間以及歌曲的時間長短來爲歌曲的剩餘時間製作動畫效果?只用時間戳創建進度條?
例如,一個收集時間播放的int開始,並且再次比較ms的長度?
我理解這個概念,但不能完全包裝如何在我的腦海中做到這一點!
編輯:爲了澄清,我可以得到剩餘時間和時間的整數,但我不知道如何將它們組合成一個動畫條,然後以XML顯示它。
是否有可能創建一個進度條,可以根據歌曲開始播放的時間以及歌曲的時間長短來爲歌曲的剩餘時間製作動畫效果?只用時間戳創建進度條?
例如,一個收集時間播放的int開始,並且再次比較ms的長度?
我理解這個概念,但不能完全包裝如何在我的腦海中做到這一點!
編輯:爲了澄清,我可以得到剩餘時間和時間的整數,但我不知道如何將它們組合成一個動畫條,然後以XML顯示它。
創建自定義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);