Android时间分发

举报
yd_57386892 发表于 2021/08/02 23:15:32 2021/08/02
【摘要】 梳理androidUI事件分发流程,解决appUI事件冲突问题: 当一个大按钮作为背景,上面放一个小按钮,这时点击小按钮,小按钮是否会响应单击事件? 答案:有可能背景响应了 单击事件,而让你的预期大跌眼镜。 这里简单做以下笔记: 假设背景容器布局是RelativeLayout,上面有一个Button。 OnInterceptTouchEvent :   &nb...

梳理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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。