Haga una actualización ProgressBar sin problemas

Estoy usando una barra de progreso (en forma de barra). Deseo hacer que la barra aumente y disminuya suavemente usando un interpolador, pero no está funcionando. Esto es lo que tengo en este momento:

pb.setInterpolator(main.this, android.R.anim.bounce_interpolator); pb.setProgress(pb.getProgress()+10); 

¿Estoy haciendo algo realmente malo?

El interpolador debe adjuntarse a una animación y esto solo funcionará en Honeycomb o superior:

 if(android.os.Build.VERSION.SDK_INT >= 11){ // will update the "progress" propriety of seekbar until it reaches progress ObjectAnimator animation = ObjectAnimator.ofInt(seekbar, "progress", progress); animation.setDuration(500); // 0.5 second animation.setInterpolator(new DecelerateInterpolator()); animation.start(); } else seekbar.setProgress(progress); // no animation on Gingerbread or lower 

Si su SDK mínimo es Gingerbread o inferior, agregue

 @TargetApi(Build.VERSION_CODES.HONEYCOMB) // or @SuppressLint("NewApi") 

a su función / clase.

Usé un DecelerateInterpolator, pero esto es opcional y hay otras posibilidades.

Aquí hay una solución de caída autónoma:

 import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.content.Context; import android.util.AttributeSet; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.Interpolator; import android.widget.ProgressBar; public class AnimatingProgressBar extends ProgressBar { private static final Interpolator DEFAULT_INTERPOLATER = new AccelerateDecelerateInterpolator(); private ValueAnimator animator; private ValueAnimator animatorSecondary; private boolean animate = true; public AnimatingProgressBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public AnimatingProgressBar(Context context, AttributeSet attrs) { super(context, attrs); } public AnimatingProgressBar(Context context) { super(context); } public boolean isAnimate() { return animate; } public void setAnimate(boolean animate) { this.animate = animate; } @Override public synchronized void setProgress(int progress) { if (!animate) { super.setProgress(progress); return; } if (animator != null) animator.cancel(); if (animator == null) { animator = ValueAnimator.ofInt(getProgress(), progress); animator.setInterpolator(DEFAULT_INTERPOLATER); animator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { AnimatingProgressBar.super.setProgress((Integer) animation.getAnimatedValue()); } }); } else animator.setIntValues(getProgress(), progress); animator.start(); } @Override public synchronized void setSecondaryProgress(int secondaryProgress) { if (!animate) { super.setSecondaryProgress(secondaryProgress); return; } if (animatorSecondary != null) animatorSecondary.cancel(); if (animatorSecondary == null) { animatorSecondary = ValueAnimator.ofInt(getProgress(), secondaryProgress); animatorSecondary.setInterpolator(DEFAULT_INTERPOLATER); animatorSecondary.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { AnimatingProgressBar.super.setSecondaryProgress((Integer) animation .getAnimatedValue()); } }); } else animatorSecondary.setIntValues(getProgress(), secondaryProgress); animatorSecondary.start(); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (animator != null) animator.cancel(); if (animatorSecondary != null) animatorSecondary.cancel(); } } 

reemplace ProgressBar con AnimatingProgressBar en su diseño

También muchos cambian el tipo a AnimatingProgressBar para utilizar setAnimate() para deshabilitar la animación (podría ser útil al restaurar el estado de la actividad)

Si cambia el valor de progreso cada vez por 1 (por ejemplo, de 45 a 46), no verá la animación. Es mejor cambiar el progreso en 100 puntos, para esto solo necesitas multiplicar tu valor máximo a 100 y cada valor de progreso a 100 también. Por ejemplo:

 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(); } 

Resolví cómo hacerlo, utilizando un ejecutable pude actualizar la barra de progreso varias veces por segundo y así dar el efecto deslizante. El código está abajo:

 private Runnable SmoothIncrement = new Runnable() { public void run() { final long start = mStartTime; long millis = SystemClock.uptimeMillis() - start; if(track!=increase) { if((pb.getProgress()==100)&&(count 

Aquí, 'seguimiento' realiza un seguimiento de cuántos incrementos se han realizado y aumenta el número total de incrementos que se deben hacer. Puedo boost dinámicamente el número de incrementos desde el subproceso de interfaz de usuario para dar un efecto suave. El código solo funciona para las barras de progreso que no necesitarán disminuir.

Para ejecutarlo, simplemente use este código:

  mStartTime = System.currentTimeMillis(); incrementor.removeCallbacks(SmoothIncrement); if(track!=0) { track -= increase; } incrementor.postDelayed(SmoothIncrement, 0); 

Mi enlace de biblioteca

El enlace de arriba es mi biblioteca. Solo úsalo si quieres.

Según la documentación, el interpolador se aplica al progreso indeterminado. Como estableces el progreso, creo que pretendes utilizar uno normal con valores. Creo que lo mejor para usted sería boost el valor máximo de progreso e ir en incrementos más pequeños.

No estoy seguro, pero por favor verifíquelo:

 pb.setProgress(pb.getProgress() * 100);