A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

前面我们讲了绿色的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

2 个回复

倒序浏览
多谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马