首页 > 代码库 > View的事件处理流程

View的事件处理流程

一直对view的事件处理流程迷迷糊糊,今天花了点时间写了个栗子把它弄明白了。

1.view的常用的事件分为:单击事件(onClick)、长按事件(onLongClick)、触摸事件(onTouch),另外view也有自己的onTouchEvent方法,这么多与事件相关的方法都由dispatchTouchEvent管理

2.根据面向对象思想,onTouch事件被封装成 MotionEvent 对象,常见的几个动作如图:

动作简介
ACTION_DOWN 手指 初次接触到屏幕 时触发。
ACTION_MOVE 手指 在屏幕上滑动 时触发,会会多次触发。
ACTION_UP 手指 离开屏幕 时触发。
ACTION_CANCEL 事件 被上层拦截 时触发。

3.

  • 单击事件(onClickListener) 需要两个两个事件(ACTION_DOWN 和 ACTION_UP )才能触发,如果先分配给onClick判断,等它判断完,用户手指已经离开屏幕,黄花菜都凉了,定然造成 View 无法响应其他事件,应该最后调用。(最后)
  • 长按事件(onLongClickListener) 同理,也是需要长时间等待才能出结果,肯定不能排到前面,但因为不需要ACTION_UP,应该排在 onClick 前面。(onLongClickListener > onClickListener)
  • 触摸事件(onTouchListener) 如果用户注册了触摸事件,说明用户要自己处理触摸事件了,这个应该排在最前面。(最前)
  • View自身处理(onTouchEvent) 提供了一种默认的处理方式,如果用户已经处理好了,也就不需要了,所以应该排在 onClickListener 前面。( onTouchListener > onClickListener)

 下面是我用写的栗子打印出来的日志:手指按下,不移动,稍等片刻再抬起

技术分享

所以事件的调度顺序应该是 onTouchListener > onTouchEvent > onLongClickListener > onClickListener

技术分享

View的事件处理流程