【问题标题】:Create progressbar with just timestamp?仅使用时间戳创建进度条?
【发布时间】:2017-05-09 00:05:00
【问题描述】:

是否可以创建一个进度条,根据歌曲开始播放的时间以及歌曲的播放时长为歌曲的剩余时间设置动画?

例如,收集播放开始时间的 int,并再次比较以 ms 为单位的长度?

我理解这个概念,但无法在脑海中完全概括如何去做!

编辑:澄清一下,我可以获得剩余时间和开始时间的整数,但我不知道如何将它们组合成一个动画条,然后在 XML 中显示。

【问题讨论】:

    标签: java android media-player


    【解决方案1】:

    创建自定义动画进度条

    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); 
    

    【讨论】:

      猜你喜欢
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多