android布局界面点击事件在控件间的传递路径

android的界面触摸事件分为三种,action_down,action_move,action_up这几个事件。这里我们主要说一下action_down事件的传递。
首先android的事件是从父控件->子空间,再从子控件->父控件。U型传递。
android的控件分为两种viewgroup和view;
viewgroup处理事件时有三个方法,dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent
view处理事件有两个方法,dispatchTouchEvent、onTouchEvent

Activity只有dispatchTouchEvent、onTouchEvent两个事件

从我们点击屏幕开始,这个时候我们的最外层的布局控件接收到action_down事件,由于布局文件基本都是继承于viewgroup,首先是dipatchTouchEvent接收到事件,然后传递给onInterceptTouchEvent,它确定是不是拦截事件,如果拦截事件,这时action_down事件就会传递到布局控件的onTouchEvent事件中处理掉,结束传递。如果不拦截事件,就继续向子控件传递,进入到子控件的dispatchTouchEvent事件中,如果子控件也是布局控件就继续上个流程,如果不是就分发到子控件的onTouchEvent事件中,这时如果子控件的onTouchEvent事件中没有对事件进行处理,也就是返回false。就会传递回上一层的父控件的onTouchEvent事件中,如果父控件也不处理,就继续向上一层的onTouchEvent传递。

ACTION_DOWN事件传递路径
action_down事件传递路径
ACTION_MOVE ACTION_UP事件传递路径主要受ACTION_DOWN的影响:
ACTION_DOWN的起点就是ACTION_UP,ATION_MOVE的起点,ACTION_DOWN事件被消费的终点就是ACTION_UP,ACTION_MOVE的终点。起点和终点之间的最短传递路径就是ACTION_UP,ACTION_MOVE的路径。
如果Action_down事件,从Activity的dispatchevent事件一路传到了Activity的ontouchevent事件,那么Action_up,Action_move事件就取Action_down事件传递中最快把起点和终点连接起来的路径。

例1,如果Action_down的传递路径如下:
在这里插入图片描述
那么Action_move,Action_up的传递路径:可以看到起点是Action_down的起点,终点是Action_down事件一直没有被消费最终传到了Activity的ontouchevent事件中。
在这里插入图片描述
例2,Action_down的起点不变,但是Action_down事件在ViewGroup的ontouchevent事件中被消费了。
在这里插入图片描述
那么,Action_move,Action_up事件起点是一样的,终点也是一样的,只不过传递的路径不需要经过ViewGroup的oninterceptEvent
事件。
在这里插入图片描述
综上所诉,Action_move,Action_up事件的传递路径的起点和终点和Action_down事件是一样的,只是Action_move,Action_up事件的传递路径把Action_down中间多余的传递步骤去掉了,取了最短路径。

哪些方法可以消费Action_down事件是重点
onTouch事件在onTouchEvent事件之前被调用,onClick事件在action_up处理结束之后被调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值