Android View的事件传递《1》

触摸事件的传递流程是从deispatchTouchEvent开始的,如果是默认的返回值,事件会依次按嵌套层次从外层向内层传递,到达最内层的View时,就由它的onTouchEvent方法处理,该方法如果能够处理该事件,则返回true,如果处理不了,则返回false,这时事件会重新像外层(父容器)传递,并由外层View的onTouchEvent方法进行处理,以此类推。

如果事件再内层传递的过程中将事件处理函数返回ture,则会导致时间提前被消耗,view不会继续分发。

VIew控件的事件触发顺序是先执行onTouch方法,最后才执行onClick方法。


1.事件分发图:



2.demo测试日志

(1)MainActivity dispatchTouchEvent return super.dispatchTouchEvent(event)

MyTextVIew dispatchTouchEvent return super.dispatchTouchEvent(event)
MyTextVIew onTouchEvent return super.onTouchEvent(event)
MainActivity 的onTouchEvent不被调用

01-25 11:04:27.935 24084-24084/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent Action_Down
01-25 11:04:27.936 24084-24084/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent Action_Down
01-25 11:04:27.936 24084-24084/com.qiandu.viewdispatchevent E/MainActivity: OnTouchListener Action_Down
01-25 11:04:27.936 24084-24084/com.qiandu.viewdispatchevent E/MyTextVIew: onTouchEvent Action_Down
01-25 11:04:28.026 24084-24084/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_MOVE
01-25 11:04:28.026 24084-24084/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent ACTION_MOVE
01-25 11:04:28.026 24084-24084/com.qiandu.viewdispatchevent E/MainActivity: OnTouchListener ACTION_MOVE
01-25 11:04:28.026 24084-24084/com.qiandu.viewdispatchevent E/MyTextVIew: onTouchEvent ACTION_MOVE
01-25 11:04:28.030 24084-24084/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_UP
01-25 11:04:28.030 24084-24084/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent ACTION_UP
01-25 11:04:28.030 24084-24084/com.qiandu.viewdispatchevent E/MainActivity: OnTouchListener ACTION_UP
01-25 11:04:28.030 24084-24084/com.qiandu.viewdispatchevent E/MyTextVIew: onTouchEvent ACTION_UP
01-25 11:04:28.031 24084-24084/com.qiandu.viewdispatchevent E/MainActivity: OnClickListener onClick


(2)MyTextVIew onTouchEvent return false:
后面的一系列事件ACTION_MOVE,ACTION_UP等都不再交给MyTextVIew处理
01-25 10:57:00.327 16763-16763/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent Action_Down
01-25 10:57:00.327 16763-16763/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent Action_Down
01-25 10:57:00.327 16763-16763/com.qiandu.viewdispatchevent E/MainActivity: OnTouchListener Action_Down
01-25 10:57:00.327 16763-16763/com.qiandu.viewdispatchevent E/MyTextVIew: onTouchEvent Action_Down
01-25 10:57:00.327 16763-16763/com.qiandu.viewdispatchevent E/MainActivity: onTouchEvent Action_Down
01-25 10:57:00.405 16763-16763/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_MOVE
01-25 10:57:00.405 16763-16763/com.qiandu.viewdispatchevent E/MainActivity: onTouchEvent ACTION_MOVE
01-25 10:57:00.422 16763-16763/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_MOVE
01-25 10:57:00.422 16763-16763/com.qiandu.viewdispatchevent E/MainActivity: onTouchEvent ACTION_MOVE
01-25 10:57:00.439 16763-16763/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_MOVE
01-25 10:57:00.439 16763-16763/com.qiandu.viewdispatchevent E/MainActivity: onTouchEvent ACTION_MOVE
01-25 10:57:00.456 16763-16763/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_MOVE
01-25 10:57:00.456 16763-16763/com.qiandu.viewdispatchevent E/MainActivity: onTouchEvent ACTION_MOVE
01-25 10:57:00.458 16763-16763/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_UP
01-25 10:57:00.458 16763-16763/com.qiandu.viewdispatchevent E/MainActivity: onTouchEvent ACTION_UP

(3)MyTextVIew onTouchEvent return true:
MainActivity 的onTouchEvent不被调用
MainActivity 的MyTextVIew的onclick不被调用
01-25 11:01:19.560 21399-21399/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent Action_Down
01-25 11:01:19.560 21399-21399/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent Action_Down
01-25 11:01:19.560 21399-21399/com.qiandu.viewdispatchevent E/MainActivity: OnTouchListener Action_Down
01-25 11:01:19.560 21399-21399/com.qiandu.viewdispatchevent E/MyTextVIew: onTouchEvent Action_Down
01-25 11:01:19.648 21399-21399/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_MOVE
01-25 11:01:19.648 21399-21399/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent ACTION_MOVE
01-25 11:01:19.648 21399-21399/com.qiandu.viewdispatchevent E/MainActivity: OnTouchListener ACTION_MOVE
01-25 11:01:19.648 21399-21399/com.qiandu.viewdispatchevent E/MyTextVIew: onTouchEvent ACTION_MOVE
01-25 11:01:19.653 21399-21399/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_UP
01-25 11:01:19.654 21399-21399/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent ACTION_UP
01-25 11:01:19.654 21399-21399/com.qiandu.viewdispatchevent E/MainActivity: OnTouchListener ACTION_UP
01-25 11:01:19.654 21399-21399/com.qiandu.viewdispatchevent E/MyTextVIew: onTouchEvent ACTION_UP

