事件分发与消费(初学)

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控件中方法具有情况

 ActivityViewGroupView
dispatchTouchEvent(分发)YesYesYes
onInterceptTouchEvent(拦截)NoYesNo
onTouchEvent(消费)YesYesYes

(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




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值