android事件分发机制

简介

我们都了解到android上面的view控件是以树形的形式存在的,当我们点击最上层的view控件,这个控件的点击事件究竟分配给谁?那么接下来对于android的事件进行分析。

目录

1.android事件分发机制的起因
2. 三个重要的事件分发的方法
3. 事件分发流程

android事件分发机制的起因

android上面的view是树形结构的,从最顶层的Activity->viewGoup->..->view可能重叠在一起的,当我们点击view控件的时候,这个点击事件应该给谁呢?为了解决这个问题,就有了事件分发机制。

三个重要的事件分发的方法

我们先看一张Activity整体界面图:
这里写图片描述
Activity中包含一个ViewGroup(LinearLayout,FrameLayout…),已经viewGroup包含一个view(TextView,ImageView…),当我们点击这个view的时候,所产生的事件做出总结。
1. Android中事件分发顺序:Activity(Window) -> ViewGroup -> View
2. 事件分发过程由dispatchTouchEvent() 、onInterceptTouchEvent()和onTouchEvent()三个方法协助完成。
这里写图片描述
其中:
super:调用父类方法
true:消费事件,即事件不继续往下传递
false:不消费事件,事件也不继续往下传递 /交给父控件onTouchEvent()处理

事件分发流程

dispatchTouchEvent方法内容里处理的是分发过程。可以理解为从A->B->C一层层分发的动作
dispatchTouchEvent的返回值则代表是否将事件分发出去用掉了,自己用或者给某一层子级用都算分发成功。比如:A把一块蛋糕吃了,整件事情就结束,A把蛋糕给B,B可以选择吃或不吃,吃的话自己处理玩,跟C没关系,不吃的话就会给C,C也不想吃的话就会回传B,B不想吃回传A,然后事件结束。
onInterceptTouchEvent会在第一轮从父到子的时候在分发时调用,以它去决定是否拦截掉此事件不再向下分发。如果拦截下来,就会调用自己的onTouchEvent处理;如果不拦截,则继续向下传递
onTouchEvent代表消费掉事件。方法内容是具体的事件处理方法,如何处理点击滑动等。
onTouchEvent的返回值则代表对上级的反馈,通知这个东西我用掉啦,然后他的父级就会让分发方法也返回true。
Android如何让父控件不拦截子控件的事件?

请求父控件不拦截子空间的触摸事件,自定义重写子view的dispatchTouchEvent()方法: 
@Override 
public boolean dispatchTouchEvent(MotionEvent ev) { 
getParent().requestDisallowInterceptTouchEvent(true); 
return super.dispatchTouchEvent(ev); 
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值