从view说起

android中所有控件都是viewGroup或者view的子类
然后就涉及到了View的dispatchTouchEvent方法

    public boolean dispatchTouchEvent(MotionEvent event) {        // If the event should be handled by accessibility focus first.        if (event.isTargetAccessibilityFocus()) {            // We don't have focus or no virtual descendant has it, do not handle the event.            if (!isAccessibilityFocusedViewOrHost()) {                return false;            }            // We have focus and got the event, then use normal event dispatch.            event.setTargetAccessibilityFocus(false);        }        boolean result = false;        if (mInputEventConsistencyVerifier != null) {            mInputEventConsistencyVerifier.onTouchEvent(event, 0);        }        final int actionMasked = event.getActionMasked();        if (actionMasked == MotionEvent.ACTION_DOWN) {            // Defensive cleanup for new gesture            stopNestedScroll();        }        if (onFilterTouchEventForSecurity(event)) {            //noinspection SimplifiableIfStatement            ListenerInfo li = mListenerInfo;            if (li != null && li.mOnTouchListener != null                    && (mViewFlags & ENABLED_MASK) == ENABLED                    && li.mOnTouchListener.onTouch(this, event)) {                result = true;            }            if (!result && onTouchEvent(event)) {                result = true;            }        }        if (!result && mInputEventConsistencyVerifier != null) {            mInputEventConsistencyVerifier.onUnhandledEvent(event, 0);        }        // Clean up after nested scrolls if this is the end of a gesture;        // also cancel it if we tried an ACTION_DOWN but we didn't want the rest        // of the gesture.        if (actionMasked == MotionEvent.ACTION_UP ||                actionMasked == MotionEvent.ACTION_CANCEL ||                (actionMasked == MotionEvent.ACTION_DOWN && !result)) {            stopNestedScroll();        }        return result;    }

在View的触摸屏传递机制中通过分析dispatchTouchEvent方法源码我们会得出如下基本结论:

触摸控件(View)首先执行dispatchTouchEvent方法。
在dispatchTouchEvent方法中先执行onTouch方法,后执行onClick方法(onClick方法在onTouchEvent中执行,下面会分析)。
如果控件(View)的onTouch返回false或者mOnTouchListener为null(控件没有设置setOnTouchListener方法)或者控件不是enable的情况下会调运onTouchEvent,dispatchTouchEvent返回值与onTouchEvent返回一样。
如果控件不是enable的设置了onTouch方法也不会执行,只能通过重写控件的onTouchEvent方法处理(上面已经处理分析了),dispatchTouchEvent返回值与onTouchEvent返回一样。
如果控件(View)是enable且onTouch返回true情况下,dispatchTouchEvent直接返回true,不会调用onTouchEvent方法。

ViewGroup关于触摸屏事件的传递机制

Android事件派发是先传递到最顶级的ViewGroup,再由ViewGroup递归传递到View的。
在ViewGroup中可以通过onInterceptTouchEvent方法对事件传递进行拦截,onInterceptTouchEvent方法返回true代表不允许事件继续向子View传递,返回false代表不对事件进行拦截,默认返回false。
子View中如果将传递的事件消费掉,ViewGroup中将无法接收到任何事件。

Android的Activity->ViewGroup->View的触摸屏事件分发机制还不是很懂。

日后在看感谢大神的博客

更多相关文章

  1. Android 中日期控件与下拉列表的使用
  2. android 9.0获取mac地址的方法
  3. Android实现音量调节的方法
  4. android 8.1 去掉设置中搜索项或去掉其点击事件
  5. android常用intent的方法
  6. 2012-7-20 android 图片叠加效果——两种方法
  7. Android右滑返回上一个界面的实现方法
  8. 系统关闭GPRS数据流量和 GPS的方法

随机推荐

  1. AndroidStudio多渠道打包心得
  2. Android 调试之 Log和LogCat的详解
  3. Android(安卓)NDK开发:JNI基础篇
  4. shape 的创建和使用
  5. Android 开发笔记 04 篇:Mqtt 框架 - Paho
  6. Android事件处理的两种模型
  7. Android——coredump解析
  8. Android(安卓)4.1 - 如何使用systrace做
  9. Android高仿网易新闻客户端之首页
  10. Android开发入门教程