Android事件分发一之事件传递

一 点击事件(Touch事件)

  • 当用户触摸屏幕时,将产生点击事件(Touch事件),事件相关细节(触摸位置时间等)被封装为MotionEvent对象

MotionEvent事件类型:

  • ACTION_DOWN:初次接触到屏幕时触发
  • ACTION_MOVE:在屏幕上滑动时触发(多次)
  • ACTION_UP:手指离开屏幕时触发
  • ACTION_CANCEL:事件被上层拦截时触发(何时拦截后面做说明)

用户接触屏幕到抬起

Android事件分发一之事件传递_第1张图片
二 事件传递

系统如何分发用户的touch事件?

  • 流程图
    Android事件分发一之事件传递_第2张图片

通过源码分析传递流程,首先分析如何从Actvity传递到ViewGroup

Activity:
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            onUserInteraction();
        }
        if (getWindow().superDispatchTouchEvent(ev)) {//事件分发并返回结果
            return true;//事件被消费
        }
        return onTouchEvent(ev);//没有View可以处理,调用Activity onTouchEvent方法
    }

activity里面的getWindow().superDispatchTouchEvent(ev),会调用window.superDispatchTouchEvent(ev),而Window的唯一实现类是PhoneWindow,所以会调用PhoneWindow.superDispatchTouchEvent

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

mDecor为DecorView,可以看到PhoneWindow又调用了DecorView的superDispatchTouchEvent方法

  • 关于DecorView
    通过 getWindow().getDecorView()可以获得
    setContentView设置的View是它的子View(Activity的setContentView最终是调用PhoneWindow的setContentView)

DecorView继承FrameLayout,FrameLayout继承ViewGroup,DecorView的superDispatchTouchEvent最终会调用到ViewGroup的dispatchTouchEvent方法。其实该ViewGroup就是我们通过Activity的setContentView设置的View,该View一般为ViewGroup

以上是事件如何从activity一步步传递到我们通过setContentView设置的ViewGroup里面的流程,流程图如以上所示

后续事件如何分发:事件分发之ViewGroup

你可能感兴趣的:(android,android,安卓,移动开发,事件处理机制,java)