如何在android

时间:2018-02-03 15:59:28

标签: android animation android-animation android-progressbar

在我的项目中,我想使用ProgressBar,我希望设置平滑倒计时动画

我在下面编写了平滑动画的代码,当 1000ms(1s) 持续时间时,显示顺畅 { {1}},但我想为持续时间设置 10000毫秒(10秒)

设置10000毫秒(10秒)的持续时间不是平滑动画并显示碎片倒计时。

但我希望持续时间设置 10000毫秒并显示顺利倒计时

animation

我该怎么办?请帮我 。谢谢所有< 3

1 个答案:

答案 0 :(得分:3)

获取您现有的内容,然后删除setUserVisibleHint()方法和ProgressBarAnimation课程。加上这个:

private void setUpObserver() {
    progressBar.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            startAnimation();

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                progressBar.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
            else {
                progressBar.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }
        }
    });
}

private void startAnimation() {
    int width = progressBar.getWidth();
    progressBar.setMax(width);

    ValueAnimator animator = ValueAnimator.ofInt(0, width);
    animator.setInterpolator(new LinearInterpolator());
    animator.setStartDelay(0);
    animator.setDuration(10_000);
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            int value = (int) valueAnimator.getAnimatedValue();
            progressBar.setProgress(value);
        }
    });

    animator.start();
}

然后,在onCreateView()方法内,请在setUpObserver()之前致电return view;

setUpObserver()方法使用OnGlobalLayoutListener确保系统在开始动画之前等待ProgressBar测量布局。

startAnimation()方法负责实际设置和运行动画。您可以根据需要修改传递给setStartDelay()setDuration()的值。

此解决方案的技巧是确保进度条的最大值等于其宽度,这意味着“progress”的每个增量等于屏幕上的一个像素。 android框架动画负责确保一切尽可能顺利运行。

修改

如果您希望能够控制动画的开始/结束点(而不是从空白到完全),请进行以下更改:

startAnimation()的声明更改为:

private void startAnimation(float startPercent, float endPercent)

startAnimation()

中删除此行
ValueAnimator animator = ValueAnimator.ofInt(0, width);

并添加以下行:

int start = (int) (startPercent * width);
int end = (int) (endPercent * width);
ValueAnimator animator = ValueAnimator.ofInt(start, end);

最后,通过传入小数百分比来调用startAnimation()

startAnimation(0.79f, 0.10f); // will animate from 79% to 10%