在我的项目中,我想使用ProgressBar
,我希望设置平滑倒计时动画。
我在下面编写了平滑动画的代码,当 1000ms(1s) 持续时间时,显示顺畅 { {1}},但我想为持续时间设置 10000毫秒(10秒)。
设置10000毫秒(10秒)的持续时间不是平滑动画并显示碎片倒计时。
但我希望持续时间设置 10000毫秒并显示顺利倒计时。
animation
我该怎么办?请帮我 。谢谢所有< 3
答案 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%