Android事件分发

来源:互联网 发布:pack php 编辑:程序博客网 时间:2024/06/17 11:42

一.Android事件分发是什么? 

Android事件分发,“事件”指的是 ACTION_DOWN,ACTION_MOVE,ACTION_UP这些事件,我们点击一个Button的时候系统是怎么响应我们的点击的?为什么有的控件可以响应Click事件,有的控件又不能响应Click事件?我点击控件的一瞬间android系统做了多少次派发才调用了OnClick事件? 我们点击控件,Android系统会把事件分发到当前的Activity,至于怎么分发到Activity那就有点复杂了,对于我们开发来说没有很大的作用,我们需要搞懂的是Activity怎么将事件一步步分发到我们点击的控件上面。

  参考文章:Android事件分发详解(一)——View的事件分发

    1.1 Android事件分发相关的三个方法:

  1.  * dispatchTouchEvent()返回true或者false表示是否继续事件分发 事件的分发从dispatchTouchEvent()开始. 
       方法dispatchTouchEvent()返回值为true时表示继续事件分发;返回值为false时表示终止事件分发.

  2.  * onTouch()返回 true或者false表示是事件是否被消耗 返回true表示事件已经消耗,返回false表示事件未消耗.
  3.    先调用onTouch()后调用onTouchEvent(),在onTouch()方法中处理了Touch事件,即处理一系列的               ACTION_DOWN,ACTION_MOVE,ACTION_UP事件, 事件未被消耗才会调用onTouchEvent(event).
  4. android里面的按键事件都是一层一层分发的,每一次处理都默认的调super方法,这样就能保证能一层一层下去。如果你重写按键事件,显示的return true,就表示你消耗掉了这个按键事件,消息发到你这里被消耗掉(点击屏幕这个动作的生命周期被你结束掉),不再往下发。return false 则是没有消耗这个按键并不是不处理,只是这个事件还会下发下去给别的地方拦截调用。不管你返回false还是true都可以响应OnClick方法
  5.  * onTouchEvent()中主要处理点击Click事件 ,在onTouchEvent(event)中的ACTION_UP事件里会调用    performClick()处理OnClick点击事件
  6. ***************************************************************************************
  1.  *   1 Touch事件先于Click事件发生和处理,且注意onTouch()方法默认返回为false. 
  2.  *   2 只有在onTouch()返回false时(即事件未被消耗)才会调用onTouchEvent() 
  3.  *   3 在onTouchEvent()中的ACTION_UP事件会调用performClick()处理OnClick点击事件.(如果控件的clickable为false,那么就不会调用 onclick)

    1.2 dispatchTouchEvent方法部分源代码,事件分发从这里开始   

 public boolean dispatchTouchEvent(MotionEvent event) { 
     //onTouch(this,event)返回true表示事件已经消耗,返回false表示事件未消耗.
    if (mOnTouchListener!= null&&(mViewFlags & ENABLED_MASK)==ENABLED&&mOnTouchListener.onTouch(this,event)){ 
         return true; //if条件满足说明本次事件已经结束,就继续事件分发
      }
       //onTouch返回false表示事件未消耗才会调用onTouchEvent(event)
    return onTouchEvent(event); 

    1.3 子View对于ACTION_DOWN的处理

  1.  * 重点关注: 
  2.  * 1 子View对于ACTION_DOWN的处理十分重要!!!!! 
  3.  *   ACTION_DOWN是一系列Touch事件的开端,如果子View对于该ACTION_DOWN事件在onTouchEvent()中返回了false即未消费. 
  4.  *   那么ViewGroup就不会把后续的ACTION_MOVE和ACTION_UP派发给该子View.在这种情况下ViewGroup就和普通的View一样了, 
  5.  *   调用该ViewGroup自己的dispatchTouchEvent()从而调用自己的onTouchEvent();即不会将事件分发给子View. 
  6.  *   
  7.  * 2 为什么子view对于Touch事件处理返回true那么其上层的ViewGroup就无法处理Touch事件了????? 
  8.  *   这个想必大家都知道了,因为该Touch事件被子View消费了其上层的ViewGroup就无法处理该Touch事件了. 

[java] view plain copy
print?
  1.   

二.Android 界面构成(Activity构成)

  1. Window是一个抽象类,提供了绘制窗口的一组通用API。

  2. PhoneWindow是Window的具体继承实现类。而且该类内部包含了一个DecorView对象,该DectorView对象是所有应用窗口(Activity界面)的根View。

  3. DecorView是PhoneWindow的内部类,是FrameLayout的子类,是对FrameLayout进行功能的修饰(所以叫DecorXXX),是所有应用窗口的根View 。


       参考:Android应用setContentView与LayoutInflater加载解析机制源码分析

                    Android应用层View绘制流程与源码分析

三.Android事件分发流程图



    后记:有人问学习实践派发有什么用?其实在我们理解android的运行机制,渲染机制时了解了事件派发更加容易理解其原理,对于我们自定义控件的时候是必须用到事件派发的,我自定义的View要与用户交互需要重写OnTouchEvent方法来与用户交互,这个时候Android事件的派发使我们更好地来控制与用户的交互。Android博大精深,里面的东西很多,需要不断学习,自定义View,事件派发,性能优化,这三个都必须学好。
0 0
原创粉丝点击