2011-06-05 15 views
10

Tengo una pantalla con 4 barras de búsqueda (como se muestra en la imagen a continuación). Si el usuario mueve B, C o D, calculo el promedio de los tres y establece el progreso de A en el promedio. Esa fue la parte fácil . Lo que me gustaría hacer es animar la barra de progreso A de modo que no salte en una sola toma (por ejemplo, de 25-75).Anime seekbar progress

¿Cuáles son las formas recomendadas de animar A? Obtuve una animación simple pero llamo un TimerTask cada 50 ms para incrementar o disminuir A por un valor unitario hasta que alcanzo la posición requerida. Pero no es muy eficiente.

Nota: Tengo un objeto Seekbar personalizado con el que he creado seekBar's A, B, C & D. Lo siento, no puedo compartir realmente el código, pero me complacerá aclarar cualquier cosa.

enter image description here

+0

la pregunta más importante está en cuyo caso se actualizan los seekbars? Tengo una situación similar (3 barras con 0-100) y las tres barras juntas siempre deben ser 100 ...funciona sin "saltar" para mí ... ¿en qué evento se actualiza A? – WarrenFaith

+0

Cuando se cambia B, C o D, vuelvo a calcular el promedio de 3 y lo fijo como valor de A. Esto se hace solo cuando el usuario simplemente hace clic en los 3 seekBars y no cuando hay un cambio continuo. –

+0

ah bien, ahora lo entiendo ... – WarrenFaith

Respuesta

0

Reduje el número de iteraciones al iterar la tarea del temporizador sobre una función exponencial en lugar de incrementos de unidad. Todavía esperando mejores respuestas :-)

0

Si está utilizando nido de abeja, puede utilizar ViewPropertyAnimator http://android-developers.blogspot.com/2011/05/introducing-viewpropertyanimator.html

La animación antes 3.0 es bastante limitado, pero como alternativa a su método se podría utilizar un oyente animación:

anim.setAnimationListener(new AnimationListener() { 
    public void onAnimationStart(Animation anim) { 
    //moveseekbar 
    } 
    public void onAnimationRepeat(Animation anim) {} 
    public void onAnimationEnd(Animation anim) { 
    //call animation again if movement not complete 
    } 
}); 

No olvides llamar a setFillAfter (boolean fillAfter) porque la animación < 3.0 no actúa Solo mueve la vista. Simplemente da la ilusión de que la vista se ha movido. Importante distinción si aún desea que la barra de búsqueda siga recibiendo toques.

+0

No estoy usando 3.0 :-( –

+0

¿Qué animación usaría aquí? –

9

Supongo que es demasiado tarde. Pero encontré una forma de lograr esto usando ValueAnimator.

ValueAnimator anim = ValueAnimator.ofInt(0, seekBar.getMax()); 
anim.setDuration(1000); 
anim.addUpdateListener(new AnimatorUpdateListener() { 
    @Override 
    public void onAnimationUpdate(ValueAnimator animation) { 
    int animProgress = (Integer) animation.getAnimatedValue(); 
    seekBar.setProgress(animProgress); 
    } 
}); 
anim.start(); 
+0

Esto no funciona en el nivel de la API de Android por debajo de 11. –

+0

¿Por qué no utilizar 'ObjectAnimator'? – acntwww

1

Esto funciona en cualquier versión de Android, sin utilizar ninguna animación.

private void animateSeek(final SeekBar mSeek, final int toVal) { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 

      while (true) { 
       if (mSeek.getProgress() == toVal) { 
        break; 
       } 
       int mProgress = mSeek.getProgress(); 
       if (mProgress < toVal) { 
        mProgress++; 

       } else if (mProgress > toVal) { 
        mProgress--; 
       } 

       mSeek.setProgress(mProgress); 

       try { 
        Thread.sleep(3); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }).start(); 
} 
0

Necesitaba el código que era como lo que @sidhanshu_udawat había hecho. Esa fue una gran base para comenzar. Gran victoria porque se ejecuta en su propio hilo. Gracias por ese ejemplo.

Sin embargo, cuando tomé ese código y lo intenté, surgió el problema de que aumentaría y luego se detendría.

Modifiqué el código (pegado debajo) y ahora si envía en su barra de búsqueda con un código como el siguiente, verá que la barra de búsqueda se mueve hacia arriba y hacia abajo de la escala.

isRunning - Control De Su Actividad

Además, yo necesitaba para detener la animación cuando alguien hace clic en un botón de lo que añade el isRunning booleano como un miembro de mi actividad. Ahora cuando hacen clic en el botón, configuro isRunnig en falso y se detiene SeekBar.

Establecer SeekBar como la siguiente y luego llamar al método:

animSeekBar.incrementProgressBy(1); 
    animSeekBar.setMax(100); 
    animateSeek(animSeekBar,100); 

private void animateSeek(final SeekBar mSeek, final int toVal) { 
     new Thread(new Runnable() { 

      @Override 
      public void run() { 
       boolean isIncrementing = true; 
       int mProgress = 0; 
       isRunning = true; 

       while (isRunning) { 
        if (isIncrementing){ 
         mProgress++; 
        } 
        else{ 
         mProgress--; 
        } 
        mSeek.setProgress(mProgress); 
        if (mProgress >= toVal) { 
         isIncrementing = false; 

        } else if (mProgress <= 0) { 
         isIncrementing = true; 
        } 
        try { 
         Thread.sleep(3); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }).start(); 
    }