您的位置:首页 > 移动开发 > Android开发

android onClick,onLongClick,onTouch事件机制和触发顺序

2013-08-16 11:55 447 查看
如果存在onTouch事件 肯定是要先执行onTouch事件,关键是看ontouch事件里面各个动作的返回值,他们决定了什么时候执行onClick事件和onLongClick事件;

所以要先从 OnTouch事件里面的ACTION_DOWN事件说起,他返回的是一个boolean值

有两种情况

(1)如果返回值 为true;

表示该View接受此按下动作,就是说这个点击动作的按下操作被中止,然后就是响应ACTION_UP事件。点击动作的按下操作被ACTION_DOWN

接受之后就结束了,所以之后的OnClick/OnLongClick事件就不会响应了。

(2)如果返回值 为false;

表示该View不接受此按下动作,响应完之后,按下操作继续往下发,之后是响应ACTION_UP事件,这里又有一个判断:

如果ACTION_UP事件返回True,表示ACTION_UP接受松开操作,松开操作中止;View会一直处于按下状态,之后View便会响应OnLongClick事件。

如果ACTION_UP事件返回false,表示ACTION_UP不接收松开操作,松开操作继续下发;因为按下与松开操作都没有被中止,所以之后View就会响应OnClick事件。

那么问题就来了,因为onClick事件本身就反生在onTouch事件中,所以有时候两个事件有时会同时执行,怎么解决这样的冲突了,本人给一种很笨的方法,代码如下:

public boolean onTouch(View v, MotionEvent event) {
//down事件
if (event.getAction() == MotionEvent.ACTION_DOWN) {
x1 = event.getX();
y1 = event.getY();
}
//up事件
if (event.getAction() == MotionEvent.ACTION_UP) {
x2 = event.getX();
y2 = event.getY();
if (Math.abs(x1 - x2) < 6) {
return false;// 距离较小,当作click事件来处理
}
if(Math.abs(x1 - x2) >60){ // 真正的onTouch事件
}
}
return true;// 返回true,不执行click事件
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: