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()方法;


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
视频地址放在最后 ↓↓↓

视频中画的图


android事件分发机制.png

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

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

5、解决实际问题

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

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


来张镇楼图!


镇楼图

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



作者:wenld_
链接:http://www.jianshu.com/p/e00b5668ee39
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中的点击事件分发是指在触摸屏幕上的某个位置按下并释放手指后,系统是如何将该事件分发给目标View的。点击事件分发涉及两个主要阶段:事件捕获和事件冒泡。 在事件捕获阶段,Android系统从顶层的父级View开始向下遍历整个View树,判断每个View是否需要处理该事件事件捕获是从父级View到子级View的遍历过程,直到找到最内层的可点击View或者没有View处理该事件为止。 接下来是事件冒泡阶段,触摸事件从最内层的View开始向上返回,依次经过包含它的每个父级View,并判断每个View是否需要处理该事件事件冒泡是从最内层View到最外层View的遍历过程,直到找到一个View处理该事件或者达到最外层的父级View为止。 在分发点击事件的过程中,每个View都可以通过重写相关的事件处理方法来拦截并处理事件,比如onTouchEvent()、onInterceptTouchEvent()和dispatchTouchEvent()等。这些方法可以根据需要进行定制,从而实现对事件的控制和处理。 事件分发机制是由ViewGroup和View共同实现的,通过相互协作完成点击事件的传递和处理。在此过程中,还有一些特殊情况需要考虑,比如View的可点击区域、事件的传递方向和拦截以及多个View同时处理点击事件等等。 总结来说,Android中的点击事件分发是通过事件捕获和事件冒泡的方式实现的,通过ViewGroup和View相互协作完成点击事件的传递和处理。开发者可以通过重写相关方法来控制和处理事件,实现自定义的交互逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值