2012-07-27 80 views
7

我想在seekbar的拇指上注册一个可点击的事件,以便在用户使用它时触发事件。可能吗?Seekbar的拇指点击

+1

你解决了吗? – David 2016-10-12 13:08:36

回答

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 2012-07-27 09:36:02

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

希望这有助于

+2

这将监听整个搜索栏上的触摸事件,而不仅仅是拇指。 – Prateek 2015-06-05 08:16:01

+0

Prateek是对的,当你移动到seekbar的其他部分时,它也会触发。 – 2016-10-02 18:10:26

+0

@BjörnKechel虽然它确实监听所有的搜索栏上的触摸事件,但如果你想触摸除拇指以外的其他任何地方,那么ACTION_MOVE将被触发,并且在ACTION_UP中将不会发生,这要归功于if语句。 – zwebie 2016-11-15 06:40:32

2

结合zwebie和Nermeens答案正确解决方案:

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

所以这只会在拇指点击时触发,而不是在拇指移动上,而不是点击搜索栏的其他部分。

您可以调整灵敏度,因为有时点击已经略微移动了拇指,并且允许很小的变化,而仍然点击不那么令人沮丧。这里的一个好的值取决于seekbar的大小和它可以拥有的最大值。对于我来说,3在纵向布局上最大为50的全宽搜索栏上效果很好。

+0

@谁低估:请让我知道你认为我的答案是错误的。它比其他两个答案更好。 – 2016-10-02 17:22:27

+0

谢谢,虽然我不知道为什么一些人投了票 – Vicky 2017-01-18 17:05:10

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 
     } 

    });