跟touch事件相关的3个方法:
public boolean dispatchTouchEvent(MotionEvent ev); //用来分派event
public boolean onInterceptTouchEvent(MotionEvent ev); //用来拦截event
public boolean onTouchEvent(MotionEvent ev); //用来处理event
三个方法的用法:
dispatchTouchEvent() 用来分派事件。
其中调用了onInterceptTouchEvent()和onTouchEvent(),一般不重写该方法
onInterceptTouchEvent() 用来拦截事件。
ViewGroup类中的源码实现就是{return false;}表示不拦截该事件,
事件将向下传递(传递给其子View);
若手动重写该方法,使其返回true则表示拦截,事件将终止向下传递
事件由当前ViewGroup类来处理,就是调用该类的onTouchEvent()方法
onTouchEvent() 用来处理事件。
返回true则表示该View能处理该事件,事件将终止向上传递(传递给其父View);
返回false表示不能处理,则把事件传递给其父View的onTouchEvent()方法来处理
【注】:ViewGroup的某些子类(GridView、ScrollView…)重写了onInterceptTouchEvent()方法,当发生ACTION_MOVE事件时,返回true进行拦截。

拥有这三个方法的类:
Activity        :dispatchTouchEvent();                 onTouchEvent();
ViewGroup       :dispatchTouchEvent();   onInterceptTouchEvent();     onTouchEvent();
View         :dispatchTouchEvent();                 onTouchEvent();

现在重写  activity ViewGroup  View 的相应方法,构造布局。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".MainActivity">
  8.  
  9. <com.event.MyViewGroup
  10. android:id="@+id/myViewGroup"
  11. android:background="@color/colorPrimary"
  12. android:layout_width="400dp"
  13. android:layout_height="400dp">
  14.  
  15. <com.event.MyView
  16. android:id="@+id/myView"
  17. android:layout_width="200dp"
  18. android:layout_height="200dp" />
  19. </com.pig.event.MyViewGroup>
  20.  
  21. </android.support.constraint.ConstraintLayout>

1、点击空白处(activity),输出:

  1. activity dispatchTouchEvent:
  2. activity onTouchEvent:

直接点击  activity  触发  activity相应方法。与 内部控件无关

2、点击蓝色部分(ViewGroup),输出:(当我们手动设置OnTouchListener  并且返回true时,会拦截事件, onTouchEvent不会触发   )

  1. activity dispatchTouchEvent:
  2. group dispatchTouchEvent:
  3. group onInterceptTouchEvent:
  4. group onTouch: OnTouchListener 部分)
  5. group onTouchEvent:
  6. activity onTouchEvent:

(1)由于activity没有拦截事件的方法,事件肯定会传进ViewGroup。

(2)ViewGroup 中的onTouchEvent 默认返回fasle  表示事件未处理完,则会触发activity的onTouchEvent

3、点击按钮(View),输出:(当我们手动设置OnTouchListener  并且返回true时,会拦截事件, onTouchEvent不会触发   )

  1. activity dispatchTouchEvent:
  2. group dispatchTouchEvent:
  3. group onInterceptTouchEvent:
  4. view dispatchTouchEvent:
  5. view onTouch: OnTouchListener 部分)
  6. view onTouchEvent:

(1)activity分发事件进ViewGroup ,ViewGroup分发事件时,选择是否拦截事件,若不拦截则分发事件到View,若拦截事件,ViewGroup自己将事件处理,View不会接收到事件。

(2)view 的onTouchEvent默认返回true ,表示事件以处理完,不会触发ViewGroup  和 activity 的onTouchEvent。

Android Touch事件分发的更多相关文章

  1. Android Touch事件分发过程

    虽然网络上已经有非常多关于这个话题的优秀文章了,但还是写了这篇文章,主要还是为了加强自己的记忆吧,自己过一遍总比看别人的分析要深刻得多.那就走起吧. 简单演示样例 先看一个演示样例 : 布局文件 : ...

  2. 【转】Android:Touch事件分发机制

    Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...

  3. Android Touch事件分发机制

    参考:http://blog.csdn.net/xiaanming/article/details/21696315 参考:http://blog.csdn.net/wangjinyu501/arti ...

  4. Android Touch事件分发机制学习

    Android  事件分发机制 ViewGroup dispatchTouchEvent 返回true dispatchTouchEvent: Activity ACTION_DOWN Myrelat ...

  5. android touch事件分发流程

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 三个方法:分发触摸事件dispatchTouchEvent.在触摸事件的时候onTouc ...

  6. Android开发之Touch事件分发机制

    原地址http://www.cnblogs.com/linjzong/p/4191891.html Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实 ...

  7. Android事件分发机制(二)30分钟弄明白Touch事件分发机制

    Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...

  8. Android:30分钟弄明白Touch事件分发机制

    Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...

  9. Android Touch事件传递机制 二:单纯的(伪生命周期)

    转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...

随机推荐

  1. 本地安装Sass,Compass

    使用本地的gem文件来安装Sass和Compass. 1.安装Ruby http://rubyinstaller.org/downloads/ 下载之后双击安装即可,在安装过程中可以选择“Add Ru ...

  2. cmake ccmake

    下载libqrencode源码编译过程 git clone https://github.com/fukuchi/libqrencode.git 2001  mkdir build 2002  cd ...

  3. 邁向IT專家成功之路的三十則鐵律 鐵律十九:IT人待業之道-寬心

    說來很多人可能不相信,筆者從來不把失業當作是一件嚴重的事,相反的我會把它當作是一個很好的轉機.針對一個隨時做好準備的IT人,三個月或半年沒有上班完全沒有甚麼好擔心的.只是如何善用待業的時間,說實在的真 ...

  4. mac os安装jdk、卸载

    1.JAVA版本8u171与8u172的区别  https://blog.csdn.net/u014653815/article/details/80435226  奇数版本是稳定版本,上面修订的所有 ...

  5. ES6新语法学习

    参考: 1.http://es6.ruanyifeng.com/#docs/let#let-命令 2.https://reactjs.org/tutorial/tutorial.html 3.http ...

  6. 【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】

    [002-Add Two Numbers (单链表表示的两个数相加)] 原题 You are given two linked lists representing two non-negative ...

  7. git 忽略文件的三种方式

    1. 在项目目录下新建.gitignore文件并添加规则 特点:此种方式的忽略规则只局限于本项目目录及其子目录,并且.gitignore文件会被提交到远程仓库进行共享忽略规则. 2. 在.git/in ...

  8. 从头认识java-14.1 再次对照数组与容器

    这一章节我们再次深入的对照数组与容器. 数组与容器主要集中在三个方面:效率.类型.基础类型. 我们能够从三方面做出对照. 1.效率 这里的下来是指add和get 的速度 以下以add为例: packa ...

  9. IMDB-WIKI - 具有年龄和性别标签的500k +脸部图像

    Rasmus Rothe, Radu Timofte, Luc Van Gool DEX:从单一形象深刻地看待年龄 观看 人物研讨会国际计算机视觉大会(ICCV),2015*获胜LAP面对年龄估计的挑 ...

  10. 第一个php小程序(学习)

    </pre><pre name="code" class="php"><? php $b=array("name&quo ...