ViewGroup和View事件传递部分代码分析记录

本文详细探讨了Android中点击事件的传递流程,从Activity到Window再到View,重点解析了ViewGroup的dispatchTouchEvent和onInterceptTouchEvent方法在事件拦截中的作用,以及View如何处理点击事件。当设置onTouchListener时,其优先级高于onTouchEvent。同时,如果view的clickable或longClickable属性为true,将消耗点击事件,并可能触发performClick和onClick回调。
摘要由CSDN通过智能技术生成

点击事件产生后,发生了什么

  • 点击事件产生后,事件的传递时这样的顺序:Activity->Window->View;
  • 顶层View接收到事件后,会按照事件分发机制来分发事件;

ViewGroup的事件传递过程

  • 事件传递给顶层View后,会调用VIewGroup的 dispatchTouchEvent方法;如果返回true,那么事件就会由ViewGroup处理;如果返回false,事件会传递给所在的点击事件链上的子View;子View的dispatchTouchEvent方法会被调用。
  • ViewGroup在调用dispatchTouchEvent方法后,会调用到注释1 处的onInterceptTouchEvent方法,返回true,表示会拦截事件,默认是返回false;
  • intercepted 方法返回true,注释2处 的代码块不会被执行;该代码块中,会遍历子View,最终调用到子View的dispatchEvent方法,详情如注释3;
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
    ......
            // Check for interception.
            final boolean intercepted;
            if (actionMasked == MotionEvent.ACTION_DOWN
                    || mFirstTouchTarget != null) {
                final boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0;
                if (!disallowIntercept) {
                    intercepted = onInterceptTouchEvent(ev); // 注释1.
                    ev.setAction(action); // restore action in case it was changed
                } else {
                    intercepted = false;
                }
            } else {
                // There are no touch targets and this action is not an
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值