android ontouch事件传递分析与指南
2013-08-23 18:11
447 查看
本文暂不考虑事件分发(dispatchTouchEvent)
讨论此事情一定要明白两件事,一是 事件的传递, 二是 事件的处理;
首先设置下 情景:
如上图:子控件没有完全覆盖父控件
一、当点击 上图 蓝色部分的时候,只响应父控件的一些相关事件,没有事件传递事件。
二、当点击 橘黄色部分的时候 ,则正是我们要讲的事件传递与处理的事件;
( 1 ) 事件传递
首先要明白事件的传递是从 父控件向子控件 逐级传递的。那么这种情况下就要看各个控件的onInterceptTouchEvent拦截事件了。
如果在onInterceptTouchEvent 中,相应的事件(down,move,up) 的返回值为true,表示 该控件 拦截了相应的事件,那么
这个事件就不能传递到子控件,这时他就会执行 该控件 里的onTouchEvent里的相关事件;
( 2 ) 事件处理
要知道事件的响应是从子控件到父控件 逐级传递的。 也就是说,当事件已经传递到了子控件(其父控件并没有拦截,父控件onInterceptTouchEvent中return false)
所以,我们应该从子控件分析入手:
按照上面所说,down事件没有被父控件拦截
如下:父控件中的onInterceptTouchEvent事件
则事件就传递到了子控件
现在在看看 事件处理 机制:
首先看子控件的 onTouchEvent 的down事件,这个事件的返回值很重要
! ) 如果返回值为true
这表示该子控件的down事件消耗过,也就是说系统已经知道他执行过,这时候他才会执行子控件中的move 和 up事件,那move 和 up事件还是重复刚才down事件的动作, 从 父控件onInterceptTouchEvent拦截事件 开始来判断是否拦截,然后子控件的move,up事件响应。原理同down事件;
!! ) 如果返回值为false
这表示该子控件的down事件没有消耗过,也就是说系统不知道他执行过,那么后面的子控件的move 和 up事件就不能执行了。
这时候 down事件的处理 就会接着传递到 父控件的ononTouchEvent 事件中处理,响应的move和up事件也就只能在父控件中执行了(相关分析与子控件中的down事件一样)
总结:
事件传递只与onInterceptTouchEvent事件有关,事件处理与ononTouchEvent 的各事件返回值false或者是true有关;
讨论此事情一定要明白两件事,一是 事件的传递, 二是 事件的处理;
首先设置下 情景:
如上图:子控件没有完全覆盖父控件
一、当点击 上图 蓝色部分的时候,只响应父控件的一些相关事件,没有事件传递事件。
二、当点击 橘黄色部分的时候 ,则正是我们要讲的事件传递与处理的事件;
( 1 ) 事件传递
首先要明白事件的传递是从 父控件向子控件 逐级传递的。那么这种情况下就要看各个控件的onInterceptTouchEvent拦截事件了。
如果在onInterceptTouchEvent 中,相应的事件(down,move,up) 的返回值为true,表示 该控件 拦截了相应的事件,那么
这个事件就不能传递到子控件,这时他就会执行 该控件 里的onTouchEvent里的相关事件;
( 2 ) 事件处理
要知道事件的响应是从子控件到父控件 逐级传递的。 也就是说,当事件已经传递到了子控件(其父控件并没有拦截,父控件onInterceptTouchEvent中return false)
所以,我们应该从子控件分析入手:
按照上面所说,down事件没有被父控件拦截
如下:父控件中的onInterceptTouchEvent事件
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: { System.out.println("parent_intercept_down:"+1111111); break; } case MotionEvent.ACTION_MOVE: { System.out.println("parent_intercept_move:"+1111111); break; } case MotionEvent.ACTION_UP: { System.out.println("parent_intercept_up:"+1111111); break; } default: break; } return false; }
则事件就传递到了子控件
现在在看看 事件处理 机制:
首先看子控件的 onTouchEvent 的down事件,这个事件的返回值很重要
! ) 如果返回值为true
这表示该子控件的down事件消耗过,也就是说系统已经知道他执行过,这时候他才会执行子控件中的move 和 up事件,那move 和 up事件还是重复刚才down事件的动作, 从 父控件onInterceptTouchEvent拦截事件 开始来判断是否拦截,然后子控件的move,up事件响应。原理同down事件;
!! ) 如果返回值为false
这表示该子控件的down事件没有消耗过,也就是说系统不知道他执行过,那么后面的子控件的move 和 up事件就不能执行了。
这时候 down事件的处理 就会接着传递到 父控件的ononTouchEvent 事件中处理,响应的move和up事件也就只能在父控件中执行了(相关分析与子控件中的down事件一样)
总结:
事件传递只与onInterceptTouchEvent事件有关,事件处理与ononTouchEvent 的各事件返回值false或者是true有关;
相关文章推荐
- Android onTouch事件分析和传递机制
- 详细分析Android中onTouch事件传递机制
- 细说Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)
- Android onTouch事件传递机制
- [置顶] Android开发知识(八):Android事件处理机制:事件分发、传递、拦截、处理机制的原理分析(中)
- 详细剖析 android onInterceptTouchEvent(MotionEvent event) 和 onTouchEvent(MotionEvent event) 的事件传递机制
- Android Touch事件传递原理分析
- Android事件传递机制分析
- Android onTouch事件传递机制
- Android事件传递机制详解及最新源码分析——View篇
- 详细剖析 android onInterceptTouchEvent(MotionEvent event) 和 onTouchEvent(MotionEvent event) 的事件传递机制
- android事件传递机制测试分析
- Android View事件传递与源码分析
- Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)
- Android基础之onTouch事件传递机制
- Android webkit 事件传递流程通道分析
- Android onTouch事件传递机制
- Android onTouch 点击事件执行两次分析
- 细说Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)
- 细说Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)