5.View的事件分发机制/事件处理机制原理分析

事件MotionEvent包含了哪几个?

  1. ACTION_DOWN 手指触碰到屏幕时触发,只会执行一次
  2. ACTION_MOVE 手指在屏幕上滑动出发,会执行多次
  3. ACTION_UP 手指抬起离开屏幕出发,只会执行一次
  4. ACTION_CANCEL 事件被上层拦截时会触发
    • 父容器ViewGroup需要从子View手中抢夺分发的事件进行处理时,会用到ACTION_CANCEL
    • ViewGroup的事件分发中,通过如下代码会将事件状态置为ACTION_CANCEL:
      final boolean cancelChild = resetCancelNextUpFlag(target.child) || intercepted;
    • 所以,在父容器ViewGroup在进行事件分发时,父容器ViewGroup需要将事件从子View中抢夺过来;
      • 处理第一次ACTION_MOVE事件中,cancelChild值为true时,会通过dispatchTransformedTouchEvent()方法中,将状态更改为ACTION_CANCEL,这个操作会执行一次子View的事件分发dispatchTouchEvent方法,并且状态是ACTION_CANCEL,也就是说子View没有消费该事件,这会将子View中的事件剥夺给到父容器ViewGroup;
      • 在父容器中进行第二次ACTION_MOVE的操作时,父容器ViewGroup进行事件处理

总结:
View是负责事件处理onTouchEvent的,而ViewGroup主要是负责事件分发的dispatchTouchEvent() .

事件的接收流程?(事件是在哪里接收的?)

  1. 通过WindowInputEventReceiver接收事件
  • ViewRootImpl.javasetView()方法中,通过如下对象WindowInputEventReceiver去接收我们的事件,代码如下:
    mInputEventReceiver = new WindowInputEventReceiver(inputChannel, Looper.myLooper());
  1. 接收到的事件最后进入到ActivitydispatchTouchEvent()去处理,过程如下:
  • 接着我们去研究WindowInputEventReceiver中的onInputEvent方法,
  • 然后调用enqueueInputEvent方法,
  • 接着调用doProcessInputEvents方法,
  • 然后调用deliverInputEvent(q)方法,
  • 接着调用stage.deliver(q)方法,
  • 接着调用onProcess(q)方法,注意这里stage实际调用的是实现类ViewPostImeInputStageonProcess方法,
  • 接着调用processPointerEvent(q)方法,
  • 然后调用mView.dispatchPointerEvent(event),注意这里的mViewDecorView,在DecorView的终极超类View中才有重写dispatchPointerEvent(event)方法;
  • 接着调用View.java中的dispatchTouchEvent方法,这里会调用到实现类DecorView中的dispatchTouchEvent方法,
  • 这里会通过cb.dispatchTouchEvent(ev)调用到Activity中的dispatchTouchEvent()方法
    • 解释说明Activity由来:
      //这里的变量cb其实是Activity,
      //因为在(PhoneWindow)Window中setCallback(callback)方法,
      //传入的参数值是Activity的this引用
      Window.Callback cb = mWindow.getCallback();
      
  1. 接着从Activity中的dispatchTouchEvent()方法往下分析;
  2. 接着执行PhoneWindow中的superDispatchTouchEvent()方法;
  3. 接着执行DecorView中的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值