无法同时处理点击和触摸事件

Rag*_*har 44 android listeners ontouchlistener

我正在尝试处理触摸事件并单击按钮上的事件.我做以下事情:

button.setOnClickListener(clickListener);
button.setOnTouchListener(touchListener);
Run Code Online (Sandbox Code Playgroud)

当任何一个监听器被注册时,事情工作正常,但是当我尝试使用它们时,只触发事件被触发.任何解决方法?我究竟做错了什么?

urS*_*Sus 68

它有点棘手.

如果你设置onTouchListener你需要返回trueACTION_DOWN,告诉我已经消耗的事件系统,它不会涓滴到其他的听众.

但后来OnClickListener不会被解雇.

所以你可能会想,我会在那里做我的事情并返回,false所以我也可以获得点击.如果您这样做,它将起作用,但您不会订阅其他即将发生的触摸事件(ACTION_MOVE,ACTION_UP)因此,唯一的选择是返回true那里,但之后您将不会收到我们之前所说的任何点击事件.

因此,您需要在ACTION_UPwith中手动执行单击view.performClick()

这会奏效.

  • 关键部分是"你需要在ACTION_UP中手动执行点击",谢谢先生 (6认同)
  • 这真是最好的答案.在我的ACTION_MOVE中,如果满足某个deltaX阈值,我会开始拦截触摸事件.如果我到达ACTION_UP并且从未满足deltaX阈值,我会触发`listView.performClick()`,否则,我会执行滑动操作. (6认同)
  • 显然这应该是答案。 (2认同)

小智 39

ClickListener和之间有一个微妙但非常重要的区别TouchListener.在TouchListener之前的视图可以响应该事件被执行.该ClickListener会收到的事件后,才认为已经处理它.

因此,当您触摸屏幕时,TouchListener会先执行,当您返回true活动时,ClickListener将永远无法获得.但是,如果您按下设备的轨迹球,则ClickListener应该触发,因为TouchListener它不会响应它.


Sep*_*ozi 17

感谢@urSus提供了很好的答案
但是在这种情况下,每次触摸都会执行点击,甚至ACTION_MOVE
假设您想要分离move事件和click事件,您可以使用一个小技巧
定义一个boolean字段并使用如下:

 @Override
        public boolean onTouch(View view, MotionEvent motionEvent)
        {
            switch (motionEvent.getAction() & MotionEvent.ACTION_MASK)
            {
                case MotionEvent.ACTION_DOWN:
                    shouldClick = true;
                    .
                    .
                    break;
                case MotionEvent.ACTION_UP:
                    if (shouldClick)
                        view.performClick();
                    break;
                case MotionEvent.ACTION_POINTER_DOWN:
                    break;
                case MotionEvent.ACTION_POINTER_UP:
                    break;
                case MotionEvent.ACTION_MOVE:
                    //Do your stuff
                    shouldClick = false;
                    break;
            }
            rootLayout.invalidate();
            return true;
        }
Run Code Online (Sandbox Code Playgroud)


Ebo*_*ike 5

我想你回来trueOnTouchListener吗?这将消耗该事件,因此不会被发送以进行任何进一步处理.

另一方面 - 同时拥有点击和触摸监听器有什么意义?

  • 一个可以拖动的按钮,然后在完成后单击? (5认同)

小智 5

你应该在你的时候归还假,你OnTouchListenerOnClickListener意志也会得到处理.