Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Smooth Progress Bar Animation

I'm trying to implement a smooth animation for my ProgressBar, but when I increase the time (30 seconds), the animation is no longer smooth.

Example with 5 seconds:

5 seconds

Example with 30 seconds:

30 seconds

My progress background:

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

My progress layout:

<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" /> 

My animation method:

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(); } 
like image 258
rsicarelli Avatar asked Jun 10 '15 20:06

rsicarelli


1 Answers

If you change progress value each time by 1 (for example from 45 to 46) you won't see the animation. You'd better change progress by 100 points (or maybe other), for this you just need to multiply your max value by 100 and each progress value to 100 too. For example:

    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);         animator.setAutoCancel(true);         animation.setInterpolator(new DecelerateInterpolator());         animation.start();     } 
like image 154
Pavel Kataykin Avatar answered Sep 24 '22 22:09

Pavel Kataykin