Android事件分发机制分析

以前对事件分发还是一知半解,今天特意重新打印了分发前后的日志

  • dispatchTouchEvent

逐级往下分发,默认Activity执行完会执行下一个ViewGroup的分发方法,返回值为true
如果改成false (默认认为分发失败,执行上一级的触摸事件),该控件触摸事件也会被正常执行

  • onInterceptTouchEvent

打断事件,只有ViewGroup里头有该方法,进入ViewGroup分发事件后不会立即执行下一级的分发,而是进入是否打断事件,默认返回false,进入下一级的分发。
如果返回true会让该ViewGroup的onTouchEvent执行触摸事件

  • onTouchEvent

除了最终View默认返回true,ViewGroup和Activity都是false
消费事件,默认最终的View返回true,表示消费了事件。
如果View触摸事件down返回false,那么上级全部的触摸down事件都会执行,事件一直到window无法得到消费完成,后续move、up直接忽略。
但是如果执行到move事件才返回false ,后续move 事件仍能接收。

  • onTouch
    实现接口会回调这个方法,只要return true 后拦截,后续onTouchEvent都不会执行

如果点击在ViewGroup上,那么打断事件执行完(false)后执行VG的触摸事件,并返回false(同上行)

点击、长按、触摸

onTouch(接口方法体)->onTouchEvent(触摸事件)->onLongClick(长按事件)->onClick(点击事件) 分发

View onTouchEvent false

12-26 11:45:17.200 12449-12449/mobi.xiaowu.dispatchevent I/MY: MainActivityS dispatchTouchEvent: 按下
12-26 11:45:17.201 12449-12449/mobi.xiaowu.dispatchevent I/MY: MyViewGroupS dispatchTouchEvent: 按下
12-26 11:45:17.201 12449-12449/mobi.xiaowu.dispatchevent I/MY: MyViewGroupS onInterceptTouchEvent: 按下
12-26 11:45:17.201 12449-12449/mobi.xiaowu.dispatchevent I/MY: MyViewGroupE onInterceptTouchEvent: false按下
12-26 11:45:17.201 12449-12449/mobi.xiaowu.dispatchevent I/MY: MyButtonS dispatchTouchEvent: 按下
12-26 11:45:17.201 12449-12449/mobi.xiaowu.dispatchevent I/MY: MyButtonS onTouchEvent: 按下
12-26 11:45:17.201 12449-12449/mobi.xiaowu.dispatchevent I/MY: MyButtonE onTouchEvent: false按下
12-26 11:45:17.201 12449-12449/mobi.xiaowu.dispatchevent I/MY: MyButtonE dispatchTouchEvent: false按下
12-26 11:45:17.201 12449-12449/mobi.xiaowu.dispatchevent I/MY: MyViewGroupS onTouchEvent: 按下
12-26 11:45:17.201 12449-12449/mobi.xiaowu.dispatchevent I/MY: MyViewGroupE onTouchEvent: false按下
12-26 11:45:17.202 12449-12449/mobi.xiaowu.dispatchevent I/MY: MyViewGroupE dispatchTouchEvent: false按下
12-26 11:45:17.202 12449-12449/mobi.xiaowu.dispatchevent I/MY: MainActivityS onTouchEvent: 按下
12-26 11:45:17.202 12449-12449/mobi.xiaowu.dispatchevent I/MY: MainActivityE onTouchEvent: false按下
12-26 11:45:17.202 12449-12449/mobi.xiaowu.dispatchevent I/MY: MainActivityE dispatchTouchEvent: false按下
12-26 11:45:17.212 12449-12449/mobi.xiaowu.dispatchevent I/MY: MainActivityS dispatchTouchEvent: 抬起
12-26 11:45:17.212 12449-12449/mobi.xiaowu.dispatchevent I/MY: MainActivityS onTouchEvent: 抬起
12-26 11:45:17.212 12449-12449/mobi.xiaowu.dispatchevent I/MY: MainActivityE onTouchEvent: false抬起
12-26 11:45:17.213 12449-12449/mobi.xiaowu.dispatchevent I/MY: MainActivityE dispatchTouchEvent: false抬起

View onTouchEvent default = true

