事件分发总结和验证

一、分发机制总结

1、传递顺序:Activity->PhoneWindow->DecorView->ViewGroup->View
2、三个方法:
* dispatchTouchEvent用来进行事件的分发。如果事件能够传递给当前的View,那么此方法一定会被调用,返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法的影响,表示是否消耗当前事件。
* onInterceptTouchEvent是用来判断是否拦截某个事件,如果当前View拦截了某个事件,那么在同一个事件序列当中,此方法不会被再次调用,返回结果表示是否拦截当前事件。默认返回false,返回true表示拦截。Activity和View中不存在onInterceptTouchEvent方法。
* onTouchEvent在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前的事件,如果不消耗,则在同一个事件序列中,当前View无法再次接受到事件。view中默认返回true,表示消费了这个事件。
3、onTouch和onTouchEvent的区别:
这两个方法都是在View的dispatchTouchEvent中调用的,onTouch方法优先于onTouchEvent方法执行。如果在onTouch方法中通过返回true将事件消费掉,onTouchEvent将不会再执行。
4、ViewGroup 是根据 onInterceptTouchEvent 的返回值来确定是调用子View的 dispatchTouchEvent 还是自身的 onTouchEvent

二、结论验证:

1、点击View,View的onTouchEvent返回true

整个流程从ActivitydispatchTouchEvent方法开始,到View的onTouchEvent消费事件结束。 流程图:

注:view的dispatchTouchEvent是在ViewGroup的dispatchTouchEvent方法中被调用的。 Activity和ViewGroup之间事件传递需要通过PhoneWindow和DecorView 2、点击View,View的onTouchEvent返回false

整个流程从ActivitydispatchTouchEvent方法开始,到View的onTouchEvent,由于不消费事件,所以回传给ViewGroup的onTouchEvent,同样不消费。最后传回Activity的onTouchEvent方法,整个流程结束。
流程图:

3、点击View,ViewGroup将事件拦截

ViewGroup调用onInterceptTouchEvent返回true,将事件拦截,交由ViewGroup的onTouchEvent方法调用,默认返回false,不进行处理。再次回传到Activity的onTouchEvent方法中。
4、点击View,onTouchEvent返回true或者false。给view设置点击事件

   findViewById(R.id.id_touch_view).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e("TouchView", "onClick: " );
            }
        });
复制代码

结论:点击事件未执行,因为点击事件是在onTouchEvent方法的ACTION_UP中执行,返回true或者false,点击事件都执行不到
5、点击view,给view设置onTouchListener,并且返回true

 findViewById(R.id.id_touch_view).setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.e("TouchView", "onTouch: " );
                return true;
            }
        });
复制代码

此时View的onTouchEvent方法不会被调用,因为OnTouchListener优先级比onTouchEvent要高,如果OnTouchListener返回true,则onTouchEvent不再调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值