您的位置:首页 > 移动开发 > Android开发

Android事件分发

2016-07-14 17:03 387 查看

一.Android事件分发是什么? 

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

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

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

 * dispatchTouchEvent()返回true或者false表示是否继续事件分发 事件的分发从dispatchTouchEvent()开始. 

   方法dispatchTouchEvent()返回值为true时表示继续事件分发;返回值为false时表示终止事件分发.

 * onTouch()返回 true或者false表示是事件是否被消耗 返回true表示事件已经消耗,返回false表示事件未消耗.

   先调用onTouch()后调用onTouchEvent(),在onTouch()方法中处理了Touch事件,即处理一系列的
              ACTION_DOWN,ACTION_MOVE,ACTION_UP事件, 事件未被消耗才会调用onTouchEvent(event).

android里面的按键事件都是一层一层分发的,每一次处理都默认的调super方法,这样就能保证能一层一层下去。如果你重写按键事件,显示的return true,就表示你消耗掉了这个按键事件,消息发到你这里被消耗掉(点击屏幕这个动作的生命周期被你结束掉),不再往下发。return false 则是没有消耗这个按键并不是不处理,只是这个事件还会下发下去给别的地方拦截调用。不管你返回false还是true都可以响应OnClick方法

 * onTouchEvent()中主要处理点击Click事件 ,在onTouchEvent(event)中的ACTION_UP事件里会调用
   performClick()处理OnClick点击事件

***************************************************************************************

 *   1 Touch事件先于Click事件发生和处理,且注意onTouch()方法默认返回为false. 

 *   2 只有在onTouch()返回false时(即事件未被消耗)才会调用onTouchEvent() 

 *   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 子View对于ACTION_DOWN的处理十分重要!!!!! 

 *   ACTION_DOWN是一系列Touch事件的开端,如果子View对于该ACTION_DOWN事件在onTouchEvent()中返回了false即未消费. 

 *   那么ViewGroup就不会把后续的ACTION_MOVE和ACTION_UP派发给该子View.在这种情况下ViewGroup就和普通的View一样了, 

 *   调用该ViewGroup自己的dispatchTouchEvent()从而调用自己的onTouchEvent();即不会将事件分发给子View. 

 *   

 * 2 为什么子view对于Touch事件处理返回true那么其上层的ViewGroup就无法处理Touch事件了????? 

 *   这个想必大家都知道了,因为该Touch事件被子View消费了其上层的ViewGroup就无法处理该Touch事件了. 

[java]
view plain
copy

print?

  




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



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

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

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

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

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

三.Android事件分发流程图






    后记:有人问学习实践派发有什么用?其实在我们理解android的运行机制,渲染机制时了解了事件派发更加容易理解其原理,对于我们自定义控件的时候是必须用到事件派发的,我自定义的View要与用户交互需要重写OnTouchEvent方法来与用户交互,这个时候Android事件的派发使我们更好地来控制与用户的交互。Android博大精深,里面的东西很多,需要不断学习,自定义View,事件派发,性能优化,这三个都必须学好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: