1、包含的动作
(1)ACTION_DOWN(按下):用户按下手指所触发的动作,仅仅是按下手指
(2)ACTION_MOVE(移动):用户手指接触屏幕,手指在屏幕上发生了移动
(3)ACTION_UP(抬起):用户手指离开时,所触发的动作
2、动作的发生、伴随着方法的调用
事件分发(dispatchTouchEvent):他有返回值boolean,一般我们不去考虑这个返回值,使用默认的返回值来处理,默认的处理方式为:当前的控件直接将事件抛给他的子控件,特殊情况下,只有该控件为ViewGroup,他是将事件直接交于自身的拦截方法来处理。
事件首先由Activity接收到这个事件,通过Activity的dispatchEvent方法来向它的布局分发该事件,如果这个事件被ViewGroup接收到,那么这个ViewGroup首先不会直接将事件分发给ViewGroup的子View,而是直接调用自身的拦截事件方法,通过拦截事件的方法直接将事件抛给子View
事件拦截(onInterceptTouchEvent):事件拦截的返回值是true,拦截事件,直接交给自身来处理该事件。方法返回值是false:表示不拦截该事件,事件继续向下分发,交给他的子控件处理。
事件消费(onTouchEvent):方法返回值为true:表示消费该事件;方法返回值是false:表示不消费该事件,事件交给他的父布局或父容器来消费。
3、Activity、ViewGroup、终结View控件中方法具有情况
Activity ViewGroup View dispatchTouchEvent(分发) Yes Yes Yes onInterceptTouchEvent(拦截) No Yes No onTouchEvent(消费) Yes Yes Yes
(1)为什么Activity中没有on‘InterceptTouvhEvent()拦截方法
如果activity有拦截事件的方法,那么他将会变成一个没有界面的Activity,也就是Service,直接失去了与用户交互的这个特点
(2)为什么View中没有onInterceptTouchEvent拦截方法?
因为View没有子控件,也不能添加控件,那么他拦截的事件方法毫无意义
4、三个事件方法如何协同工作?
(1)dispatchTouchEvent:首先事件由Activity接收,通过activity的dispatchTouchEvent方法来分发,默认直接交于子布局的dispatchTouchEVent来分发,在ViewGroup中分发方法直接交于自身的onInterceptTouchEvent方法来分发,在View当中,由dispatchTouchEvent接收事件,因为没有拦截方法,那么他会将事件交于自身的消费方法onTouchEvent来消费。
(2)onInterceptTouchEvent:只能在ViewGroup中存在,当onInterceptTouchEvent返回值true(表示拦截该事件),那么直接调用它自身的消费方法onTouchEvent来消费该事件;返回值是false(不拦截该事件,默认为false)直接交于子控件的dispatchTouchEvent来分发该事件。
(3)onTouchEvent(事件消费):这是一个消费方法,如果返回值是true,表示消费该事件,那么这件事消费完成,将不向上传递给父控件或父容器;如果是false:表示不消费该事件,只能向上层传递。
5、一个单击事件的包含动作
单击=按下ACTION_DOWN + 抬起ACTION_UP
总结:按下时谁消费的,移动和抬起就是谁来消费。
6、执行单击事件理论验证
A:表示Activity VG:表示Viewroup V:View
(1)情景一:默认情况下
A:dispatch——>VG:dispatch——>VG:onInterceptTouchEvent——>V:dispatch——>V:onTouchEvent——>VG:onTouchEvent——>A:onTouchEvent【按下动作消费结束】——>A:dispatch——>A:onTouchEvent如图:
(2)情景二:ViewGroup拦截该事件 ViewGroup的onInterceptTouchEvent返回值为true
A:dispatch------->VG:dispath------->VG:onInterceptTouchEvent(true)------>VG:onTouchEvent(false)---->A:onTouchEvent【按下动作消费完成】------->A:dispatch------->A:onTouchEvent 如图所示:
(3)情景三:Acitivty的onTouchEvent返回true
A:dispatch——>VG:dispatch——>VG:onInterceptTouchEvent——>V:dispatch——>V:onTouchEvent——>VG:onTouchEvent——>A:onTouchEvent【按下动作消费结束】——>A:dispatch——>A:onTouchEvent
结果与情景一的结果一致,不做详细分析
(4)情景四:ViewGroup消费按下事件,该控件的onTouchEvent返回true
A:dispatch----->VG:dispatch------->VG:onInterceptTouchEvent------>V:dispatch------->V:onTouchEvent
------>VG:onTouchEvent--->【按下动作消费完成】---->A:dispatch -------> VG:dispatch --------> VG;onTouch 如图:
(5)情景五:View消费按下事件,该控件的onTouchEvent返回true
A:dispatch -> VG:dispatch -> VG:onInterceptTouchEvent -> V:dispatch -> V:onTouchEvent 【按下动作消费结束】 A:dispatch -> VG:dispatch -> VG:onIntercept -> V:dispatch ->onTouchEvent 如图所示:
7、控件设置单击监听或者onClick
1.一个控件只要激活了Clickable属性,或者是LongClickable这个属性,它也能消费按下事件。Button默认Button就是可点击的。
2.如何激活这两个属性呢??
1.xml中添加属性。
2.给该控件设置单击事件监听,或者长按事件监听
1.情景一:默认的情况,给view设置单击事件监听
A:dispatch -> VG:dispatch -> VG:onIntercept -> V:dispatch -> V:onTouch 【按下事件消费结束】 A:dispatch -> VG:dispatch -> VG:onIntercept -> V:dispatch -> V:onTouch -> V:onClick
2.情景二:默认情况下,给view设置长按监听
A:dispatch -> VG:dispatch -> VG:onIntercept -> V:dispatch -> V:onTouch【按下事件消费结束,并计时】->V:onLongClick()【时间达到0.18】 A:dispatch -> VG:dispatch ->
VG:onIntercept -> V:dispatch ->onTouch
3.情景三:默认情况下,给ViewGroup设置单击事件
A:dispatch -> VG:dispatch -> VG:onIntercept -> V:dispatch -> V:onTouch -> VG:onTouch 【按下动作消费结束】 A:dispatch -> VG:dispatch -> VG:onTouch ->VG:onClick
4.情景四:默认情况下,给ViewGroup设置长按事件
A:dispatch -> VG:dispatch -> VG:onIntercept -> V:dispatch -> V:onTouch -> VG:onTouch 【按下消费结束,并计时】 -> VG:onLongClick【时间大于0.18秒】 A:dispatch ->VG:dispatch -> VG:onTouch