(4)MyTextVIew dispatchTouchEvent  return true
不再继续分发事件
MainActivity 的MyTextVIew的onclick不被调用
01-25 11:06:10.433 26666-26666/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent Action_Down
01-25 11:06:10.433 26666-26666/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent Action_Down
01-25 11:06:10.490 26666-26666/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_MOVE
01-25 11:06:10.490 26666-26666/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent ACTION_MOVE
01-25 11:06:10.493 26666-26666/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_UP
01-25 11:06:10.493 26666-26666/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent ACTION_UP

(5)MyTextVIew dispatchTouchEvent  return false
事件执行到MyTextVIew dispatchTouchEvent 分发给MainActivity: onTouchEvent
后续的一系列事件不再交给 MyTextVIew处理
01-25 11:10:49.684 31113-31113/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent Action_Down
01-25 11:10:49.684 31113-31113/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent Action_Down
01-25 11:10:49.685 31113-31113/com.qiandu.viewdispatchevent E/MainActivity: onTouchEvent Action_Down
01-25 11:10:49.743 31113-31113/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_MOVE
01-25 11:10:49.744 31113-31113/com.qiandu.viewdispatchevent E/MainActivity: onTouchEvent ACTION_MOVE
01-25 11:10:49.761 31113-31113/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_MOVE
01-25 11:10:49.761 31113-31113/com.qiandu.viewdispatchevent E/MainActivity: onTouchEvent ACTION_MOVE
01-25 11:10:49.761 31113-31113/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_UP
01-25 11:10:49.761 31113-31113/com.qiandu.viewdispatchevent E/MainActivity: onTouchEvent ACTION_UP

(6)MainActivity 中的MyTextVIew的 OnTouchListener return true
不再继续分发事件
MainActivity 的MyTextVIew的onclick不被调用
01-25 11:20:34.862 5936-5936/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent Action_Down
01-25 11:20:34.862 5936-5936/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent Action_Down
01-25 11:20:34.862 5936-5936/com.qiandu.viewdispatchevent E/MainActivity: OnTouchListener Action_Down
01-25 11:20:34.914 5936-5936/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_MOVE
01-25 11:20:34.914 5936-5936/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent ACTION_MOVE
01-25 11:20:34.914 5936-5936/com.qiandu.viewdispatchevent E/MainActivity: OnTouchListener ACTION_MOVE
01-25 11:20:34.920 5936-5936/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_UP
01-25 11:20:34.920 5936-5936/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent ACTION_UP
01-25 11:20:34.920 5936-5936/com.qiandu.viewdispatchevent E/MainActivity: OnTouchListener ACTION_UP

(7)MainActivity onTouchEvent return true/fasle 对子控件事件分发没有影响
01-25 11:26:15.904 12929-12929/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent Action_Down
01-25 11:26:15.904 12929-12929/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent Action_Down
01-25 11:26:15.904 12929-12929/com.qiandu.viewdispatchevent E/MainActivity: OnTouchListener Action_Down
01-25 11:26:15.904 12929-12929/com.qiandu.viewdispatchevent E/MyTextVIew: onTouchEvent Action_Down
01-25 11:26:15.972 12929-12929/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_MOVE
01-25 11:26:15.972 12929-12929/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent ACTION_MOVE
01-25 11:26:15.972 12929-12929/com.qiandu.viewdispatchevent E/MainActivity: OnTouchListener ACTION_MOVE
01-25 11:26:15.972 12929-12929/com.qiandu.viewdispatchevent E/MyTextVIew: onTouchEvent ACTION_MOVE
01-25 11:26:15.975 12929-12929/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_UP
01-25 11:26:15.975 12929-12929/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent ACTION_UP
01-25 11:26:15.976 12929-12929/com.qiandu.viewdispatchevent E/MainActivity: OnTouchListener ACTION_UP
01-25 11:26:15.976 12929-12929/com.qiandu.viewdispatchevent E/MyTextVIew: onTouchEvent ACTION_UP
01-25 11:26:15.976 12929-12929/com.qiandu.viewdispatchevent E/MainActivity: OnClickListener onClick

(8)MainActivity dispatchTouchEvent return true/false
MainActivity 的dispatchTouchEvent中执行后,不再分发事件
01-25 11:29:54.856 17729-17729/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent Action_Down
01-25 11:29:54.925 17729-17729/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_MOVE
01-25 11:29:54.931 17729-17729/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_UP


View事件分发DEMO