2012-07-27 10 views
7

Me gustaría registrar un evento que se puede hacer clic en el pulgar de la barra de búsqueda para activar un evento cuando el usuario lo ha bloqueado. ¿Es posible?Pulsador de Seekbar al hacer clic

+1

¿Has resuelto esto? – David

Respuesta

0

lo hago de esta manera:

pagesSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { //listener 
     @Override 
     public void onStopTrackingTouch(final SeekBar seekBar) { 
      //add your event here 
     } 

     @Override 
     public void onStartTrackingTouch(final SeekBar seekBar) { 
     } 

     @Override 
     public void onProgressChanged(final SeekBar seekBar, final int progress, final boolean fromUser) { 
       updateControls(progress, false); 
     } 
    }); 
+0

Quiero poder hacer clic solo en el pulgar. Ese oyente se activa al hacer clic en cada parte de la barra de búsqueda – biquillo

1

yo era capaz de lograr esto de la siguiente manera:

seekBar.setOnTouchListener(new OnTouchListener() 
{ 
    @Override 
    public boolean onTouch(View v, MotionEvent event) 
    { 
     if(event.getAction() == MotionEvent.ACTION_MOVE) 
     { 
      changedPosition = true; 
      seekBar.setProgress(seekBar.getProgress()); 
      return false; 
     } 
     else if (event.getAction() == MotionEvent.ACTION_UP) 
     { 
      if(!changedPosition) 
      { 
        //do action here 
      } 
     } 
    } 

espero que esto ayude

+2

Esto escucharía eventos táctiles en toda la barra de búsqueda en lugar de solo el pulgar. – Prateek

+0

Prateek tiene razón, esto disparará cuando te muevas sobre otras partes de la barra de búsqueda también. –

+0

@ BjörnKechel, si bien es cierto que esto escucha eventos táctiles en toda la barra de búsqueda, pero si la toca en cualquier otro lugar que no sea el pulgar, entonces se activará ACTION_MOVE y en ACTION_UP no pasaría nada gracias a la instrucción if. – zwebie

2

Combinando zwebie y Nermeens respuestas a la adecuada solución:

seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
    private int mProgressAtStartTracking; 
    private final int SENSITIVITY; 

    @Override 
    public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 
     // handle progress change 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 
     mProgressAtStartTracking = seekBar.getProgress(); 
    } 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 
     if(Math.abs(mProgressAtStartTracking - seekBar.getProgress()) <= SENSITIVITY){ 
      // react to thumb click 
     } 
    } 
}); 

Así que esto solo se activa al hacer clic con el pulgar, no al mover el dedo pulgar y no al hacer clic en otras partes de la barra de búsqueda.

Puede ajustar la sensibilidad, porque a veces un clic ya mueve el pulgar un poco y permitir pequeños cambios mientras sigue haciendo clic es menos frustrante. Un buen valor depende del tamaño de la barra de búsqueda y del valor máximo que puede tener. Para mí, 3 funcionó bien en una barra de búsqueda de ancho completo con 50 máx. En un diseño de retrato.

+0

@ quien haya votado negativamente: por favor dígame qué piensa que está mal con mi respuesta. Funciona mejor que las otras dos respuestas. –

+0

Gracias, trabajando bien para mí, aunque no sé por qué alguien votó – Vicky

0

Utilicé la respuesta de Bijom como inspiración. Se disparará cuando el pulgar se mueva, de modo que si el usuario no hace clic en el pulgar, no se moverá. Espero que esto ayude. :)

Si tiene alguna pregunta sobre cómo funciona, no dude en comentar.

mSeekBarSpeed.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
     int progress = mSeekBarSpeed.getProgress(); 

     boolean started = false; //use this variable to see whether the user clicked the right place 


     @Override 
     public void onProgressChanged(SeekBar seekBar, int progressValue, boolean fromUser) { 
      if(!started){ //check to see if user clicks the right place 
       //if the user clicks within a specific threshold 
       float threshold = (float)seekBar.getMax()/seekBar.getWidth() * seekBar.getThumb().getIntrinsicWidth()/2; 
       if(Math.abs(progressValue - progress) < threshold){ 
        if(fromUser){ //checks if user actually clicked it 
         started = true; 
        } 

       }else{ 
        seekBar.setProgress(progress); //set to original progress 
        onStopTrackingTouch(seekBar); //not really necessary, keep or delete based on your needs 
        return; //get out of method 
       } 
      } 

      if(started) { 

       progress = progressValue; //update progress variable 
       System.out.println("onProgressChanged:" + progress + "/" + seekBar.getMax()); 

       //DO WHAT YOU NEED TO DO WHEN PROGRESS IS CHANGING 

      } 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 
      System.out.println("onStartTracking:" + progress + "/" + seekBar.getMax()); 
     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 
      System.out.println("onStopTracking:" + progress + "/" + seekBar.getMax()); 
      //DO WHATEVER YOU NEED TO DO WHEN PROGRESS IS DONE CHANGING 

      started = false; //remember to set variable to false 
     } 

    });