Android时间分发
梳理androidUI事件分发流程,解决appUI事件冲突问题:
当一个大按钮作为背景,上面放一个小按钮,这时点击小按钮,小按钮是否会响应单击事件?
答案:有可能背景响应了 单击事件,而让你的预期大跌眼镜。
这里简单做以下笔记:
假设背景容器布局是RelativeLayout,上面有一个Button。
OnInterceptTouchEvent : RelativeLayout容器布局特有的事件分发函数
onTouchListener 接口的onTouch函数
onTouchEvent
onDispathTouchEvent
onClick
1. 当RelativeLayout 的OnInterceptTouchEvent返回true表示父容器拦截手势事件,不再分发给子view:Button,假设Down事件是0,Move是2,Up是1.
当用手指点击Button按钮时,这时事件分发的调用过程是:
已复验,以下结论正确,确实只调用了一次OnInterceptTouchEvent return true;s
0 , OnInterceptTouchEvent 返回true , 由 RelativeLayout响应
0 , onTouchListener--onTouch返回false , 由 RelativeLayout响应,调用自己的 onTouch
0, onTouchEvent 返回true 由 RelativeLayout响应,
0, onDispathTouchEvent返回true 由 RelativeLayout响应,
==================================================
2 , onTouchListener--onTouch返回false ,由 RelativeLayout响应,调用自己的 onTouch
2, onTouchEvent 返回true 由 RelativeLayout响应,
2, onDispathTouchEvent返回true 由 RelativeLayout响应,
==============================================
1 , onTouchListener--onTouch返回false ,由 RelativeLayout响应,调用自己的 onTouch
1, onTouchEvent 返回true 由 RelativeLayout响应,
1, onDispathTouchEvent返回true 由 RelativeLayout响应,
========================================
onClick , 单击事件最终被RelativeLayout响应了,而不是你点击的Button,所以点击按钮不会有反应。
2. 当RelativeLayout 的OnInterceptTouchEvent返回false表示父容器不拦截手势事件,事件会向下分发,传递给子View:Button,假设Down事件是0,Move是2,Up是1.
当用手指点击Button按钮时,这时事件分发的调用过程是:
已复验,以下结论正确。
0 , OnInterceptTouchEvent 返回false , 由 RelativeLayout响应
0 , onTouchListener--onTouch返回false ,由 Button响应,调用自己的 onTouch
0, onTouchEvent 返回true 由 Button响应,
0, onDispathTouchEvent返回true 由 Button响应,
0, onDispathTouchEvent返回true 由 RelativeLayouton响应,
===============================================
2, OnInterceptTouchEvent 返回false , 由 RelativeLayout响应
2 , onTouchListener--onTouch返回false ,由 Button响应,调用自己的 onTouch
2, onTouchEvent 返回true 由 Button响应,
2, onDispathTouchEvent返回true 由 Button响应,
2, onDispathTouchEvent返回true 由 RelativeLayouton响应,
====================================================
1, OnInterceptTouchEvent 返回false , 由 RelativeLayout响应
1 , onTouchListener--onTouch返回false ,由 Button响应,调用自己的 onTouch
1, onTouchEvent 返回true 由 Button响应
1, onDispathTouchEvent返回true 由 Button响应
1, onDispathTouchEvent返回true 由 RelativeLayout响应
=====================================================
onClick , 单击事件最终被Button响应了,这次点击按钮终于有反应了。
3. 当RelativeLayout 的OnInterceptTouchEvent返回false,但是Button的onTouchEvent或dispatchTouchEvent返回false时,0事件传递给Button那里,Button不处理,再向上回传给父容器RelavieLyout
已复验,以下结论正确,确实只调用了一次OnInterceptTouchEvent
0 , OnInterceptTouchEvent 返回false , 由 RelativeLayout响应
0 , onTouchListener--onTouch返回false ,由 Button响应,调用自己的 onTouch
0, onTouchEvent 返回false 由 Button响应,
0, onDispathTouchEvent返回false 由 Button响应,
==============================================
0, onTouchListener--onTouch返回false ,由 RelativeLayout响应,调用自己的 onTouch
0, onTouchEvent 返回true 由 RelativeLayout响应,
0, onDispathTouchEvent返回true 由 RelativeLayouton响应,
=============================================
2 , onTouchListener--onTouch返回false ,由 RelativeLayout响应,调用自己的 onTouch
2, onTouchEvent 返回true 由 RelativeLayout响应,
2, onDispathTouchEvent返回true 由 RelativeLayouton响应,
=============================================
1 , onTouchListener--onTouch返回false ,由 RelativeLayout响应,调用自己的 onTouch
1, onTouchEvent 返回true 由 RelativeLayout响应,
1, onDispathTouchEvent返回true 由 RelativeLayouton响应,
onclick最终由RelativeLayou响应
文章来源: blog.csdn.net,作者:冉航--小虾米,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/gaoxiaoweiandy/article/details/118379923
- 点赞
- 收藏
- 关注作者
评论(0)