Rag*_*har 44 android listeners ontouchlistener
我正在尝试处理触摸事件并单击按钮上的事件.我做以下事情:
button.setOnClickListener(clickListener);
button.setOnTouchListener(touchListener);
Run Code Online (Sandbox Code Playgroud)
当任何一个监听器被注册时,事情工作正常,但是当我尝试使用它们时,只触发事件被触发.任何解决方法?我究竟做错了什么?
urS*_*Sus 68
它有点棘手.
如果你设置onTouchListener你需要返回true的ACTION_DOWN,告诉我已经消耗的事件系统,它不会涓滴到其他的听众.
但后来OnClickListener不会被解雇.
所以你可能会想,我会在那里做我的事情并返回,false所以我也可以获得点击.如果您这样做,它将起作用,但您不会订阅其他即将发生的触摸事件(ACTION_MOVE,ACTION_UP)因此,唯一的选择是返回true那里,但之后您将不会收到我们之前所说的任何点击事件.
因此,您需要在ACTION_UPwith中手动执行单击view.performClick()
这会奏效.
小智 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)
我想你回来true了OnTouchListener吗?这将消耗该事件,因此不会被发送以进行任何进一步处理.
另一方面 - 同时拥有点击和触摸监听器有什么意义?
| 归档时间: |
|
| 查看次数: |
34563 次 |
| 最近记录: |