其他分享
首页 > 其他分享> > Android事件分发机制

Android事件分发机制

作者:互联网

Android 事件分发机制详细讲解,推荐文章:https://www.jianshu.com/p/e99b5e8bd67b

在这里插入图片描述
在这里插入图片描述
上图是对事件分发机制的详细描述


1. 为什么会有事件分发机制

安卓上面的View是树形结构的,View可能会重叠在一起,当点击的地方有多个View可以响应的时候,这个点击事件应该给谁呢?为了解决这个问题,就有了事件分发机制。
PhoneWindow:是抽象类Window的实现类,抽象类Window是所有视图最顶层的容器,包括View视图的外观和行为都归Window管。
DecorView:PhoneWindow的内部类,通过DecorView传递信息给下面的View,下面的View也通过DecorView返回消息给PhoneWindow。

2.布局加载过程

用户执行Activity的setContentView方法,内部是PhoneWindow的setContentView方法,在PhoneWindow中完成DecorView的创建,PhoneWindow是window的实现类.
DecorView是Activity的根View,也是PhotoWindow的内部类,并且继承了Framlayout.
DecorView将屏幕氛围2个部分:titleView和contentView,我们平常加载的布局就是ContentView.

3.事件分发流程:

Activity——>PhoneWindow——>DecorView——>ViewGroup——>…——>View
事件分发机制使用的是责任链设计模式,从Activity如果传到最下层的View都没有组件处理该事件,该事件会依次回传到Activity。

4.onTouchListener,onTouchEvent和onClick的优先级别

onTouchListener—–>onTouchEvent—>onclick

5.View中为什么会有dispatchTouchEvent方法,它存在的意义是什么?

我们知道View可以注册很多监听事件(下文有详细),比如,触摸事件,单击事件,长按事件等,而且view也有自己的onTouchEvent方法,那么这么多事件应该由谁来调度管理呢?这就是是View中dispatchTouchEvent方法存在的意义。

6.View中为什么没有onInterceptTouchEvent事件拦截方法?

View最为事件传递的最末端,要么消费掉事件,要么不处理进行回传,根本没必要进行事件拦截

7.简述事件传递的流程

8.ViewGroup 和 View 同时注册了事件监听器(onClick等),哪个会执行?

事件优先给View,会被View消费掉,ViewGroup 不会响应。

9.当俩个或多个View重叠时,事件该如何分配?

当 View 重叠时,一般会分配给显示在最上面的 View,也就是后加载的View。

10.dispatchTouchEvent每次都会被调用吗?

是的,onInterceptTouchEvent则不会。

11.一旦有事件传递给view,view的onTouchEvent一定会被调用吗?

View没有onInterceptTouchEvent方法,一旦有事件传递给它,他的onTouchEvent就一定会被调用。

12.ViewGroup 默认拦截事件吗?

ViewGroup默认不拦截任何事件;看源码可以知道ViewGroup的onInterceptTouchEvent方法中只有一行代码:return false;

13.事件分为几个步骤?

down事件开头,up事件结尾,中间可能会有数目不定的move事件。

14.setOnTouchListener中onTouch的返回值表示什么意思?

onTouch方法返回true表示事件被消耗掉了,不会继续传递了,此时获取不到到OnClick和onLongClick事件;onTouch方法返回false表示事件没有被消耗,可以继续传递,此时,可以获取到OnClick和onLongClick事件;
同理 onTouchEvent 和 setOnLongClickListener 方法中的返回值表示的意义一样;

15.setOnLongClickListener的onLongClick的返回值表示什么?

返回false,长按的话会同时执行onLongClick和onClick;如果setOnLongClickListener返回true,表示事件被消耗,不会继续传递,只执行longClick;

16.onTouch和onTouchEvent的异同?

17.点击事件的传递过程?

Activity-Window-View。
从上到下依次传递,当然了如果你最低的那个view onTouchEvent返回false 那就说明他不想处理 那就再往上抛,都不处理的话最终就还是让Activity自己处理了。

18.如果某个view 处理事件的时候 没有消耗down事件 会有什么结果?

假如一个view,在down事件来的时候 他的onTouchEvent返回false, 那么这个down事件 所属的事件序列 就是他后续的move 和up 都不会给他处理了,全部都给他的父view处理。

19.如果view 不消耗move或者up事件 会有什么结果?

那这个事件所属的事件序列就消失了,父view也不会处理的,最终都给activity 去处理了。

20.enable是否影响view的onTouchEvent返回值?

不影响,只要clickable和longClickable有一个为真,那么onTouchEvent就返回true。

21.常见滑动冲突场景

场景1 —— 外部滑动方向与内部滑动方向不一致,比如ViewPager中包含ListView;
场景2 —— 外部滑动方向与内部滑动方向一致,比如ScrollView中包含ListView;
场景3 —— 上面两种情况的嵌套

22.滑动冲突处理规则?

通过判断是水平滑动还是竖直滑动来判断到底应该谁来拦截事件;可以根据水平和竖直两个方向的距离差或速度差来做判断

23.滑动冲突解决方式?

24.requestDisallowInterceptTouchEvent 可以在子元素中干扰父元素的事件分发吗?如果可以,是全部都可以干扰吗?

答:肯定可以,但是down事件干扰不了。

标签:分发,拦截,onTouchEvent,事件,Activity,Android,方法,机制,View
来源: https://blog.csdn.net/AliEnCheng/article/details/116788692