前言:
太理论的东西,我也不想说,也不会说,那就举个例子!
例子:一个button按钮的触摸:
电容屏感应到用户的触摸事件-android底层驱动-传递给activity
这里说一下电容屏和电阻屏,电容屏是依靠手指和屏幕的电流感应,电阻屏是依靠手指的按压力
ViewGroup的相关事件有三个:onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent。View的相关事件只有两个:dispatchTouchEvent、onTouchEvent。
当一个Touch事件(触摸事件为例)到达根节点,即Acitivty的ViewGroup时,它会依次下发,下发的过程是调用子View(ViewGroup)的dispatchTouchEvent方法实现的。简单来说,就是ViewGroup遍历它包含着的子View,调用每个View的dispatchTouchEvent方法,而当子View为ViewGroup时,又会通过调用ViwGroup的dispatchTouchEvent方法继续调用其内部的View的dispatchTouchEvent方法。
dispatchTouchEvent方法只负责事件的分发,它拥有boolean类型的返回值,当返回为true时,顺序下发会中断。
Activity:
Activity有两个方法:boolean dispatchTouchEvent(MotionEvent event)负责事件的分发,如果没有视图处理并消费事件,则由activity自己的onTouchEvent(MotionEvent event)处理视图view:
boolean onTouchEvent(MotionEvent event) 处理事件的回调,返回true,表示消费了事件,false表示没有消费事件理解:
View和ViewGroup都有boolean dispatchTouchEvent(MotionEvent event)方法,如果是ViewGroup,则分发事件给子view或子viewgroup,如果是子view是一个View,则需要由子view自身的dispatchTouchEvent()来分发给自己,如果子view设置了setOnTouchListener(),则事件先由监听器处理,监听器不处理,才有回调onTouchEvent()处理,down事件由子view处理的,则后续的move和up事件都会分发给子view处理,如果子view不消费,则最后回传给activity处理;如果down事件子view都没处理,则后续的move和up事件就不会分发了,就是说down事件的消费者是谁,后续的move和Up事件就会分发给谁处理
事件的拦截:
只有ViewGroup才有此方法,一般默认是不拦截的(返回false),但在ListView的源码中可以看到,有时候不拦截,有时候拦截
附录:触摸事件的小练习: https://git.oschina.net/evancola/MovePicture