Android 事件分发机制总结

写在前面,很高兴又和大家见面了,也有一丝庆幸,庆幸自己坚持了下来,使得又能在博客上与大家分享-。最近工作比较多,然后又去了一家教育机构兼职讲师,可能之后的分享会比较少了。 废话不多说进入正题吧


事件分发机制有多重要,相信众猿们都是知道的,在开发过程当中 布局嵌套 产生了滑动冲突问题,这里涉及到了时间分发机制的知识,在我们写自定义view的时候 百分之90 的情况下都要重写 ontouchevent()方法,所以说事件分发机制与我们的开发息息相关,再加上这一块的知识一直是面试的经典问题,所以总结一下事件分发机制是势在必行的。

本文/视频将会从以下几个小节为顺序来梳理一下android事件分发机制知识,最后通过总结 来解决我们开发当中会碰到过的一个常见的滑动冲突问题。 目录如下:

· 1、基础概念、方法
· 2、事件
  · 2.1、事件是什么,如何产生的
  · 2.2、事件类型
· 3、事件在view之间的传递机制(含示例)
· 4、简单过一遍源码,通过源码再去论证我们的总结
· 5、解决实际问题
  · 5.1、ScrollerView嵌套一个非占满RecyclerView 滑动冲突;

1、基础概念、方法

1、事件是在哪里分发传递的呢?
答: 事件在 Activity、ViewGroup、View 之间进行分发传递,且是当Activity、VIewGroup、view为嵌套关系的时候才会分发;

2、主线方法

1、分发 dispatchTouchEvent
2、拦截 onInterceptTouchEvent
3、消费 onTouchEvent

其中 Activity、view当中 只有 分发 与消费 方法,ViewGroup当中才有 拦截方法;

3、源码当中涉及到的一些比较重要的方法
1、requestDisallowInterceptTouchEvent(boolean ):通知父类是否执行拦截操作 ,如果调用了父类的requestDisallowInterceptTouchEvent(boolean) 方法,且参数传 true 那么父类不会调用自身的拦截方法,false 反之.

2、performClick() 执行点击事件;内部会去调用mOnClickListener.onClick(this)
3、ontouchlistener内部有个ontouch方法,ontouch方法的返回值 决定是否调用onTouchEvent()方法;

Android 事件分发机制总结_第1张图片

2、事件

我们在 Activity、ViewGroup、View当中传递的对象,就是我们的事件。 事件 在代码中 是MotionEvent 里面包含事件的行为 action ,手指的坐标位置等信息。

2.1、事件是什么,如何产生的

手指与屏幕进行交互的时候会产生一系列的对象(其中包括类型、坐标等等信息),这些对象即事件 代码中为 MotionEvent;

2.2、事件类型

2.2.1 、常用的 事件类型有以下几个:
1、MotionEvent.ACTION_DOWN:按下View(所有事件的开始)
2、MotionEvent.ACTION_MOVE:滑动View
3、MotionEvent.ACTION_CANCEL:非人为原因结束本次事件
4、MotionEvent.ACTION_UP:抬起View(与DOWN对应)

2.2.2 、那么一根手指 从 接触屏幕-滑动-离开屏幕 会产生哪些时间呢?

手指按下 产生一个 ACTION_DOWN 行为的 事件;
手指滑动会产生多个 ACTION_MOVE行为的事件;
手指离开屏幕会产生一个 ACTION_UP行为的事件;

3、事件在view之间的传递机制(含示例)

示例界面是这样的

Android 事件分发机制总结_第2张图片
事件分发示例图

示例代码 :地址 https://github.com/LidongWen/EventSummary
视频地址放在最后 ↓↓↓

视频中画的图

Android 事件分发机制总结_第3张图片
android事件分发机制.png

4、简单过一遍源码,通过源码再去论证我们的总结

视频地址放在最后 ↓↓↓ , 也可以看我的 7.0源码解读——事件分发机制

5、解决实际问题

5.1、ScrollerView嵌套一个非占满RecyclerView 滑动冲突;

视频地址放在最后 ↓↓↓ ,先来看效果:

Android 事件分发机制总结_第4张图片

来张镇楼图!


Android 事件分发机制总结_第5张图片
镇楼图

代码地址:https://github.com/LidongWen/EventSummary
文章相应视频:http://pan.baidu.com/s/1pL4sJ1L 密码:7ztl;


希望我的文章不会误导在观看的你,如果有异议的地方欢迎讨论和指正。
如果能给观看的你带来收获,那就是最好不过了。

人生得意须尽欢, 桃花坞里桃花庵
点个关注呗,对,不信你点试试?

你可能感兴趣的:(Android 事件分发机制总结)