事件传递机制(1)

写这个博客前先补充一下上一个博客的部分内容,我们上一个博客介绍了viewGroup中的代码,那么viewGroup中的分发函数由谁来调用的呢?,当然是activity。
1.首先我们看一下activity中的代码

   public boolean dispatchTouchEvent(MotionEvent ev) {        if (ev.getAction() == MotionEvent.ACTION_DOWN) {            onUserInteraction();        }        if (getWindow().superDispatchTouchEvent(ev)) {            return true;        }        return onTouchEvent(ev);    }

从代码中可以看得出调用了window的分发方法,这个window类是在android_src_home/framework/policies/base/phone/com/android/internal/policy/impl目录下的PhoneWindow.java。
2.我们看一下这个类中代码

    public boolean superDispatchTouchEvent(MotionEvent event) {        return mDecor.superDispatchTouchEvent(event);    }
private DecorView mDecor;

可以看得出来是调用的DecorView中的代码,该类继承FrameLayout,FrameLayout继承ViewGroup。所以activity中也是调用ViewGroup的分发方法分发给窗体中的所有ViewGroup。

好了补充完了以后我们继续探讨一下,事件传递下去以后会不传递回父控件,经过看ViewGroup代码我们知道,如果所有子控件都返回false那么viewGroup就会调用super.onTouchEvent。所以我们可以推理出,如果子控件中OnTouchEvent方法返回false的话会调用上一层的onTouchEvent方法。

所以可以得出结论:
view中方法:分发、处理(分发中调用处理方法)
ViewGroup:分发、继承view处理、拦截
1.事件又上层父控件获取,通过dispatchTouchEnvet()方法中调用所有字控件分发方法,将消息分发给子控件。如果OnInterceptEvent()返回true怎不给子控件分发。
2.没有子控件时调用自己的OnTouchEvent方法。
3.当事件传递到最低端控件还没有得到处理(OnTouchEvent方法都返回false)则调用父类的OnTouchEvent方法

下一个微博将用图文和通俗易懂的方式总结传递机制,让大家能够更深刻的理解。

更多相关文章

  1. Android中的SurfaceFlinger和Choreographer
  2. Android(安卓)ScrollView中包含EditText时ScrollView中控件改变
  3. Android(安卓)JNI直接调用驱动程序
  4. Android(安卓)Material Design控件之NavigationView
  5. ListView监听OnItemClick无响应
  6. Android中自定义View的MeasureSpec使用
  7. [置顶] Android(安卓)Camera系统
  8. Android音频系统之AudioFlinger(四)
  9. 浅析android下propt怎么通过init进程传递和glibc库函数的添加

随机推荐

  1. 彻底解决Android(安卓)GPS没法定位这一顽
  2. android:layout_gravity 和 android:grav
  3. Android中关于android:imeOptions="actio
  4. Android(安卓)开发艺术探索笔记之七 -- A
  5. 【Android您问我讲】Android(安卓)2.x中
  6. android学习日记01-搭配开发环境
  7. Android进程 Handler Message Looper
  8. 移动互联网的新宠:Android之缤纷世界
  9. 处女男学Android(十五)---Android(安卓)广
  10. 第1章 android发展史