按下和释放按钮的监听器

44

如何监听 Button 的按下和释放事件?

3个回答

88
你可以使用一个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;
    }
});

8
MotionEvent.ACTION_CANCEL 事件也应该被处理为按钮释放事件(与 ACTION_UP 相同),因为当您按下按钮后执行某些手势时会触发它(此时不会触发 ACTION_UP 事件)。 - user2137020
如果有人想知道,在普通的View上,这些不对应于ACTION_BUTTON_PRESSACTION_BUTTON_RELEASE。认为这两个可能包含DOWNUPCANCEL操作。 - David Lord
但这会阻塞onClickListener - Konstantin Konopko
如果您正在消费事件,您还应该在视图上调用performClick()。 - Steve
@KonstantinKonopko 如果需要的话,您可以在ACTION_UP情况下添加v.performClick(),或者只需返回false - hanswim

12

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,按钮的常规触摸处理也会确保您获得后续事件。

4

onTouchListener 是你需要寻找的内容。

你需要使用正确的MotionEvent,来处理不同类型的“触摸”事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接