Android事件分发

Android 事件分发学习笔记

在Android 触摸事件分发中,分别记录下Down事件 和 UP事件以及MOVE事件
down事件:从Activity -dispatchTouchEvent()方法开始通过phoneWindow对象传递到DecorView,DecorView是一个Framelayout,Framelayout继承ViewGroup,所以事件就从ViewGroup分发开始了。如果是down事件 或者是 targetView(个人理解是ontouchEvent方法中返回ture的对象,   或者说ViewGroup中的有View或者ViewGroup想要消耗down事件的对象构成的一个链表)不为空  就会去判断ViewGroup是否要拦截事件down事件 会一直分发下去,知道最后一个view调用onTouchEvent()方法。如果所有的view和ViewGroup的onTouchEvent()都返回false,最后会调用Activity的onTouchEvent()方法。
up 事件 :首先从Activity开始分发到Framelayout的dispatchTouchevent()方法,如果Framelayout的targetView是null,就是在down事件中没有View或者ViewGroup想消费事件,则直接返回给activity处理。up事件会分发到有targetView的viewgroup层次。如果DecorView 中没有targetView,就不会分发下去,直接返回给activity,假设说有5层view,第三层view 有能消费的View,就会分发到第三层,第四层第五层不再接收到分发事件。

这里写图片描述

这里写图片描述

 ListenerInfo li = mListenerInfo;
            if (li != null && li.mOnTouchListener != null
                    && (mViewFlags & ENABLED_MASK) == ENABLED
                    && li.mOnTouchListener.onTouch(this, event)) {
                result = true;
            }

            if (!result && onTouchEvent(event)) {
                result = true;
            }

    mOnTouchListener 的优先级要比onTouchEvent()方法高,在onTouchEvent()方法中针对up down 和 move事件做了处理
        up事件中才有可能去执行onClick事件,

Android开发艺术探索中对滑动冲突的处理

主要是调用了拦截方法,即ViewGroup事件在down 和 up事件中不拦截,在move过程中去拦截所需要的事件,
还有一个是方案是ViewGroup不去拦截事件,view在不需要处理的事件事通过view.getPatent.requestDisallowInterceptTouchEvent(false)请求不允许拦截标志位false,即需要父容器拦截事件,这样view收不到move事件,viewgroup有机会拦截,调用viewgroup的onTouchEvent()事件。
 MainActivity dispatchTouchEvent down activity分发到viewgroup
 FirstLayout dispatchTouchEvent down  viewgroup分发事件
 FirstLayout onInterceptTouchEvent down 判断是否要拦截
 FirstLayout onTouchEvent down  执行touchEvent,返回结果是false
 MainActivity onTouchEvent down  返回给activity 处理touch事件
 MainActivity dispatchTouchEvent up up事件分发 target = null,不分发事件
 MainActivity onTouchEvent up

 MainActivity dispatchTouchEvent down
 FirstLayout dispatchTouchEvent down
 FirstLayout onInterceptTouchEvent down
 SecondLayout dispatchTouchEvent down
 SecondLayout onInterceptTouchEvent down
 SecondLayout onTouchEvent down
 FirstLayout onTouchEvent down
 MainActivity onTouchEvent down
 MainActivity dispatchTouchEvent up
 MainActivity onTouchEvent up


 MainActivity dispatchTouchEvent down
 FirstLayout dispatchTouchEvent down
 FirstLayout onInterceptTouchEvent down
 SecondLayout dispatchTouchEvent down
 SecondLayout onInterceptTouchEvent down
 TestButton dispatchTouchEvent down
 TestButton onTouchEvent down
 MainActivity dispatchTouchEvent up
 FirstLayout dispatchTouchEvent up
 FirstLayout onInterceptTouchEvent up
 SecondLayout dispatchTouchEvent up
 SecondLayout onInterceptTouchEvent up
 TestButton dispatchTouchEvent up
 TestButton onTouchEvent up
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值