Android事件处理机制

该文章参考了
lc_miao的博客(https://blog.csdn.net/lc_miao/article/details/78251504)
博主的文章,如有侵权请通知删除

在平时开发中或者面试中都会遇到这样一个问题,ScrollView和RecyvlerView的滑动冲突,如何处理这种问题。

今天这篇文章就是我来总结一下Android事件拦截机制。
在Android的布局文件设置在Window窗口布局上的RecorView里的ContentView上,很多情况布局文件里都会出现嵌套布局,当出现多个ViewGroup嵌套时,当点击其中的View控件时,我们的Android系统是如何进行处理的呢?
Android中为我们封装好了一个MotionEvent类,使得我们对屏幕的一系列操作事件都可以记录在这个MotionEvent里面。
三种情况分别对应MotionEvent的:

  • MotionEvent.ACTION_UP
  • MotionEvent.ACTION_MOVE
  • MotionEvent.ACTION_DOWN

在我们手指按下的时候触发MotionEvent.ACTION_UP事件,可能我们手指不小心一动,会触发MotionEvent.ACTION_MOVE滑动事件,接着手指离开屏幕,会触发MotionEvent.ACTION_DOWN事件,我们把这个过程成为一个事件序列,也就是说一个事件序列里面必然包含有ACTION_UP事件和ACTION_DOWN事件,如果有伴随着滑动的话则就有包含ACTION_MOVE事件。MotionEvent还封装了其他很多事件的信息,比如坐标、时间等等。
在ViewGroup中,涉及到事件处理过程的有三个重要的方法,分别是:

// 对事件进行拦截,是否向下传递事件
public boolean onInterceptTouchEvent(MotionEvent ev) 
// 对事件进行分发,是否将事件分发到下一个内部目标控件
public boolean dispatchTouchEvent(MotionEvent ev) 
// 对事件进行消费,是否消费此事件
public boolean onTouchEvent(MotionEvent event) 

在ViewGroup类中,onInterceptTouchEvent方法总是返回false,表示默认是不拦截事件的,除非去重写ViewGroup类来返回true。而onTouchEvent方法的返回值表示是否消费(返回true则消费)此事件,消费的意思就是说ViewGroup自己处理了这个事件,不再传递到上一层的onTouchEvent去。
而在View中,与ViewGroup相比,同样有dispatchTouchEvent方法和onTouchEvent方法。但是没有onInterceptTouchEvent这个方法,因为在一个View中,已经是View树的叶子节点,它没有下一级的视图嵌套,所以不需要决定是否拦截事件,它自己就可以处理事件了。
在View类中,只要该View是可以点击的,那么默认都会在onTouchEvent返回true,表示自己消费了这个事件,不再传递到上一级ViewGroup去。
下面一张图来助于理解
在这里插入图片描述
接下来额外的一个知识点是:
当长按一个View的时候它的方法执行顺序是什么?
经过log测试得出来的结果是:onTouch -> onTouchEvent -> onLongClick -> onClick
当onTouch方法返回true的时候,事件就此结束了,就不会执行后续的方法了。
当onLongClick方法返回true的时候,事件就此结束了,就不会执行后续的方法了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值