1.Activity事件处理

package com.example.eventdemo01;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.MotionEvent;public class MainActivity extends AppCompatActivity {private static final String TAG = "xtm";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {DebugUtils.printLogD(TAG,"Activity dispatchTouchEvent.");return super.dispatchTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent event) {DebugUtils.printLogD(TAG,"Activity onTouchEvent.");return super.onTouchEvent(event);}}

按下:会回调一次dispatchTouchEvent,onTouchEvent

移动:多次回调dispatchTouchEvent,onTouchEvent

抬起:会回调一次dispatchTouchEvent,onTouchEvent

相关日志:

// 按下
2020-12-28 09:51:49.210 17300-17300/com.example.eventdemo01 D/xtm: Activity dispatchTouchEvent.
2020-12-28 09:51:49.210 17300-17300/com.example.eventdemo01 D/xtm: Activity onTouchEvent.
// 移动
2020-12-28 09:51:49.848 17300-17300/com.example.eventdemo01 D/xtm: Activity dispatchTouchEvent.
2020-12-28 09:51:49.848 17300-17300/com.example.eventdemo01 D/xtm: Activity onTouchEvent.
2020-12-28 09:51:49.865 17300-17300/com.example.eventdemo01 D/xtm: Activity dispatchTouchEvent.
2020-12-28 09:51:49.865 17300-17300/com.example.eventdemo01 D/xtm: Activity onTouchEvent.
2020-12-28 09:51:49.881 17300-17300/com.example.eventdemo01 D/xtm: Activity dispatchTouchEvent.
2020-12-28 09:51:49.881 17300-17300/com.example.eventdemo01 D/xtm: Activity onTouchEvent.
2020-12-28 09:51:49.897 17300-17300/com.example.eventdemo01 D/xtm: Activity dispatchTouchEvent.
2020-12-28 09:51:49.898 17300-17300/com.example.eventdemo01 D/xtm: Activity onTouchEvent.
2020-12-28 09:51:49.915 17300-17300/com.example.eventdemo01 D/xtm: Activity dispatchTouchEvent.
2020-12-28 09:51:49.915 17300-17300/com.example.eventdemo01 D/xtm: Activity onTouchEvent.
2020-12-28 09:51:49.932 17300-17300/com.example.eventdemo01 D/xtm: Activity dispatchTouchEvent.
2020-12-28 09:51:49.932 17300-17300/com.example.eventdemo01 D/xtm: Activity onTouchEvent.
2020-12-28 09:51:49.948 17300-17300/com.example.eventdemo01 D/xtm: Activity dispatchTouchEvent.
2020-12-28 09:51:49.948 17300-17300/com.example.eventdemo01 D/xtm: Activity onTouchEvent.
// 抬起
2020-12-28 09:51:50.962 17300-17300/com.example.eventdemo01 D/xtm: Activity dispatchTouchEvent.
2020-12-28 09:51:50.962 17300-17300/com.example.eventdemo01 D/xtm: Activity onTouchEvent.

2.ViewGroup事件处理

自定义一个ViewGroup

