黑马程序员技术交流社区

标题: 【济南中心】Android事件分发机制(四) [打印本页]

作者: 大山哥哥    时间: 2017-6-30 19:07
标题: 【济南中心】Android事件分发机制(四)
前面我们讲了绿色的LinearLayout和灰色的View之间是嵌套关系和并列关系的情况下。事件基本的分发流程。也就是说中间的这些空间都没有拦截也没有处理。下面我们来对比一下绿色的LinearLayout和灰色的View之间是嵌套关系和并列关系下,在LinearLayout中的onInterceptTouchEvent中返回true,事件的分发有什么异同。


我们先来分析一下绿色LinearLayout和灰色view是嵌套关系的时候,在LinearLayout的onInterceptTouchEvent中返回true的事件分发日志:
[AppleScript] 纯文本查看 复制代码
I/System.out: FrameLayout---->dispatchTouchEvent---start
I/System.out: FrameLayout---->onInterceptTouchEvent---start
I/System.out: FrameLayout---->onInterceptTouchEvent---end---false
I/System.out: LinearLayout---->dispatchTouchEvent---start
I/System.out: LinearLayout---->onInterceptTouchEvent---start
I/System.out: LinearLayout---->onInterceptTouchEvent---end---true
I/System.out: LinearLayout---->onTouchEvent---start
I/System.out: LinearLayout---->onTouchEvent---end---false
I/System.out: LinearLayout---->dispatchTouchEvent---end--->false
I/System.out: FrameLayout---->onTouchEvent---start
I/System.out: FrameLayout---->onTouchEvent---end---false
I/System.out: FrameLayout---->dispatchTouchEvent---end--->false


因为LinearLayout与View是嵌套关系。所以如果在LinearLayout的onInterceptTouchEvent中返回了true。也就是在LinearLayout中将事件拦截了。事件就会传递到LinearLayout的onTouchEvent中,而不会再向下,也就是view传递。

我们再来分析一下绿色LinearLayout和灰色view是并列关系的时候,也就是LinearLayout和View同时是FrameLayout的ziview的时候,在LinearLayout的onInterceptTouchEvent中返回true的事件分发日志:
[AppleScript] 纯文本查看 复制代码
I/System.out: FrameLayout---->dispatchTouchEvent---start
I/System.out: FrameLayout---->onInterceptTouchEvent---start
I/System.out: FrameLayout---->onInterceptTouchEvent---end---false
I/System.out: View---->dispatchTouchEvent---start
I/System.out: View---->onTouchEvent---start
I/System.out: View---->onTouchEvent---end---false
I/System.out: View---->dispatchTouchEvent---end--->false
I/System.out: LinearLayout---->dispatchTouchEvent---start
I/System.out: LinearLayout---->onInterceptTouchEvent---start
I/System.out: LinearLayout---->onInterceptTouchEvent---end---true
I/System.out: LinearLayout---->onTouchEvent---start
I/System.out: LinearLayout---->onTouchEvent---end---false
I/System.out: LinearLayout---->dispatchTouchEvent---end--->false
I/System.out: FrameLayout---->onTouchEvent---start
I/System.out: FrameLayout---->onTouchEvent---end---false
I/System.out: FrameLayout---->dispatchTouchEvent---end--->false


以为view和LinearLayout是并列关系。又因为view在LinearLayout的上面,所以事件从FrameLayout往下分发时,会先将事件分发到View中。如果view不处理。再将事件分发到Linearlayout。
如果我们将View的onTouchEvent中返回true,日志的情况是这样的:
[AppleScript] 纯文本查看 复制代码
I/System.out: FrameLayout---->dispatchTouchEvent---start
I/System.out: FrameLayout---->onInterceptTouchEvent---start
I/System.out: FrameLayout---->onInterceptTouchEvent---end---false
I/System.out: View---->dispatchTouchEvent---start
I/System.out: View---->onTouchEvent---start
I/System.out: View---->onTouchEvent---end---true
I/System.out: View---->dispatchTouchEvent---end--->true
I/System.out: FrameLayout---->dispatchTouchEvent---end--->true

也就说事件根本就不会分发到LinearLayout中。即在LinearLayout中做任何逻辑的是徒劳的。
同样的道理,如果是嵌套的关系,在LinearLayout中的onTouchEvent中返回了true。事件也不会分发到View中:
[AppleScript] 纯文本查看 复制代码
I/System.out: FrameLayout---->dispatchTouchEvent---start
I/System.out: FrameLayout---->onInterceptTouchEvent---start
I/System.out: FrameLayout---->onInterceptTouchEvent---end---false
I/System.out: LinearLayout---->dispatchTouchEvent---start
I/System.out: LinearLayout---->onInterceptTouchEvent---start
I/System.out: LinearLayout---->onInterceptTouchEvent---end---true
I/System.out: LinearLayout---->onTouchEvent---start
I/System.out: LinearLayout---->onTouchEvent---end---true
I/System.out: LinearLayout---->dispatchTouchEvent---end--->true
I/System.out: FrameLayout---->dispatchTouchEvent---end--->true


作者: baby14    时间: 2018-11-24 09:45
多谢分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2