Android UI事件传递(Touch事件)

来源:互联网 发布:simon口语 知乎 编辑:程序博客网 时间:2024/04/29 22:57

    Android的事件类型分为按键事件屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件。

    一个最简单的屏幕触摸动作触发了一系列Touch事件,最基本的有三个:ACTION_DOWN、ACTION_MOVE和ACTION_UP。一次Touch事件即从ACTION_DOWN到ACTION_UP的整个过程。

    对于有子View的ViewGroup类,其触摸事件会经历一系列的分发处理过程。其中,最基本的处理方法有三个:dispatchTouchEvent(),onInterceptTouchEvent()以及onTouchEvent()。

    (1)public boolean dispatchTouchEvent(MotionEvent ev) — 分发TouchEvent
    (2)public boolean onInterceptTouchEvent(MotionEvent ev) — 拦截TouchEvent
    (3)public boolean onTouchEvent(MotionEvent ev) — 处理TouchEvent

    当TouchEvent发生时,Activity首先会将TouchEvent传递给最顶层的View(即DecorView,所有View的根View)。TouchEvent最先到达根View的dispatchTouchEvent,然后由dispatchTouchEvent方法进行分发:
    (a)如果dispatchTouchEvent返回true,则交给这个View的onTouchEvent处理(消耗掉了);
    (b)如果dispatchTouchEvent返回false,则交给这个View的interceptTouchEvent方法来决定是否要拦截这个事件——
    (c)如果interceptTouchEvent返回true,也就是拦截掉了(同样消耗掉了),则交给它的onTouchEvent来处理;如果interceptTouchEvent返回false,那么就将事件传递给子View,由子View的dispatchTouchEvent再来开始这个事件的分发。如此循环下去,直到得到合适的处理为止。

    如果事件传递到某一层的子View的onTouchEvent上、并且这个方法返回了false,那么该事件会从这个View往上传递(往父类传递),并且都是onTouchEvent接收。如果父类的onTouchEvent仍旧返回false,则继续往上传递,直到某一层的onTouchEvent能够处理为止(返回true),或者所有onTouchEvent都返回为false(此时,这个事件就会“消失”,并且接收不到下一次事件)。

    小结
    1. 在Touch事件的分发过程中,若返回值为true,则表示该事件被“消耗”了(或者说是被拦截了,得到处理了);若返回值为false,则表示该事件没有被消耗;
    2. 若dispatchTouchEvent方法和interceptTouchEvent方法均返回false,则需要将事件往下传递(父View到子View);但如果是onTouchEvent方法返回false,则需要将事件往上传递(子View到父View);
    3. 如果按照上述分发流程处理,结果还是没有消耗掉本次事件,则系统不会给你下一次事件,因为它会认为这次的事件阻塞了,没必要再给下一次。

    原文链接:http://androidll.iteye.com/blog/1553558

原创粉丝点击