自定义View(二)--表层浅析View的事件分发机制和滑动冲突

转载请注明出处:From李诗雨:http://blog.csdn.net/cjm2484836553/article/details/54387722

不诗意的女程序猿不是好厨师~

这篇文章来得有些曲折,因为事件分发机制一直以来都是Android界的一个重难点。很多的初学者甚至中级开发者面对这个问题都还会困惑不已。当然,我肯定是属于“初学者和中级开发者”行列的,所以,我到现在也并没有完完全全的掌握所有的事件分发机制。什么?!那我还敢写?!是的,我敢写,因为虽然我没有100%掌握,但是我掌握的部分还是足以解决大多数问题的。所以,还是天不怕地不怕的把我所知的给整理了一下。讲得不对的地方,还请前辈们指出,我再改,我一直认为“学习就是一个不断与错误磨合的过程”。
:本文实际创建于2017/5/1。原来的文章已经挪至自定义View(三)—自定义View整个流程的梳理与总结。


在上一篇的文章《自定义View(一)–View的基础概念,工作流程及生命周期的理解》中,我也提到了事件机制,那时讲得比较粗略,今天就让我们来更加全面地做一下总结。

View的事件分发机制

Android的事件分发机制会令很多人头大,它确实不易,但也没有传说中的那么冷酷无情。所以思考再三,我还是在标题上加了“表层浅析”这些字眼,以表示我对事件机制的敬畏之情。

本篇我也只对事件分发机制做简单的概括性介绍,虽简单,但却不失实用性。因为在具体的工作中有了这些基本而实用的东西,我们就有了顺利完成任务的筹码。这里我主要以点击事件的分发为主体来讲。

首先明确一下我们要分析的对象——MotionEvent,即点击事件。
还记得点击事件的分发过程涉及哪些重要的方法吗?
是的主要有三个:dispatchTouchEvent,onInterceptTouchEvent和onTouchEvent。
下面让我们来一一介绍:

①public boolean dispatchTouchEvent(MotionEvent event)
从方法名便可以知道它的作用就是:进行事件的分发。
只要事件能够传递给当前的View,那么该方法就一定会被调用,返回的结果受当前View的onTouchEvent和下级View的dispathchEvent方法的影响,返回为true,表示消费当前事件;返回为false,则表示不消费当前事件。

②public boolean onInterceptTouchEvent(MotionEvent event)
这个方法又顾名思义:它是用来判断是否拦截某个事件的,该方法会在dispatchTouchEvent方法的内部被调用。如果当前的View拦截了某个事件,那么在同一个事件序列当中,此方法就不会被再次调用了。返回true,表示拦截当前事件;返回false,则表示不拦截。

③public boolean onTouchEvent(MotionEvent event)
也是在dispatchTouchEvent方法中被调用,是用来处理点击事件的,返回结果表示是否消耗当前事件,如果不消耗,则在同一个事件序列中,当前View无法再次接收到事件。

说了这么多你是不是有点迷糊了?哎呦我去,话说,他们三个到底是什么关系呢?怎么感觉比三角恋还虐心呢?阁下稍安勿躁,在《Android开发艺术探索》一书中,有一段伪代码可以很好的表明这三者的关系,您请看:

public boolean <
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值