2012-07-27 11 views
7

私はイベントを誘発するためにシークバーの親指にクリック可能なイベントを登録したいと思います。出来ますか?Seekbarの親指はクリック

+1

これを解決しましたか? – David

答えて

0

私はそれをこのように実行します。

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

親指だけをクリックしたいと思っています。そのリスナーは、シークバーのすべての部分をクリックしてトリガーされます。 – biquillo

1

私は次のようにこれを達成することができました:

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

希望、これは適切にzwebieとNermeens答えを組み合わせる

+2

これは、サムだけでなく、シークバー全体のタッチイベントを聴いています。 – Prateek

+0

Prateekが正しいです、これはシークバーの他の部分にも移動すると起動します。 –

+0

@BjörnKechelこれは、すべてのシークバーのイベントに触れるのが真実ですが、親指以外の場所に触れるとACTION_MOVEがトリガーされ、ACTION_UPではifステートメントのために何も起こりません。 – zwebie

2

を支援します溶液:

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

これは実際にはサムのクリックでのみ発生し、サムの移動ではなく、シークバーの他の部分ではクリックしません。

感度が調整できるのは、クリックが既に親指を少し動かしているにもかかわらず、クリックしている間にほとんど変化が許されないためです。ここでの良い値はシークバーのサイズとそれが持つことができる最大値に依存します。私にとっては、3つのモードでは、縦書きレイアウトで最大50のシークバーでうまくいきました。

+0

@誰でも下降します:私の答えが間違っていると私に教えてください。他の2つの答えよりも優れています。 –

+0

ありがとう、私のためにうまく動作しますが、何人かがダウンした理由を知らない – Vicky

0

私はBijomの答えをインスピレーションとして使用しました。これは、ユーザーが親指をクリックしないと移動しないので、親指が動くと起動します。お役に立てれば。 :)

どのように動作するかについてご質問がありましたら、お気軽にコメントしてください。

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 
     } 

    }); 
関連する問題