2012-08-02 90 views

回答

66

您可以使用onTouchListener

view.setOnTouchListener(new View.OnTouchListener() {   
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     switch(event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       // PRESSED 
       return true; // if you want to handle the touch event 
      case MotionEvent.ACTION_UP: 
       // RELEASED 
       return true; // if you want to handle the touch event 
     } 
     return false; 
    } 
}); 
+4

'MotionEvent.ACTION_CANCEL'事件也应该作为按钮释放事件(与'ACTION_UP'相同的方式)处理,因为按下按钮后执行某个手势时会触发事件('ACTION_UP'事件未被触发在这种情况下)。 – user2137020 2016-01-09 20:18:23

+0

如果有人想知道,在常规视图中,这些不符合'ACTION_BUTTON_PRESS'和'ACTION_BUTTON_RELEASE'。认为这两个可能包含“DOWN”,“UP”和“CANCEL”动作。 – 2016-11-16 08:27:16

0

fiddler给出的答案对于通用视图是正确的。

对于Button,你应该从触摸处理器总是返回false

button.setOnTouchListener(new View.OnTouchListener() {  
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     switch(event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       // PRESSED 
       break; 
      case MotionEvent.ACTION_UP: 
      case MotionEvent.ACTION_CANCEL: 
       // RELEASED 
       break; 
     } 
     return false; 
    } 
}); 

如果返回true你会绕过该按钮的常规触摸处理。这意味着你将失去按下按钮和触摸波纹的视觉效果。此外,Button#isPressed()将返回false而按钮实际上按下。

按钮的定期触摸处理将确保即使在返回false时也能得到后续事件。