平滑进度栏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(); } 

  • 使用android studio创建扫描animation
  • Android中的自定义animation
  • Androidanimation如何在幕后工作?
  • RecyclerView - NotifyItemInsert上没有animation
  • 刷新ActionBarSherlock中的菜单项animation
  • 如何将animation添加到android中的文本视图
  • 简单的补间animation示例
  • 单个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之间的任何数字