2012-07-27 10 views
7

Ich möchte ein anklickbares Ereignis auf dem Suchbalken-Daumen registrieren, um ein Ereignis auszulösen, wenn der Benutzer es geklickt hat. Ist es möglich?Seekbars Daumen auf Klick

+1

Haben Sie das gelöst? – David

Antwort

0

Ich mache es so:

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

Ich möchte nur in den Daumen klicken können. Dieser Zuhörer wird ausgelöst, indem er in jeden Teil der Suchleiste klickt. – biquillo

1

Ich konnte dies in der folgenden Art und Weise erreichen:

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 
      } 
     } 
    } 

hoffe, das hilft

+2

Dies würde auf Berührungsereignisse auf der gesamten Suchleiste hören, anstatt nur auf den Daumen. – Prateek

+0

Prateek hat recht, das wird auch ausgelöst, wenn Sie sich über andere Teile der Suchleiste bewegen. –

+0

@ BjörnKechel während es wahr ist, dass dies Touch-Ereignisse auf alle Suchleiste hört, aber wenn Sie es anderswo als den Daumen berühren würde dann die ACTION_MOVE ausgelöst werden und in ACTION_UP nichts passieren würde, dank der if-Anweisung. – zwebie

2

Kombination zwebie und Nermeens Antworten auf die richtige Lösung:

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

Also feuert das wirklich nur auf Daumenklick, nicht auf Daumen bewegen und nicht auf andere Teile der Suchleiste klicken.

Sie können die Empfindlichkeit anpassen, da manchmal ein Klick den Daumen ein wenig bewegt und kleine Änderungen erlaubt, während das Klicken immer noch weniger frustrierend ist. Ein guter Wert hängt hier von der Größe der Suchleiste und dem maximalen Wert ab, den sie haben kann. Für mich funktionierte 3 gut auf einer vollen Suchleiste mit maximal 50 auf einem Porträt-Layout.

+0

@ wer auch immer herunterfährt: Bitte lass mich wissen, was du mit meiner Antwort falsch findest. Es funktioniert besser als die anderen beiden Antworten. –

+0

Danke, funktioniert gut für mich, obwohl ich nicht weiß, warum jemand abstimmte – Vicky

0

Ich habe Bijoms Antwort als Inspiration verwendet. Dies wird ausgelöst, wenn sich der Daumen bewegt. Wenn der Benutzer nicht auf den Daumen klickt, wird er sich nicht bewegen. Hoffe das hilft. :)

Wenn Sie Fragen dazu haben, wie es funktioniert, fühlen Sie sich frei zu kommentieren.

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 
     } 

    });