package com.example.eventdemo01;import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.LinearLayout;public class MyViewGroup extends LinearLayout {private static final String TAG = "xtm";public MyViewGroup(Context context, AttributeSet attrs) {super(context, attrs);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {DebugUtils.printLogD(TAG,"MyViewGroup dispatchTouchEvent.");return super.dispatchTouchEvent(ev);}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {DebugUtils.printLogD(TAG,"MyViewGroup onInterceptTouchEvent.");return super.onInterceptTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent ev) {boolean isConsume = super.onTouchEvent(ev);DebugUtils.printLogD(TAG,"MyViewGroup onTouchEvent. isConsume:"+isConsume);return isConsume;}
}

布局:

<?xml version="1.0" encoding="utf-8"?>
<com.example.eventdemo01.MyViewGroup xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">
</com.example.eventdemo01.MyViewGroup>

点击一次的打印:

// 按下
2020-12-28 14:25:33.741 7326-7326/com.example.eventdemo01 D/xtm: Activity dispatchTouchEvent.
2020-12-28 14:25:33.741 7326-7326/com.example.eventdemo01 D/xtm: MyViewGroup dispatchTouchEvent.
2020-12-28 14:25:33.741 7326-7326/com.example.eventdemo01 D/xtm: MyViewGroup onInterceptTouchEvent.
2020-12-28 14:25:33.741 7326-7326/com.example.eventdemo01 D/xtm: MyViewGroup onTouchEvent. isConsume:false
2020-12-28 14:25:33.741 7326-7326/com.example.eventdemo01 D/xtm: Activity onTouchEvent.
// 移动
2020-12-28 14:25:34.948 7326-7326/com.example.eventdemo01 D/xtm: Activity dispatchTouchEvent.
2020-12-28 14:25:34.948 7326-7326/com.example.eventdemo01 D/xtm: Activity onTouchEvent.
2020-12-28 14:25:34.963 7326-7326/com.example.eventdemo01 D/xtm: Activity dispatchTouchEvent.
2020-12-28 14:25:34.963 7326-7326/com.example.eventdemo01 D/xtm: Activity onTouchEvent.
2020-12-28 14:25:34.980 7326-7326/com.example.eventdemo01 D/xtm: Activity dispatchTouchEvent.
2020-12-28 14:25:34.980 7326-7326/com.example.eventdemo01 D/xtm: Activity onTouchEvent.
2020-12-28 14:25:35.097 7326-7326/com.example.eventdemo01 D/xtm: Activity dispatchTouchEvent.
2020-12-28 14:25:35.097 7326-7326/com.example.eventdemo01 D/xtm: Activity onTouchEvent.
// 抬起
2020-12-28 14:25:36.269 7326-7326/com.example.eventdemo01 D/xtm: Activity dispatchTouchEvent.
2020-12-28 14:25:36.269 7326-7326/com.example.eventdemo01 D/xtm: Activity onTouchEvent.

3.View事件处理

父亲布局:

package com.example.eventdemo01;import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.LinearLayout;public class MyViewGroup extends LinearLayout {private static final String TAG = "xtm";public MyViewGroup(Context context, AttributeSet attrs) {super(context, attrs);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {DebugUtils.printLogD(TAG,"MyViewGroup dispatchTouchEvent.");return super.dispatchTouchEvent(ev);}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {DebugUtils.printLogD(TAG,"MyViewGroup onInterceptTouchEvent.");return super.onInterceptTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent ev) {boolean isConsume = super.onTouchEvent(ev);DebugUtils.printLogD(TAG,"MyViewGroup onTouchEvent. isConsume:"+isConsume);return isConsume;}
}

子布局

package com.example.eventdemo01;import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.LinearLayout;import androidx.annotation.Nullable;public class MyLinearLayout extends LinearLayout {private static final String TAG = "xtm";public MyLinearLayout(Context context, @Nullable AttributeSet attrs) {super(context, attrs);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {DebugUtils.printLogD(TAG,"MyLinearLayout dispatchTouchEvent.");return super.dispatchTouchEvent(ev);}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {DebugUtils.printLogD(TAG,"MyLinearLayout onInterceptTouchEvent.");return false;}@Overridepublic boolean onTouchEvent(MotionEvent ev) {boolean isConsume = super.onTouchEvent(ev);DebugUtils.printLogD(TAG,"MyLinearLayout onTouchEvent. isConsume:"+isConsume);return isConsume;}
}

子布局嵌套一个View

package com.example.eventdemo01;import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;public class MyImageView extends AppCompatImageView {private static final String TAG = "xtm";public MyImageView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);}@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {DebugUtils.printLogD(TAG,"MyImageView dispatchTouchEvent.");return super.dispatchTouchEvent(event);}@Overridepublic boolean onTouchEvent(MotionEvent event) {boolean isConsume = super.onTouchEvent(event);DebugUtils.printLogD(TAG,"MyImageView onTouchEvent. isConsume:"+isConsume);return isConsume;}}

布局:

<?xml version="1.0" encoding="utf-8"?>
<com.example.eventdemo01.MyViewGroup xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><com.example.eventdemo01.MyLinearLayoutandroid:background="#00BCD4"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><com.example.eventdemo01.MyImageViewandroid:layout_gravity="center"android:background="#f0f"android:layout_width="300dp"android:layout_height="300dp"/></com.example.eventdemo01.MyLinearLayout></com.example.eventdemo01.MyViewGroup>

按下抬起后打印:

// 按下
2020-12-28 14:28:49.661 8586-8586/com.example.eventdemo01 D/xtm: Activity dispatchTouchEvent.
2020-12-28 14:28:49.661 8586-8586/com.example.eventdemo01 D/xtm: MyViewGroup dispatchTouchEvent.
2020-12-28 14:28:49.661 8586-8586/com.example.eventdemo01 D/xtm: MyViewGroup onInterceptTouchEvent.
2020-12-28 14:28:49.661 8586-8586/com.example.eventdemo01 D/xtm: MyLinearLayout dispatchTouchEvent.
2020-12-28 14:28:49.661 8586-8586/com.example.eventdemo01 D/xtm: MyLinearLayout onInterceptTouchEvent.
2020-12-28 14:28:49.661 8586-8586/com.example.eventdemo01 D/xtm: MyImageView dispatchTouchEvent.
2020-12-28 14:28:49.661 8586-8586/com.example.eventdemo01 D/xtm: MyImageView onTouchEvent. isConsume:false
2020-12-28 14:28:49.661 8586-8586/com.example.eventdemo01 D/xtm: MyLinearLayout onTouchEvent. isConsume:false
2020-12-28 14:28:49.661 8586-8586/com.example.eventdemo01 D/xtm: MyViewGroup onTouchEvent. isConsume:false
2020-12-28 14:28:49.661 8586-8586/com.example.eventdemo01 D/xtm: Activity onTouchEvent.
// 移动
2020-12-28 14:28:50.546 8586-8586/com.example.eventdemo01 D/xtm: Activity dispatchTouchEvent.
2020-12-28 14:28:50.546 8586-8586/com.example.eventdemo01 D/xtm: Activity onTouchEvent.
2020-12-28 14:28:50.563 8586-8586/com.example.eventdemo01 D/xtm: Activity dispatchTouchEvent.
2020-12-28 14:28:50.563 8586-8586/com.example.eventdemo01 D/xtm: Activity onTouchEvent.
2020-12-28 14:28:50.580 8586-8586/com.example.eventdemo01 D/xtm: Activity dispatchTouchEvent.
2020-12-28 14:28:50.580 8586-8586/com.example.eventdemo01 D/xtm: Activity onTouchEvent.
// 抬起
2020-12-28 14:28:51.229 8586-8586/com.example.eventdemo01 D/xtm: Activity dispatchTouchEvent.
2020-12-28 14:28:51.229 8586-8586/com.example.eventdemo01 D/xtm: Activity onTouchEvent.

观察设置MyLinearLayout的onInterceptTouchEvent和onTouchEvent的不同返回值的事件传递

按下移动并抬起MyImageView:

onInterceptTouchEvent

onTouchEvent

按下

移动

抬起

false

false

dispatchTouchEvent:Activity->MyViewGroup->MyLinearLayout->MyImageView

onTouchEvent:MyImageView->MyLinearLayout->ViewGroup->Actvity

dispatchTouchEvent: Activity

onTouchEvent:Activity

同移动

false

true

dispatchTouchEvent:Activity->MyViewGroup->MyLinearLayout->MyImageView

onTouchEvent:MyImageView->MyLinearLayout

dispatchTouchEvent: Activity->MyViewGroup->MyLinearLayout

onTouchEvent:MyLinearLayout

同移动

true

false

dispatchTouchEvent:Activity->MyViewGroup->MyLinearLayout

onTouchEvent:MyLinearLayout->ViewGroup->Actvity

dispatchTouchEvent: Activity

onTouchEvent: Activity

同移动

true

true

dispatchTouchEvent:Activity->MyViewGroup->MyLinearLayout

onTouchEvent:MyLinearLayout

dispatchTouchEvent: Activity->MyViewGroup->MyLinearLayout

onTouchEvent: MyLinearLayout

同移动

从上表看出:

1.移动事件主要看onTouchEvent的返回值,true表示所有移动事件都在这里处理,不再回传给父布局处理;false表示向父布局找一个返回true的布局,若没有的话就都交给了Activity处理。

2.onInterceptTouchEvent表示事件是否向下传递。

3.onTouchEvent表示事件最终由谁处理。

已获取焦点的子ViewGroup可以通过以下方法拦截事件:

/*** Called when a child does not want this parent and its ancestors to* intercept touch events with* {@link ViewGroup#onInterceptTouchEvent(MotionEvent)}.** <p>This parent should pass this call onto its parents. This parent must obey* this request for the duration of the touch (that is, only clear the flag* after this parent has received an up or a cancel.</p>* * @param disallowIntercept True if the child does not want the parent to*            intercept touch events.*/
public void requestDisallowInterceptTouchEvent(boolean disallowIntercept);

Android事件传递简单分析相关推荐

  1. 细说Android事件传递

    一.View的dispatchTouchEvent和onTouchEvent 探讨Android事件传递机制前,明确android的两大基础控件类型:View和ViewGroup.View即普通的控件 ...

  2. Android事件传递机制(转)

    Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都 ...

  3. android touch机制,细说Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)...

    本文背景:前些天用到了之前写的自定义图片文字复合控件,在给他设置监听时遇到了麻烦.虽然最后解决了问题,但发现在不重写LinearLayout的onInterceptTouchEvent时,子Image ...

  4. Android Handler机制简单分析

    丨版权说明 : <Android Handler机制简单分析>于当前CSDN博客和乘月网属同一原创,转载请说明出处,谢谢. 本文一切从简,将围绕以下流程展开叙述: what why how ...

  5. Android 事件传递机制总结

    Android 事件传递机制总结 Android View虽然不是四大组件,但是其重要程度堪比四大组件.初级工程师到中高级工程师,这些都是很重要的,因为事件分发机制面试也会经常被提及,如果我们能get ...

  6. android imageview 事件传递,Android 事件传递机制TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件注意事项...

    本文讲解TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件 Android 事件传递机制:Android 事件传递机制初涉 我们知道 Button ...

  7. Android 事件分发机制分析及源码详解

    Android 事件分发机制分析及源码详解 文章目录 Android 事件分发机制分析及源码详解 事件的定义 事件分发序列模型 分发序列 分发模型 事件分发对象及相关方法 源码分析 事件分发总结 一般 ...

  8. Android事件传递可以这样理解

    前言 关于Android中事件传递机制早已是老生常谈的话题,甭管工作多久水平咋样应该都能道出一二.依稀记得刚接触事件分发那会,一股脑的钻进网络上那几张神图,什么三大方法.职责链,最后再巴拉巴拉贴一大堆 ...

  9. android 时间传递,Android事件传递

    事件经过主要的三层,分别是Activity.Layout(多个).View 三者都拥有dispatchTouchEvent和onTouchEvent方法. dispatchTouchEvent是用来控 ...

