Android 安卓:如何知道按钮是否按下

Android 安卓:如何知道按钮是否按下,android,button,user-interface,callback,Android,Button,User Interface,Callback,我在安卓上玩一个游戏,我有一个函数MoveCharacter(int-direction),当按下按钮时,它会移动一个动画精灵 例如,当用户向上按时,我有以下代码: mControls.UpButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mLevel.mCharAnimation.Fr

我在安卓上玩一个游戏,我有一个函数MoveCharacter(int-direction),当按下按钮时,它会移动一个动画精灵

例如,当用户向上按时,我有以下代码:

 mControls.UpButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mLevel.mCharAnimation.FrameUp();
            }           
        });
但是,我希望只要用户按下按钮,就可以一直移动角色。 令人惊讶的是,我还没有发现如何在Android中做到这一点。 是否存在某种类型的onButtonDownLister?

您需要使用一个单独的操作来执行down、up和其他状态

mControls.UpButton.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch(event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // Do something
            return true;
        case MotionEvent.ACTION_UP:
            // No longer down
            return true;
        }
        return false;
    }
});

你想要的。基本上,这将允许您查看对象何时被触摸,查看用户如何移动手指,并知道何时松开。

您可以使用
OnTouchListener

mControls.UpButton.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_DOWN:
                    mLevel.mCharAnimation.FrameUp();
                    break;
                case MotionEvent.ACTION_UP:
                    // User released the button, do your stuff here
                    break;
                }
                return false;

            }           
        });

正如Gary Bak在评论中提到的,您可能希望检测用户是否也将手指拖到按钮外

mButton.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch(event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // Pressed down
                return true;
            case MotionEvent.ACTION_UP:
                // Released
                return true;
            case MotionEvent.ACTION_CANCEL:
                // Released - Dragged finger outside
                return true;
        }
        return false;
    }
});

这并不能回答问题。如果用户将手指从按钮上滑下,则永远不会调用动作。@quemeful,如果您发布的解决方案确实回答了问题,那就太好了。由于您的评论实际上引导我测试该场景,我发现正确的答案是同时测试
MotionEvent.ACTION\u CANCEL
,并执行与ACTION\u up相同的操作。