【问题标题】:Dragging and pressing buttons - android拖动和按下按钮 - android
【发布时间】:2012-12-02 21:30:39
【问题描述】:

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

有一张图片,你可以看到我想要做什么(第一个按钮上的 ACTION_DOWN 并拖动第 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;
            }
        });

【问题讨论】:

  • 太棒了,更容易弄清楚你要做什么=)。
  • 你有没有设法找出它是如何工作的?我什至找不到描述问题的正确方法。大多数人似乎都在寻找“一次多个按钮”而不是“按顺序排列多个按钮”

标签: android button ontouchlistener


【解决方案1】:

您只在一个按钮上设置了 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 设备上测试了上述代码。在所有按钮上拖动手指会导致每个按钮的文本变为“命中!”

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

【讨论】:

  • 有几个错误,但最终它不起作用;P它只在第一次点击这个按钮时起作用。
  • 好吧,我确实在代码之前说过“类似的东西”,我的意思是让你把它当作伪代码。我将使用我在设备上测试过的代码编辑答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多