简介
我们都了解到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);
}