Android 事件分发之activity

Android中的view是树形结构,可以进行有序分发,最先接收到的是activity,传递顺序:

Activity -> PhoneWindow -> DecorView -> ViewGroup -> … -> View

其中 activty ,viewGroup ,view 的包含的方法:先用一张图片显示(√表示含有改方法,x没有改方法)
这里写图片描述

本片主要是讲解activity中的事件分发:

 public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            onUserInteraction();//分析1
        }
        if (getWindow().superDispatchTouchEvent(ev)) {//分析2
            return true;
        }
        return onTouchEvent(ev);//分析3
    }

1.onUserInteraction();这个方法为空方法
作用:当此activity在栈顶时,触屏点击按home,back,menu键等都会触发此方法

2.getWindow().superDispatchTouchEvent(ev); 这个方法是个抽象方法。

//此处的getWindow()---> :
    public Window getWindow() {
        return mWindow;
    }

//这个mWindow应用对应对象是-->
    mWindow = new PhoneWindow(this, window, activityConfigCallback);

//可以发现这个mWindow的是指向的PhoneWindow,PhoneWindow是window的子类;

//调用的getWindow().superDispatchTouchEvent(ev)这个方法是:
    @Override
    public boolean superDispatchTouchEvent(MotionEvent event) {

        return mDecor.superDispatchTouchEvent(event);
    }
//而mDecor.superDispatchTouchEvent(event)方法是:
public boolean superDispatchTouchEvent(MotionEvent event) {

        return super.dispatchTouchEvent(event);
        // 调用父类的方法 = ViewGroup的dispatchTouchEvent()
    }

/*
  解释一下:
      DecorView类是PhoneWindow类的一个内部类
      DecorView继承自FrameLayout,是所有界面的父类
      FrameLayout是ViewGroup的子类,故DecorView的间接父类 = ViewGroup
*/

//因此这个方法其实最终调用的是viewGroup的dispatchTouchEvent();

3.onTouchEvent(ev);分析

    public boolean onTouchEvent(MotionEvent event) {
        if (mWindow.shouldCloseOnTouch(this, event)) {
            finish();
            return true;
        }

        return false;
    }
//其中mWindow.shouldCloseOnTouch(this, event)这个方法是触摸事件没有被下面的任何View接受,触摸到边界的情况。

//返回true:说明事件在边界外,即 消费事件
// 返回false:未消费(默认)

最后总结一下:


activity的点击事件
——> activity的 dispatchTouchEvent()
——> 通过调用 getWindow().superDispatchTouchEvent(ev) 的当方法
——>(1) 得到viewGroup的 dispatchTouchEvent() 的返回值,返回ture时,activity.dispatchTouchEvent()就会 返会 ture,事件分发结束;
(2) 当viewGroup的 dispatchTouchEvent() 的返回值,返回false时,调用 activity.onTouchEvent() 得到返回值(无论返回什么,事件分发都结束):事件在边界范围内返回false。

参考资料:作者Carson_Ho 的 https://www.jianshu.com/p/38015afcdb58

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值