2012-08-02 63 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時也能得到後續事件。