写在前面,很高兴又和大家见面了,也有一丝庆幸,庆幸自己坚持了下来,使得又能在博客上与大家分享-。最近工作比较多,然后又去了一家教育机构兼职讲师,可能之后的分享会比较少了。 废话不多说进入正题吧
事件分发机制有多重要,相信众猿们都是知道的,在开发过程当中 布局嵌套 产生了滑动冲突问题,这里涉及到了时间分发机制的知识,在我们写自定义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()方法;
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之间的传递机制(含示例)
示例界面是这样的
示例代码 :地址 https://github.com/LidongWen/EventSummary
视频地址放在最后 ↓↓↓
视频中画的图
4、简单过一遍源码,通过源码再去论证我们的总结
视频地址放在最后 ↓↓↓ , 也可以看我的 7.0源码解读——事件分发机制
5、解决实际问题
5.1、ScrollerView嵌套一个非占满RecyclerView 滑动冲突;
视频地址放在最后 ↓↓↓ ,先来看效果:
来张镇楼图!
代码地址:https://github.com/LidongWen/EventSummary
文章相应视频:http://pan.baidu.com/s/1pL4sJ1L 密码:7ztl;
希望我的文章不会误导在观看的你,如果有异议的地方欢迎讨论和指正。
如果能给观看的你带来收获,那就是最好不过了。