2016-09-10 105 views
1

onStopTrackingTouch事件被激发两次,这是一个问题,因为我只需要创建一个getRequest。这里是我的代码:MotionEvent.ACTION_UP事件使用seekbar触发两次

VerticalSeekbar.java

public boolean onTouchEvent(MotionEvent event) { 

if (!isEnabled()) { 
    return false; 
} 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
     case MotionEvent.ACTION_MOVE: 
      super.onTouchEvent(event); 
      int progress = getMax() - (int) (getMax() * event.getY()/getHeight()); 
      // Ensure progress stays within boundaries 
      if(progress < 0) {progress = 0;} 
      if(progress > getMax()) { 
       progress = getMax();} 
      setProgress(progress); // Draw progress 
      if(progress != lastProgress) { 
       // Only enact listener if the progress has actually changed 
       lastProgress = progress; 
       Information.onSeekBarChangeListener.onProgressChanged(this, progress, true); 
      } 
      onSizeChanged(getWidth(), getHeight() , 0, 0); 
      Log.i("radio", "action move"); 
      setPressed(true); 
      setSelected(true); 
     case MotionEvent.ACTION_UP: 
      Log.i("radio", "action up"); //printed twice 
      Information.onSeekBarChangeListener.onStopTrackingTouch(this); 
      break; 
     case MotionEvent.ACTION_CANCEL: 
      break; 
    } 
    return true; 
} 

Information.java

onSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser){ 
      radio = (progress/(double) 10); 
      tv_radio.setText(radio + " Km"); 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar){ 
      Log.i("vertical", "onStart"); 
     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar){ 
      Log.i("vertical", "onStopTracking"); //printed twice 
      getRequest request = new getRequest(); 
      request.execute("http://..."); 
     } 
    }; 
    sb_radio.setOnSeekBarChangeListener(onSeekBarChangeListener); 

任何想法,为什么两次检测MotionEvent.ACTION_UP?即使我只是简单地点击Seekbar而不拖动。

回答

1

TouchListener将被要求每MotionEvent.ACTION_DOWNMotionEvent.ACTION_UP,并且MotionEvent.ACTION_MOVE

所以问题是,有那么即使当你跌到下MotionEvent.ACTION_MOVE情况下,控制break语句MotionEvent.ACTION_MOVE后失踪会继续执行,进一步直至达到一些停止点,如break

switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
     case MotionEvent.ACTION_MOVE: 
      super.onTouchEvent(event); 
      int progress = getMax() - (int) (getMax() * event.getY()/getHeight()); 
      if(progress < 0) {progress = 0;} 
      if(progress > getMax()) { 
       progress = getMax();} 
      setProgress(progress); 
      if(progress != lastProgress) { 
       lastProgress = progress; 
       Information.onSeekBarChangeListener.onProgressChanged(this, progress, true); 
      } 
      onSizeChanged(getWidth(), getHeight() , 0, 0); 
      Log.i("radio", "action move"); 
      setPressed(true); 
      setSelected(true); 
      break;   // add a break statement here and problem solved 
     case MotionEvent.ACTION_UP: 
      Log.i("radio", "action up"); 
      Information.onSeekBarChangeListener.onStopTrackingTouch(this); 
      break; 
     case MotionEvent.ACTION_CANCEL: 
      break; 
    } 
    return true; 
}