拖动按钮 - android

时间:2012-12-14 20:59:04

标签: android button ontouchlistener

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

有一个图像,您可以看到我想要做的事情(第一个按钮上的第一个ACTION_DOWN并拖动仍然按下屏幕的第二个第7个按钮),然后按下每个白色按钮:

enter image description here

下面是我的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;
            }
        });

1 个答案:

答案 0 :(得分: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(示例中为钢琴键)。

此外,如果用户的触摸离开按钮但是没有按下另一个按钮,您可能需要修改此功能以正确停用当前激活的按钮。

我在Android设备上测试了上面的代码,其布局连续有3个按钮。在所有按钮上拖动手指会使每个按钮的文本更改为“点击!”

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