3

我有几个按钮,我想按下其中一个并拖动另一个按钮。你能告诉我MotionEvent应该使用哪个或其他功能吗?我正在使用onTouchListener.

有一张图片,您可以在其中看到我想要做什么(首先ACTION_DOWN在第 1 个按钮上并拖动第 2-7 个按钮仍然按下屏幕),最后按下每个白色按钮:

在此处输入图像描述

下面是我的 onTouch 按钮代码:

button1 = (Button) findViewById(R.id.button1);

        button1.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                    switch (event.getAction())
                    {
                        case MotionEvent.ACTION_DOWN:
                            soundIDs[0] = sound.play(R.raw.sample1);
                            button1.setBackgroundResource(R.drawable.white_clicked);
                            break;
                        case MotionEvent.ACTION_UP:
                        case MotionEvent.ACTION_CANCEL:
                            sound.stop(soundIDs[0]);
                            button1.setBackgroundResource(R.drawable.white);
                            break;
                    }
            return false;
            }
        });
4

1 回答 1

2

您只在一个按钮上设置了 OnTouchListener。这不会帮助您知道指针何时移动(例如用户拖动手指)到另一个按钮。

您可以在包含按钮的视图上设置 OnTouchListener。然后检查 ACTION_DOWN、ACTION_MOVE 和 ACTION_UP 事件。然后,您必须进行一些简单的点击检测来确定要激活哪个按钮。

类似于以下内容:

getWindow().getDecorView()
    .findViewById(android.R.id.content)
    .setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View arg0, MotionEvent event) {
            int action = event.getAction();
            if (action != MotionEvent.ACTION_DOWN 
                && action != MotionEvent.ACTION_MOVE 
                && action != MotionEvent.ACTION_UP) return false;

            Rect hitRect = new Rect();
            Button button;
            for(int i = 0; i < myButtons.size(); i++) {
                button = myButtons.get(i);
                button.getHitRect(hitRect);
                if (hitRect.contains((int)event.getX(), (int)event.getY())) {
                    button.setText("hit!");
                }
            }
            return true;
        }

    });

其中 myButtons 是按钮的 ArrayList(在您的示例中为钢琴键)。

此外,如果用户的触摸离开按钮但没有点击另一个按钮,您可能希望修改它以正确停用当前活动的按钮。

我在具有连续 3 个按钮的布局的 android 设备上测试了上述代码。在所有按钮上拖动手指会导致每个按钮的文本变为“命中!”

就像我上面说的,你只是在一个按钮上设置了触摸监听器,那是行不通的。在此示例中,我在活动的整个视图上设置了触摸侦听器。

于 2012-12-15T00:32:15.977 回答