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:
Example with 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();
}
You can make custom clas like this :
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:
here is snippet for my countdown timer using smooth animation you can modify as per your need please follow below :
Summary:
setMax and setProgress
setAnimation to show from progess to max values of progressbar
create a timer with call back of ~10 millisec
update progress in onTick i.e total - finished
Because you are using
ofInt
you can only move at full integers. In other words, if you have a progress bar with a width of 1000 and a progress of 0 to 100 since you are moving at an integer pace you count 1, 2, 3, 4 which translates to 10px, 20px, 30px and 40px. Which explains the jaggedness you are seeing.To correct this you have a few options. The first is to up your integers from 0 to
someBigInt
This will give the animator more numbers to work with.The other option is to use
ofFloat
which does the same thing asofInt
but uses floating points instead of integers.Just set
android:max="1000"
and doObjectAnimator progressAnimator = ObjectAnimator.ofInt(mProgressBar, "progress", 1000, 0);
in this case you will animate on 1/1000 by each step which in 10 time smoothly when default 100 percent scale. and it looks much better
You can not use the
ofFloat
because the ProgressBar's progress attribute doesn't accept float values, only integer ones. That is why your ProgressBar stopped progressing after going with that solution.As the others have said it, the correct way to do what you want is to set
android:max
to some big integer.Sorry for reviving the thread but I feel like this had to be said.