事件分发机制

一、 Touch  事件概述
1、分类:Down、Move、Up
2、传递规则:
    ·        向下:事件分发过程, 隧道方式 将事件逐层传递下去(依次触发dispatchTouchEvent、onInterceptTouchEvent),直到最内层或者因为某一条件被终止。
   
·        向上:事件消费过程, 冒泡方式 将事件逐级往 传递(只触发onTouchEvent),直到某级 中的 onTouchEvent 方法返回 true(消费了)
一、相关方法:
        为了理解,这里的ViewGroup:代表可以添加子View;View:代表不可以添加子View,已经是最小单元。    
        图片

二、事件分析:

为了方便演示,创建了几个角色:ActivityFather1(ViewGroup)Father2(ViewGroup)child(View)。

注意:1、这里都是触摸的child 
    2、
OnTouchListener可以拦截onTouchEvent 方法。
    3、OnClick方法的优先级最低,且View必须同时消耗down和up事件才能触发。

1、事件分发:public boolean dispatchTouchEvent(MotionEvent ev)
        如果事件能够传递给当前View,那么此方法一定会被调用。 

·        true,事件将停止向下分发,并由自己的 dispatchTouchEvent 方法进行处理; 
 图片

·        false事件将停止向下分发,两种情况:

1.如果自己有父 View,则会将事件向上返回
   图片 

2.如果自己没有父View(已经是最顶层了),则由自己 dispatchTouchEvent 方法进行处理; 
        图片 

·        super.dispatchTouchEvent(ev),事件向下传递,直到最内层。

2、事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev) 
    如果当前View
消费了某个事件,那么在这个事件序列的后续事件中,当前View的onInterceptTouchEvent方法都不会再被调用,除非子View调用requestDisallowInterceptTouchEvent(false)方法。当然,requestDisallowInterceptTouchEvent(true)也会让onInterceptTouchEvent不被调用。

·        true,将事件进行拦截,并将拦截到的事件交由自己的onTouchEvent进行处理;

·        false,则表示将事件放行

·        super.onInterceptTouchEvent(ev),和返回false相同。

3、事件响应:public boolean onTouchEvent(MotionEventev)

如果 View 没有对 ACTION_DOWN 进行消费,之后的其他事件不会传递给该View。

·        true,接收并消费该事件。这是系统默认的情况,除非它是不可点击的(clickable和longClickable同时为false。其中longClickable默认为false。clickable 要分情况,比如Button默认true,TextView默认false)。

·        false,不消费,那么事件会向上返回

·        super.onTouchEvent(ev),需要注意,设置了监听会对结果产生影响。
1、设置
OnClickListener监听,则和true相同;

  2、设置OnTouchListener监听,则看onTouch;

  3、没有设置监听,则和false相同 

三、特殊方法
    1、public void requestDisallowInterceptTouchEvent(boolean disallowIntercept)
        此方法可以在子View中干预父View的事件分发过程,但是down事件除外。
         disallowIntercept=true:请求父View别拦截
        
disallowIntercept=false:请求父View 拦截  
        注意:
            ①此方法用于子View的 
dispatchTouchEvent方法,因为只有此方法是事件传递到子View时一定会被调用的。
            ②子View中的 down事件一定要消费,因为如果不消费,那么后续事件就不会传递到子View了。
            ③父View的
onInterceptTouchEvent方法中也需要做出修改。
            ④父View中的down事件不能拦截因为如果拦截了,后续事件
就不会传递到子View了。
            ⑤
父View中的move和up事件必须拦截,因为此方法实际上是让父View重新调用onInterceptTouchEvent方法,如果不拦截,那么重新调用onInterceptTouchEvent方法,也不会起作用的。











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值