触摸事件的两种实现方式
1. 设置触摸监听:setOnTouchListener
2. 重新onTouchEvent方法
以上两种都是如此:
如果返回true,代表消费事件,down、move、up
如果返回false,代表不消费事件,只能监听到down事件
如果两个都返回true:setOnTouchListener 有效
onTouchEvent 无效
控件是否能消费事件,主要取决于:dispatchTouchEvent 是否返回true
**api10 的view 源码:**
public boolean dispatchTouchEvent(MotionEvent event) {
if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
mOnTouchListener.onTouch(this, event)) {
return true;
}
return onTouchEvent(event);
}
如何让两个事件都有效:setOnTouchListener 返回false onTouchEvent返回true
点击事件 与 触摸事件
点击事件,是触摸事件的一种,是有down和up组合后的事件。
系统一旦发现有up事件发送,就会判断是否有点击监听,如果有则执行。
在super.onTouchEvent(); action_up逻辑:
mPerformClick = new PerformClick(); 代表的就是单击事件
系统默认会将单击事件发送到主线程,执行:
if (attachInfo != null) {
return attachInfo.mHandler.post(action);
}
如果发送主线程失败:
if (li != null && li.mOnClickListener != null) {
playSoundEffect(SoundEffectConstants.CLICK);
li.mOnClickListener.onClick(this);
return true;
}
取消事件:
action_cancle: 3
发生在中途抢苹果,父View处于礼貌,告诉子View一声:执行取消事件。
down : 0
move : 2
up: 1