平滑进度栏animation

我试图为ProgressBar实现一个平滑的animation,但是当我增加时间(30秒)时,animation不再平滑。

5秒钟的示例:

5秒

30秒的示例:

30秒

我的进度背景:

 <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape> <padding android:top="1dp" /> <solid android:color="#10444444" /> </shape> </item> <item> <shape> <padding android:top="1dp" /> <solid android:color="#20444444" /> </shape> </item> <item> <shape> <padding android:top="1dp" /> <solid android:color="#30444444" /> </shape> </item> <item android:id="@android:id/background"> <shape> <solid android:color="@color/black_thirty" /> </shape> </item> <item android:id="@android:id/progress"> <clip> <shape> <solid android:color="#3500D0" /> </shape> </clip> </item> </layer-list> 

我的进度布局:

 <ProgressBar android:id="@+id/pb_loading" android:layout_width="match_parent" android:layout_height="8dp" android:indeterminate="false" android:layout_centerInParent="true" android:progress="100" android:progressDrawable="@drawable/my_progress_bar" /> 

我的animation方法:

 private void startAnimation(){ ProgressBar mProgressBar = (ProgressBar) findViewById(R.id.pb_loading); ObjectAnimator progressAnimator = ObjectAnimator.ofInt(mProgressBar, "progress", 100, 0); progressAnimator.setDuration(30000); progressAnimator.setInterpolator(new LinearInterpolator()); progressAnimator.start(); } 

Solutions Collecting From Web of "平滑进度栏animation"

因为你正在使用ofInt你只能以全部整数移动。 换句话说,如果你有一个宽度为1000,进度为0到100的进度条,因为你以一个整数的速度移动,你可以计算出1,2,3,4,即10px,20px,30px和40px。 这解释了你所看到的锯齿。

要纠正这个问题,你有几个select。 首先是将您的整数从0增加到someBigInt这将给animation师更多的数字来处理。

 ObjectAnimator progressAnimator = ObjectAnimator.ofInt(mProgressBar, "progress", 10000, 0); 

另一个select是使用ofFloat ,它和ofFloat做同样的事情,但是使用浮点而不是整数。

 ObjectAnimator progressAnimator = ObjectAnimator.ofFloat(mProgressBar, "progress", 100.0, 0.0); 

如果每次更改进度值1(例如从45到46),您将看不到animation。 你最好把进度改为100分(或者其他),因为你只需要把你的最大值乘以100,每个进度值乘以100就可以了。 例如:

  private void setProgressMax(ProgressBar pb, int max) { pb.setMax(max * 100); } private void setProgressAnimate(ProgressBar pb, int progressTo) { ObjectAnimator animation = ObjectAnimator.ofInt(pb, "progress", pb.getProgress(), progressTo * 100); animation.setDuration(500); animation.setInterpolator(new DecelerateInterpolator()); animation.start(); } 

只要设置android:max="1000"并做ObjectAnimator progressAnimator = ObjectAnimator.ofInt(mProgressBar, "progress", 1000, 0);

在这种情况下,您将在1/1000的时候顺利地在默认的百分之百的范围内平滑地进行animation。 看起来好多了

animation时,您正在使用整数。 这意味着它将在整个值之间跳转。 当它移动的很快,那很好,但是当你移动得慢的时候,它看起来好像跳得很快。

尝试将ObjectAnimator.ofInt更改为ObjectAnimator.ofFloat

希望帮助:)

不能使用ofFloat因为ProgressBar的progress属性不接受float值,只有整数值。 这就是为什么您的ProgressBar在使用该解决scheme之后停止了进度。

正如其他人所说的,正确的做法是将android:max设置为一个大整数。

对不起,重振线程,但我觉得这不得不说。

使用库可以帮助你给你想要填充进度条的时间很平稳而没有滞后,但是你可以使用一点定制来使用它。

只需添加依赖到你的build.gradle:

 compile 'com.carlosmuvi.segmentedprogressbar:library:0.2' 

接下来,将其添加到您的布局

  <com.carlosmuvi.segmentedprogressbar.SegmentedProgressBar android:id="@+id/segmented_progressbar" android:layout_width="match_parent" android:layout_height="5dp"/> 

最后,以编程方式自定义并播放它!

 segmentedProgressBar = (SegmentedProgressBar) findViewById(R.id.segmented_progressbar); // number of segments in your bar segmentedProgressBar.setSegmentCount(7); //empty segment color segmentedProgressBar.setContainerColor(Color.BLUE); //fill segment color segmentedProgressBar.setFillColor(Color.GREEN); //play next segment specifying its duration segmentedProgressBar.playSegment(5000); //pause segment segmentedProgressBar.pause(); //set filled segments directly segmentedProgressBar.setCompletedSegments(3); 

GoToLibrary

这里是我的倒计时计时器使用stream畅的animation片段,你可以根据你的需要修改请按照如下:

 private void setProgressBarValues() { progressBarCircle.setMax((int) (timeCountInMilliSeconds / 10)); progressBarCircle.setProgress((int) (timeCountInMilliSeconds / 10)); Log.e("progres", "" + (timeCountInMilliSeconds / 10)); } private void startCountDownTimer() { smoothAnimation = ObjectAnimator.ofInt(progressBarCircle, "progress", progressBarCircle.getProgress(), progressBarCircle.getMax()); smoothAnimation.setDuration(500); smoothAnimation.setInterpolator(new AccelerateInterpolator()); countDownTimer = new CountDownTimer(timeCountInMilliSeconds, 10) { @Override public void onTick(long millisUntilFinished) { Log.e("getMax", "" + progressBarCircle.getMax()); Log.e("getprogres", "" + progressBarCircle.getProgress()); textViewTime.setText(hmsTimeFormatter(millisUntilFinished)); progressBarCircle.setProgress((int) (timeCountInMilliSeconds / 10 - millisUntilFinished / 10)); } @Override public void onFinish() { textViewTime.setText(hmsTimeFormatter(timeCountInMilliSeconds)); // call to initialize the progress bar values setProgressBarValues(); // hiding the reset icon buttonReset.setEnabled(false); // making edit text editable editTextMinute.setEnabled(true); // changing the timer status to stopped status = TimerStatus.STOPPED; smoothAnimation.end(); } }.start(); smoothAnimation.start(); countDownTimer.start(); } 

概要:

  1. setMax和setProgress

  2. setAnimation从进度条的progess到max值显示

  3. 创build一个约10毫秒的callback计时器

  4. onTick更新进度即总计 – 完成

XML

  <ProgressBar android:id="@+id/progress_bar" style="@style/Widget.AppCompat.ProgressBar.Horizontal" android:layout_width="match_parent" android:layout_height="4dp" android:indeterminate="false" android:progress="0" android:max="100"/> 

JAVA

 @BindView(R.id.progress_bar) ProgressBar progressBar; ObjectAnimator.ofInt(progressBar, "progress", 79).start(); 

79

  • 在这个例子中,在0和100之间的任何数字