Android--Touch 事件的分发和消费机制
2016-10-12 12:11
281 查看
Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev)、onInterceptTouchEvent(MotionEvent
ev)、onTouchEvent(MotionEvent ev);能够响应这些方法的控件包括:ViewGroup 及其子类、Activity。方法与控件的对应关系如下表所示:
用一个实例来说明。简单实现一个小功能:当触摸蓝色区域时,红色区域及最外成区域不响应,只有蓝色区域响应。当触摸红色区域时,只有红色区域响应,其它不响应。
父子view关系如下:
最外层 ---> 红色区域 --->蓝色区域
onInterceptTouchEvent():如果返回值为true,则阻止向下传播touch事件。(是向下方向,这里是 :最外层 ---> 红色区域 --->蓝色区域 )。
onTouchEvent():如果返回值为true,则阻止向上传播touch事件。(是向上方向,这里是 :最外层 <---红色区域 -<--蓝色区域 )。
事件方法的执行顺序:
dispatchTouchEvent --->onInterceptTouchEvent--->getTouchAction
=======TouchEventActivity.dispatchTouchEvent:ACTION_DOWN
附上触摸蓝色区域的Log
09-23 12:03:54.299 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.dispatchTouchEvent:ACTION_DOWN
09-23 12:03:54.299 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.onInterceptTouchEvent:ACTION_DOWN
09-23 12:03:54.299 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventChild.dispatchTouchEvent:ACTION_DOWN
09-23 12:03:54.299 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventChild.onInterceptTouchEvent:ACTION_DOWN
09-23 12:03:54.300 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventChild.onTouchEvent:ACTION_DOWN
09-23 12:03:54.353 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventActivity.dispatchTouchEvent:ACTION_UP
09-23 12:03:54.353 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.dispatchTouchEvent:ACTION_UP
09-23 12:03:54.353 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.onInterceptTouchEvent:ACTION_UP
09-23 12:03:54.354 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventChild.dispatchTouchEvent:ACTION_UP
09-23 12:03:54.354 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventChild.onTouchEvent:ACTION_UP
附上触摸红色区域的log
09-23 12:05:42.491 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventActivity.dispatchTouchEvent:ACTION_DOWN
09-23 12:05:42.491 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.dispatchTouchEvent:ACTION_DOWN
09-23 12:05:42.492 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.onInterceptTouchEvent:ACTION_DOWN
09-23 12:05:42.492 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.onTouchEvent:ACTION_DOWN
09-23 12:05:42.492 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventActivity.onTouchEvent:ACTION_DOWN
09-23 12:05:42.545 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventActivity.dispatchTouchEvent:ACTION_UP
09-23 12:05:42.545 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventActivity.onTouchEvent:ACTION_UP
最外层:touch事件相关方法:
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
Log.d(TouchEventUtil.TAG,"=======TouchEventActivity.dispatchTouchEvent:"
+ TouchEventUtil.getTouchAction(event.getAction()));
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event){
Log.d(TouchEventUtil.TAG,"=======TouchEventActivity.onTouchEvent:"
+ TouchEventUtil.getTouchAction(event.getAction()));
return super.onTouchEvent(event);
}
红色层:touch事件相关方法:
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
Log.d(TouchEventUtil.TAG,"=======TouchEventFather.dispatchTouchEvent:"
+ TouchEventUtil.getTouchAction(event.getAction()));
return super.dispatchTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event){
Log.d(TouchEventUtil.TAG,"=======TouchEventFather.onInterceptTouchEvent:"
+ TouchEventUtil.getTouchAction(event.getAction()));
return super.onInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event){
Log.d(TouchEventUtil.TAG,"=======TouchEventFather.onTouchEvent:"
+ TouchEventUtil.getTouchAction(event.getAction()));
return true;
}
蓝色层:touch事件相关方法:
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
Log.d(TouchEventUtil.TAG,"=======TouchEventFather.dispatchTouchEvent:"
+ TouchEventUtil.getTouchAction(event.getAction()));
return super.dispatchTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event){
Log.d(TouchEventUtil.TAG,"=======TouchEventFather.onInterceptTouchEvent:"
+ TouchEventUtil.getTouchAction(event.getAction()));
return super.onInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event){
Log.d(TouchEventUtil.TAG,"=======TouchEventFather.onTouchEvent:"
+ TouchEventUtil.getTouchAction(event.getAction()));
return true;
}
ev)、onTouchEvent(MotionEvent ev);能够响应这些方法的控件包括:ViewGroup 及其子类、Activity。方法与控件的对应关系如下表所示:
Touch 事件相关方法 | 方法功能 | ViewGroup | Activity |
public boolean dispatchTouchEvent(MotionEvent ev) | 事件分发 | Yes | Yes |
public boolean onInterceptTouchEvent(MotionEvent ev) | 事件拦截 | Yes | No |
public boolean onTouchEvent(MotionEvent ev) | 事件响应 | Yes | Yes |
父子view关系如下:
最外层 ---> 红色区域 --->蓝色区域
onInterceptTouchEvent():如果返回值为true,则阻止向下传播touch事件。(是向下方向,这里是 :最外层 ---> 红色区域 --->蓝色区域 )。
onTouchEvent():如果返回值为true,则阻止向上传播touch事件。(是向上方向,这里是 :最外层 <---红色区域 -<--蓝色区域 )。
事件方法的执行顺序:
dispatchTouchEvent --->onInterceptTouchEvent--->getTouchAction
=======TouchEventActivity.dispatchTouchEvent:ACTION_DOWN
附上触摸蓝色区域的Log
09-23 12:03:54.299 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.dispatchTouchEvent:ACTION_DOWN
09-23 12:03:54.299 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.onInterceptTouchEvent:ACTION_DOWN
09-23 12:03:54.299 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventChild.dispatchTouchEvent:ACTION_DOWN
09-23 12:03:54.299 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventChild.onInterceptTouchEvent:ACTION_DOWN
09-23 12:03:54.300 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventChild.onTouchEvent:ACTION_DOWN
09-23 12:03:54.353 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventActivity.dispatchTouchEvent:ACTION_UP
09-23 12:03:54.353 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.dispatchTouchEvent:ACTION_UP
09-23 12:03:54.353 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.onInterceptTouchEvent:ACTION_UP
09-23 12:03:54.354 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventChild.dispatchTouchEvent:ACTION_UP
09-23 12:03:54.354 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventChild.onTouchEvent:ACTION_UP
附上触摸红色区域的log
09-23 12:05:42.491 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventActivity.dispatchTouchEvent:ACTION_DOWN
09-23 12:05:42.491 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.dispatchTouchEvent:ACTION_DOWN
09-23 12:05:42.492 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.onInterceptTouchEvent:ACTION_DOWN
09-23 12:05:42.492 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventFather.onTouchEvent:ACTION_DOWN
09-23 12:05:42.492 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventActivity.onTouchEvent:ACTION_DOWN
09-23 12:05:42.545 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventActivity.dispatchTouchEvent:ACTION_UP
09-23 12:05:42.545 15091-15091/com.zhuticity.eebbk.zhuticity D/liudezu_tag: =======TouchEventActivity.onTouchEvent:ACTION_UP
最外层:touch事件相关方法:
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
Log.d(TouchEventUtil.TAG,"=======TouchEventActivity.dispatchTouchEvent:"
+ TouchEventUtil.getTouchAction(event.getAction()));
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event){
Log.d(TouchEventUtil.TAG,"=======TouchEventActivity.onTouchEvent:"
+ TouchEventUtil.getTouchAction(event.getAction()));
return super.onTouchEvent(event);
}
红色层:touch事件相关方法:
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
Log.d(TouchEventUtil.TAG,"=======TouchEventFather.dispatchTouchEvent:"
+ TouchEventUtil.getTouchAction(event.getAction()));
return super.dispatchTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event){
Log.d(TouchEventUtil.TAG,"=======TouchEventFather.onInterceptTouchEvent:"
+ TouchEventUtil.getTouchAction(event.getAction()));
return super.onInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event){
Log.d(TouchEventUtil.TAG,"=======TouchEventFather.onTouchEvent:"
+ TouchEventUtil.getTouchAction(event.getAction()));
return true;
}
蓝色层:touch事件相关方法:
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
Log.d(TouchEventUtil.TAG,"=======TouchEventFather.dispatchTouchEvent:"
+ TouchEventUtil.getTouchAction(event.getAction()));
return super.dispatchTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event){
Log.d(TouchEventUtil.TAG,"=======TouchEventFather.onInterceptTouchEvent:"
+ TouchEventUtil.getTouchAction(event.getAction()));
return super.onInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event){
Log.d(TouchEventUtil.TAG,"=======TouchEventFather.onTouchEvent:"
+ TouchEventUtil.getTouchAction(event.getAction()));
return true;
}
相关文章推荐
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制(一)
- Android Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制