Android事件传递简单分析
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事件传递简单分析相关推荐
- 细说Android事件传递
一.View的dispatchTouchEvent和onTouchEvent 探讨Android事件传递机制前,明确android的两大基础控件类型:View和ViewGroup.View即普通的控件 ...
- Android事件传递机制(转)
Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都 ...
- android touch机制,细说Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)...
本文背景:前些天用到了之前写的自定义图片文字复合控件,在给他设置监听时遇到了麻烦.虽然最后解决了问题,但发现在不重写LinearLayout的onInterceptTouchEvent时,子Image ...
- Android Handler机制简单分析
丨版权说明 : <Android Handler机制简单分析>于当前CSDN博客和乘月网属同一原创,转载请说明出处,谢谢. 本文一切从简,将围绕以下流程展开叙述: what why how ...
- Android 事件传递机制总结
Android 事件传递机制总结 Android View虽然不是四大组件,但是其重要程度堪比四大组件.初级工程师到中高级工程师,这些都是很重要的,因为事件分发机制面试也会经常被提及,如果我们能get ...
- android imageview 事件传递,Android 事件传递机制TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件注意事项...
本文讲解TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件 Android 事件传递机制:Android 事件传递机制初涉 我们知道 Button ...
- Android 事件分发机制分析及源码详解
Android 事件分发机制分析及源码详解 文章目录 Android 事件分发机制分析及源码详解 事件的定义 事件分发序列模型 分发序列 分发模型 事件分发对象及相关方法 源码分析 事件分发总结 一般 ...
- Android事件传递可以这样理解
前言 关于Android中事件传递机制早已是老生常谈的话题,甭管工作多久水平咋样应该都能道出一二.依稀记得刚接触事件分发那会,一股脑的钻进网络上那几张神图,什么三大方法.职责链,最后再巴拉巴拉贴一大堆 ...
- android 时间传递,Android事件传递
事件经过主要的三层,分别是Activity.Layout(多个).View 三者都拥有dispatchTouchEvent和onTouchEvent方法. dispatchTouchEvent是用来控 ...
最新文章
- HDU 5988 最小费用流
- mysql最高权限超级用户是_MySQL中,预设的、拥有最高权限超级用户的用户名为( )...
- ZooKeeper available but no active master location found
- [poj2446]Chessboard
- mybatis insert 动态生成插入的列及插入的值
- linux input设备冲突,linux input设备怎么固定event handler
- 毕设题目:Matlab DTMF双音多频
- linux下编译yacc命令,Lex/Yacc的学习——《编译原理及实践》附录B tiny编译器源码在linux下编译实现...
- 【Solr原理】Leader Shard选举
- 微信HOOK协议软件,已实现云控,将微信的效率最大化
- 面试25个经典问题回答技巧
- centos 7进入rescue模式
- 靠腾讯光速上位,但同程艺龙可不能忘了“练内功”
- EPICS记录参考1--EPICS概要
- python搭建博客系统_Mezzanine 搭建 BLOG 系统
- 入驻三年,Airbnb在中国做了什么?
- halcon 计算图像的反余弦值:acos_image
- 时间弥散谱成像和IMPULSED
- happens-before揭秘
- 原生js + 后端nodejs实现邮箱信封表白程序
热门文章
- Linux服务器CPU100%问题
- dxp全称_DXP元件名字库
- 基于汇编语言的DS18B20温度传感器设计
- linux lcm 接口,lcm接口ubuntu16.04系统qt编程详细步骤
- C语言:利用函数输出PI值
- 谁动了我的奶酪(读后感)
- java rewind()_Java NIO Buffer的clear()、reset()、rewind()、flip()方法的区别
- Linux系统UID和GID详解
- Linux-makefile命令后面的-j4 -j8是什么意思?
- 超全!常用的 70 个数据分析网址