12-26 11:47:00.112 13973-13973/mobi.xiaowu.dispatchevent I/MY: MainActivityS dispatchTouchEvent: 按下
12-26 11:47:00.112 13973-13973/mobi.xiaowu.dispatchevent I/MY: MyViewGroupS dispatchTouchEvent: 按下
12-26 11:47:00.112 13973-13973/mobi.xiaowu.dispatchevent I/MY: MyViewGroupS onInterceptTouchEvent: 按下
12-26 11:47:00.112 13973-13973/mobi.xiaowu.dispatchevent I/MY: MyViewGroupE onInterceptTouchEvent: false按下
12-26 11:47:00.112 13973-13973/mobi.xiaowu.dispatchevent I/MY: MyButtonS dispatchTouchEvent: 按下
12-26 11:47:00.112 13973-13973/mobi.xiaowu.dispatchevent I/MY: MyButtonS onTouchEvent: 按下
12-26 11:47:00.113 13973-13973/mobi.xiaowu.dispatchevent I/MY: MyButtonE onTouchEvent: true按下
12-26 11:47:00.113 13973-13973/mobi.xiaowu.dispatchevent I/MY: MyButtonE dispatchTouchEvent: true按下
12-26 11:47:00.113 13973-13973/mobi.xiaowu.dispatchevent I/MY: MyViewGroupE dispatchTouchEvent: true按下
12-26 11:47:00.114 13973-13973/mobi.xiaowu.dispatchevent I/MY: MainActivityE dispatchTouchEvent: true按下
12-26 11:47:00.129 13973-13973/mobi.xiaowu.dispatchevent I/MY: MainActivityS dispatchTouchEvent: 抬起
12-26 11:47:00.130 13973-13973/mobi.xiaowu.dispatchevent I/MY: MyViewGroupS dispatchTouchEvent: 抬起
12-26 11:47:00.130 13973-13973/mobi.xiaowu.dispatchevent I/MY: MyViewGroupS onInterceptTouchEvent: 抬起
12-26 11:47:00.130 13973-13973/mobi.xiaowu.dispatchevent I/MY: MyViewGroupE onInterceptTouchEvent: false抬起
12-26 11:47:00.130 13973-13973/mobi.xiaowu.dispatchevent I/MY: MyButtonS dispatchTouchEvent: 抬起
12-26 11:47:00.130 13973-13973/mobi.xiaowu.dispatchevent I/MY: MyButtonS onTouchEvent: 抬起
12-26 11:47:00.130 13973-13973/mobi.xiaowu.dispatchevent I/MY: MyButtonE onTouchEvent: true抬起
12-26 11:47:00.130 13973-13973/mobi.xiaowu.dispatchevent I/MY: MyButtonE dispatchTouchEvent: true抬起
12-26 11:47:00.130 13973-13973/mobi.xiaowu.dispatchevent I/MY: MyViewGroupE dispatchTouchEvent: true抬起
12-26 11:47:00.130 13973-13973/mobi.xiaowu.dispatchevent I/MY: MainActivityE dispatchTouchEvent: true抬起

View onDispatchTouchEvent false

//表明分发未完成 无法传递到View的onTouchEvent事件 于是父控件执行onTouchEvent事件

