2012-03-13 9 views
10

Estoy tratando de hacer un movimiento SeekBar más suavemente que simplemente saltar directamente a la posición. Estoy haciendo esto ya que tengo SeekBar con 3 opciones para una implementación tipo slider.¿Cómo puedo hacer que una barra de búsqueda de Android se mueva sin problemas?

Estoy buscando crear un buen control deslizante suave con 3 opciones "Sí", "Sin opción", "No" para una función en mi aplicación y una SeekBar se ve de la mejor manera y más fácil.

He intentado mirar Animación Android y parece un poco complejo poco, así que si alguien podría ser de cualquier ayuda que sería bueno :)

Respuesta

5

construido mi propio control. Trabajo hecho :) Código here

+1

+1 Puede agregar el código fuente para que pueda ayudar a los visitantes en el futuro. –

+0

Lo haré, lo publicaré tan pronto como presione la última versión de mi aplicación. Creo que la fuente abierta de la aplicación de todos modos –

+3

Según lo prometido - https://github.com/kennydude/Speaker/blob/master/src/me/kennydude/speaker/SmoothSeekBar.java esa ubicación se actualizará como actualizaciones de código –

11

He encontrado la siguiente solución para hacer que la barra de búsqueda se mueva sin problemas, y aun así ajustar a un rango limitado de valores. Asumiendo que tiene los siguientes puntos de vista en su diseño:

<SeekBar 
    android:id="@+id/sldProgress" 
    style="@style/MySliderStyle" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:max="100" 
    android:progress="50" /> 

<TextView 
    android:id="@+id/lblProgress" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="5" /> 

Puede utilizar el siguiente código en su actividad (cambiar el valor del androide: max en el XML anterior, y el factor de suavidad en el código de abajo de acuerdo a su - las necesidades de los valores más altos = más suaves):

public class MyActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    sliderListener sldListener = new sliderListener(); 
    SeekBar sldProgress = (SeekBar) findViewById(R.id.sldProgress); 
    sldProgress.setOnSeekBarChangeListener(sldListener); 
    } 
    private class sliderListener implements OnSeekBarChangeListener { 
    private int smoothnessFactor = 10; 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     progress = Math.round(progress/smoothnessFactor); 
     TextView lblProgress = (TextView) findViewById(R.id.lblProgress); 
     lblProgress.setText(String.valueOf(progress)); 
    } 

    public void onStartTrackingTouch(SeekBar seekBar) { 
    } 

    public void onStopTrackingTouch(SeekBar seekBar) { 
     seekBar.setProgress(Math.round((seekBar.getProgress() + (smoothnessFactor/2))/smoothnessFactor) * smoothnessFactor); 
    } 
    } 
} 
+4

Quien haya votado negativamente, por favor explique qué le pasa a la respuesta. Recuerde, la votación negativa solo se debe usar en casos extremos en los que la respuesta no requirió esfuerzo o la respuesta es peligrosa. Si la respuesta es peligrosa, ¡me gustaría saber por qué! Gracias. – Russ

+0

Integer.parseInt (String.valueOf (Math.round (progress/smoothnessFactor))); Esto no parece correcto. progress/smoothnessFactor siempre producirá un int, por lo que no hay necesidad de redondearlo, entonces simplemente lo está convirtiendo a una cadena y luego a un int. – theelfismike

+4

¿Eso es todo? Difícilmente explotará tu aplicación ¿verdad? He editado el código para eliminar esas conversiones innecesarias (cualquiera podría haber hecho eso, no hay necesidad de votar a favor). – Russ

1

usted no tiene que construir cualquier cosa por ti mismo usuario animación androide que va a hacer la cosa para usted

el código writen en kotlion

mySeekbar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { 
     override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { 
      //Todo: code 
     } 

     override fun onStartTrackingTouch(seekBar: SeekBar?) { 
     } 

     override fun onStopTrackingTouch(seekBar: SeekBar) { 
      if (seekBar.progress > 70) { 
       ObjectAnimator.ofInt(seekBar, "progress", 100).setDuration(100).start() 
      } else if (seekBar.progress < 30) { 
       ObjectAnimator.ofInt(seekBar, "progress", 0).setDuration(100).start() 
      } else { 
       ObjectAnimator.ofInt(seekBar, "progress", 50).setDuration(100).start() 
      } 
     } 
    }) 
Cuestiones relacionadas