android事件分发流程图

android手机基于用户的手指触摸来和用户进行交互,如你需要点击某个按钮进行跳转到另外一个页面;上下滑动列表看下一页的列表数据;或者横向水平滑动看下一个tab页面,这其中都涉及到事件分发机制,它们之间遵循着哪种规则呢?

  如下图所示,是android中常见的视图结构,当我点击view的时候,最先响应的是它的父容器viewGroup,执行事件分发dispatchTouchEvent(MotionEvent e),在这个方法的内部会走它自身的onInterceptTouchEvent(MotionEvent e)进行事件拦截判断,如果该方法返回值为true(进行拦截),则该事件不会传递给它的子view,会走到viewGroup的onTouchEvent(MotionEvent e)事件;如果该方法返回为false(不进行拦截),则会传递给子view,子view的dispatchTouchEvent(MotionEvent e)方法执行,因为子view没有孩子,所以它没有onInterceptTouchEvent(MotionEvent e)拦截方法,而是直接走到onTouchEvent(MotionEvent e)事件,返回true,则表明消费该事件,父容器viewGroup的onTouchEvent(MotionEvent e)不会执行;如果子view的onTouchEvent(MotionEvent e)事件返回false,则表明不消费该事件,往上抛给它的父容器viewGroup,父容器的onTouchEvent(MotionEvent e)事件会执行。以此类推,树状结果,从根部开始往下遍历,走到子view的onTouchEvent(MotionEvent e),根据它的返回结果,反馈给它的父容器。

Android中view事件分发机制流程如下:

上述流程中有关onTouch(View v, MotionEvent event)和onClick()方法进行说明:

   1.如果View或者ViewGroup设置了View.OnTouchListener()事件,则在执行onTouchEvent(MotionEvent event)之前会执行onTouch(View v, MotionEvent event)方法,它的返回结果决定onTouchEvent(MotionEvent event)是否执行,返回false,则执行onTouchEvent(MotionEvent event);返回true,则不执行onTouchEvent(MotionEvent event)。

   2.onClick()事件类似,前提是设置了View.OnClickListener()事件,且执行了performClick()事件,performClick()方法的执行依赖于onTouchEvent(MotionEvent event)方法的返回值,为true,则执行performClick();为false,则不执行performClick(),也就不会执行onClick()方法了。

 

 上述讲解比较理论,欢迎就项目中遇见的具体问题来讨论。