12-26 12:11:09.026 5596-5596/mobi.xiaowu.dispatchevent I/MY: MainActivityS dispatchTouchEvent: 按下
12-26 12:11:09.027 5596-5596/mobi.xiaowu.dispatchevent I/MY: MyViewGroupS dispatchTouchEvent: 按下
12-26 12:11:09.027 5596-5596/mobi.xiaowu.dispatchevent I/MY: MyViewGroupS onInterceptTouchEvent: 按下
12-26 12:11:09.027 5596-5596/mobi.xiaowu.dispatchevent I/MY: MyViewGroupE onInterceptTouchEvent: false按下
12-26 12:11:09.027 5596-5596/mobi.xiaowu.dispatchevent I/MY: MyButtonS dispatchTouchEvent: 按下
12-26 12:11:09.027 5596-5596/mobi.xiaowu.dispatchevent I/MY: MyButtonE dispatchTouchEvent: false按下
12-26 12:11:09.027 5596-5596/mobi.xiaowu.dispatchevent I/MY: MyViewGroupS onTouchEvent: 按下
12-26 12:11:09.027 5596-5596/mobi.xiaowu.dispatchevent I/MY: MyViewGroupE onTouchEvent: false按下
12-26 12:11:09.027 5596-5596/mobi.xiaowu.dispatchevent I/MY: MyViewGroupE dispatchTouchEvent: false按下
12-26 12:11:09.027 5596-5596/mobi.xiaowu.dispatchevent I/MY: MainActivityS onTouchEvent: 按下
12-26 12:11:09.027 5596-5596/mobi.xiaowu.dispatchevent I/MY: MainActivityE onTouchEvent: false按下
12-26 12:11:09.028 5596-5596/mobi.xiaowu.dispatchevent I/MY: MainActivityE dispatchTouchEvent: false按下
12-26 12:11:09.045 5596-5596/mobi.xiaowu.dispatchevent I/MY: MainActivityS dispatchTouchEvent: 抬起
12-26 12:11:09.045 5596-5596/mobi.xiaowu.dispatchevent I/MY: MainActivityS onTouchEvent: 抬起
12-26 12:11:09.045 5596-5596/mobi.xiaowu.dispatchevent I/MY: MainActivityE onTouchEvent: false抬起
12-26 12:11:09.045 5596-5596/mobi.xiaowu.dispatchevent I/MY: MainActivityE dispatchTouchEvent: false抬起

View onDispatchTouchEvent true

//表明分发完成,不执行onTouchEvent(分发事件默认是super方法执行View的onTouchEvent,直接返回true就不会执行onTouchEvent)

12-26 12:13:51.674 8266-8266/mobi.xiaowu.dispatchevent I/MY: MainActivityS dispatchTouchEvent: 按下
12-26 12:13:51.674 8266-8266/mobi.xiaowu.dispatchevent I/MY: MyViewGroupS dispatchTouchEvent: 按下
12-26 12:13:51.674 8266-8266/mobi.xiaowu.dispatchevent I/MY: MyViewGroupS onInterceptTouchEvent: 按下
12-26 12:13:51.674 8266-8266/mobi.xiaowu.dispatchevent I/MY: MyViewGroupE onInterceptTouchEvent: false按下
12-26 12:13:51.674 8266-8266/mobi.xiaowu.dispatchevent I/MY: MyButtonS dispatchTouchEvent: 按下
12-26 12:13:51.674 8266-8266/mobi.xiaowu.dispatchevent I/MY: MyButtonE dispatchTouchEvent: true按下
12-26 12:13:51.675 8266-8266/mobi.xiaowu.dispatchevent I/MY: MyViewGroupE dispatchTouchEvent: true按下
12-26 12:13:51.675 8266-8266/mobi.xiaowu.dispatchevent I/MY: MainActivityE dispatchTouchEvent: true按下
12-26 12:13:51.697 8266-8266/mobi.xiaowu.dispatchevent I/MY: MainActivityS dispatchTouchEvent: 抬起
12-26 12:13:51.697 8266-8266/mobi.xiaowu.dispatchevent I/MY: MyViewGroupS dispatchTouchEvent: 抬起
12-26 12:13:51.697 8266-8266/mobi.xiaowu.dispatchevent I/MY: MyViewGroupS onInterceptTouchEvent: 抬起
12-26 12:13:51.697 8266-8266/mobi.xiaowu.dispatchevent I/MY: MyViewGroupE onInterceptTouchEvent: false抬起
12-26 12:13:51.697 8266-8266/mobi.xiaowu.dispatchevent I/MY: MyButtonS dispatchTouchEvent: 抬起
12-26 12:13:51.698 8266-8266/mobi.xiaowu.dispatchevent I/MY: MyButtonE dispatchTouchEvent: true抬起
12-26 12:13:51.698 8266-8266/mobi.xiaowu.dispatchevent I/MY: MyViewGroupE dispatchTouchEvent: true抬起
12-26 12:13:51.698 8266-8266/mobi.xiaowu.dispatchevent I/MY: MainActivityE dispatchTouchEvent: true抬起

你可能感兴趣的:(Android事件分发机制分析)