关于Android事件传递与分发

最近在看事件分发方面的知识,主要看了郭神之前的文章Android事件分发机制完全解析,文章由浅入深讲解很细致清晰。里面有这样一句话
“Android中touch事件的传递,绝对是先传递到ViewGroup,再传递到View的”
看到这里就一直想要知道,touch事件是怎么传递到viewgroup的,搜了几篇文章也都没讲清楚。直到看到这篇Android FrameWork——Touch事件派发过程详解,看完不禁无限佩服与感激,解决了我的疑惑,在这里记录下摘要,以备后查。

首先,当手指触摸屏幕,会先走activity的dispatchTouchEvent(MotionEvent ev)方法

    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            onUserInteraction();
        }
        if (getWindow().superDispatchTouchEvent(ev)) {
            return true;
        }
        return onTouchEvent(ev);
    }

至于为什么走这个方法,该篇文章有详细的讲解,这里就不再深究。这里getWindow()返回的就是PhoneWindow对象,执行superDispatchTouchEvent,就是执行PhoneWindow.superDispatchTouchEvent。这里我们可以看到,如果superDispatchTouchEvent返回true,就不会执行下面的onTouchEvent(ev)方法,此时代表着有子view处理了touch事件。如果返回false,说明没有子view处理事件,最后会返给activity处理。

我们再看PhoneWindow.superDispatchTouchEvent:

    @Override
    public boolean superDispatchTouchEvent(MotionEvent event) {
        return mDecor.superDispatchTouchEvent(event);

                -->        public boolean superDispatchTouchEvent(MotionEvent event) {
                                    return super.dispatchTouchEvent(event);
        }
    }

superDispatchTouchEvent最终调用super.dispatchTouchEvent。这里mDector是PhoneWindow.DecorView,它是一个真正Activity的root view,它继承了FrameLayout,通过super.dispatchTouchEvent他会把touchevent派发给各个activity的子view,也就是我们在Activity.onCreat方法中setContentView时设置的view。这里的view最外层都是布局view,也就是都继承了viewgroup,由此,touch事件传递到了viewgroup中。后面的事件分发过程,看完郭神的博客你一定都明白啦。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值