这篇博文是在阅读了《Android开发艺术探索》(任玉刚),并在自己写了一个相关控件后进行总结的目的的博文,本文主要介绍自己从书中学到的Android点击事件的分发拦截相关知识点以作记录。
一、点击事件的流向
点击事件在Android系统中具体表示为MotionEvent,可以在可以通过其getAction() 方法获得点击事件的类型包括ACTION_DOWM(按下)、ACTION_MOVE(滑动)、ACTION_UP(抬起)。同时也可以获得点击事件的位置 ,getX()/getY() 获得是相对于当前view左上角的位置 ,getRawX()/getRawY() 获得的是相对手机屏幕左上角的位置。
点击事件先由Activity获得,并通过其Window传送给最外层的ViewGroup,之后点击事件就在这个ViewGroup中由外至内的传播,如果没有被拦截的话再由内至外的返回。
二、View点击事件分发机制
2.1 简介
点击事件主要由三个方法来完成:dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent,三个方法的参数都只有MotionEvent一个。
在事件能够传递到当前View的情况下,三个方法的相关情况:
dispatchTouchEvent 一定会被调用,用来进行点击事件的分发
onInterceptTouchEvent 表示是否拦截某个事件,不一定会被调用,如果当前View拦截了某个事件,那么在同一事件序列中此方法不会被再次调用
onTouchEvent 表示是否消耗当前事件,如果不消耗当前事件的话,则同一事件序列中当前View无法再次接收到事件。
引用书中的伪代码来勉强表示这三个方法的关系:
public boolean dispatchTouchEvent (MotionEvent ev){
boolean consume=false;
if(onInterceptTouchEvent (ev