最新文章

  1. HDU 5988 最小费用流
  2. mysql最高权限超级用户是_MySQL中,预设的、拥有最高权限超级用户的用户名为( )...
  3. ZooKeeper available but no active master location found
  4. [poj2446]Chessboard
  5. mybatis insert 动态生成插入的列及插入的值
  6. linux input设备冲突,linux input设备怎么固定event handler
  7. 毕设题目:Matlab DTMF双音多频
  8. linux下编译yacc命令,Lex/Yacc的学习——《编译原理及实践》附录B tiny编译器源码在linux下编译实现...
  9. 【Solr原理】Leader Shard选举
  10. 微信HOOK协议软件,已实现云控,将微信的效率最大化
  11. 面试25个经典问题回答技巧
  12. centos 7进入rescue模式
  13. 靠腾讯光速上位,但同程艺龙可不能忘了“练内功”
  14. EPICS记录参考1--EPICS概要
  15. python搭建博客系统_Mezzanine 搭建 BLOG 系统
  16. 入驻三年,Airbnb在中国做了什么?
  17. halcon 计算图像的反余弦值:acos_image
  18. 时间弥散谱成像和IMPULSED
  19. happens-before揭秘
  20. 原生js + 后端nodejs实现邮箱信封表白程序

热门文章

  1. Linux服务器CPU100%问题
  2. dxp全称_DXP元件名字库
  3. 基于汇编语言的DS18B20温度传感器设计
  4. linux lcm 接口,lcm接口ubuntu16.04系统qt编程详细步骤
  5. C语言:利用函数输出PI值
  6. 谁动了我的奶酪(读后感)
  7. java rewind()_Java NIO Buffer的clear()、reset()、rewind()、flip()方法的区别
  8. Linux系统UID和GID详解
  9. Linux-makefile命令后面的-j4 -j8是什么意思?
  10. 超全!常用的 70 个数据分析网址