Android事件分发详解(六)——ACTION_DOWN的消费验证
MainActivity如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
package cn.c;import android.os.Bundle;import android.app.Activity;import android.view.MotionEvent;/** * Demo描述: * 分析Android事件分发和处理机制 * * 在该示例中涉及到三个自定义的View.分别是: * 最外层的布局MyFrameLayout * 内层的布局MyLinearLayout * 最里层的自定义按钮MyButton * * 在dispatchTouchEvent()源码分析中提到一个很重要的东西: * 如果一个View没有处理ACTION_DOWN事件,即对于该事件返回了false(没有消费该事件) * 那么后续的ACTION_MOVE和ACTION_UP均不会再传递到该View;也就是说该View没有了 * 处理ACTION_MOVE和ACTION_UP的资格. * 对于该问题,在此予以验证. * * * MyButton的onTouchEvent()方法中直接返回false. * 那么可以看到MyButton只处理了ACTION_DOWN. * 类似的MyFrameLayout和MyLinearLayout对于Touch事件也直接返回了false;他们也就处理不到 * ACTION_MOVE和ACTION_UP * */public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); System.out.println(===> MainActivity 中调用 onCreate()); System.out.println(--------------------------------------------------); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { System.out.println(===> MainActivity 中调用 dispatchTouchEvent()); System.out.println(===> super.dispatchTouchEvent()默认返回true); System.out.println(--------------------------------------------------); return super.dispatchTouchEvent(ev); } @Override public void onUserInteraction() { System.out.println(===> MainActivity 中调用 onUserInteraction()); System.out.println(--------------------------------------------------); super.onUserInteraction(); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: System.out.println(===> MainActivity 中调用 onTouchEvent()--->ACTION_DOWN); break; case MotionEvent.ACTION_MOVE: System.out.println(===> MainActivity 中调用 onTouchEvent()--->ACTION_MOVE); break; case MotionEvent.ACTION_UP: System.out.println(===> MainActivity 中调用 onTouchEvent()--->ACTION_UP); default: break; } System.out.println(super.onTouchEvent()默认返回false 表示未消费事件); System.out.println(--------------------------------------------------); return super.onTouchEvent(event); } } |
MyFrameLayout如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
package cn.c;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.widget.FrameLayout;public class MyFrameLayout extends FrameLayout{ public MyFrameLayout(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { super.dispatchTouchEvent(ev); System.out.println(外层MyFrameLayout 中调用 dispatchTouchEvent()); System.out.println(super.dispatchTouchEvent()默认返回true 表示继续分发); System.out.println(--------------------------------------------------); return super.dispatchTouchEvent(ev); //return false; } //覆写自ViewGroup @Override public boolean onInterceptTouchEvent(MotionEvent ev) { System.out.println(外层MyFrameLayout 中调用 onInterceptTouchEvent()); System.out.println(super.onInterceptTouchEvent()默认返回false 表示不拦截); System.out.println(--------------------------------------------------); return super.onInterceptTouchEvent(ev); } //注意: //1 ViewGroup是View的子类 //2 ViewGroup中onTouchEvent()方法默认返回的是false @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: System.out.println(外层MyFrameLayout 中调用 onTouchEvent()--->ACTION_DOWN); break; case MotionEvent.ACTION_MOVE: System.out.println(外层MyFrameLayout 中调用 onTouchEvent()--->ACTION_MOVE); break; case MotionEvent.ACTION_UP: System.out.println(外层MyFrameLayout 中调用 onTouchEvent()--->ACTION_UP); default: break; } System.out.println(super.onTouchEvent()默认返回false 表示未消费事件); System.out.println(--------------------------------------------------); return super.onTouchEvent(event); //return true; } } |
MyLinearLayout如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
package cn.c;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.widget.LinearLayout;public class MyLinearLayout extends LinearLayout { public MyLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { super.dispatchTouchEvent(ev); System.out.println(内层MyLinearLayout 中调用 dispatchTouchEvent()); System.out.println(super.dispatchTouchEvent()默认返回true 表示继续分发); System.out.println(--------------------------------------------------); return super.dispatchTouchEvent(ev); //return false; } //覆写自ViewGroup @Override public boolean onInterceptTouchEvent(MotionEvent ev) { super.onInterceptTouchEvent(ev); System.out.println(内层MyLinearLayout 中调用 onInterceptTouchEvent()); System.out.println(super.onInterceptTouchEvent()默认返回false 表示不拦截); System.out.println(--------------------------------------------------); return super.onInterceptTouchEvent(ev); } //注意: //1 ViewGroup是View的子类 //2 ViewGroup中onTouchEvent()方法默认返回的是false @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: System.out.println(内层MyLinearLayout 中调用 onTouchEvent()--->ACTION_DOWN); break; case MotionEvent.ACTION_MOVE: System.out.println(内层MyLinearLayout 中调用 onTouchEvent()--->ACTION_MOVE); break; case MotionEvent.ACTION_UP: System.out.println(内层MyLinearLayout 中调用 onTouchEvent()--->ACTION_UP); default: break; } System.out.println(super.onTouchEvent()默认返回false 表示未消费事件); System.out.println(--------------------------------------------------); return super.onTouchEvent(event); } } |
MyButton如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
package cn.c;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.widget.Button;public class MyButton extends Button{ public MyButton(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean dispatchTouchEvent(MotionEvent event) { System.out.println(自定义Button 中调用 dispatchTouchEvent()); System.out.println(super.dispatchTouchEvent默认返回true); System.out.println(--------------------------------------------------); return super.dispatchTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: System.out.println(自定义Button 中调用 onTouchEvent()--->ACTION_DOWN); break; case MotionEvent.ACTION_MOVE: System.out.println(自定义Button 中调用 onTouchEvent()--->ACTION_MOVE); break; case MotionEvent.ACTION_UP: System.out.println(自定义Button 中调用 onTouchEvent()--->ACTION_UP); break; default: break; } System.out.println(--------------------------------------------------); //return false; return true; } } |
|
1
2
3
4
5
|
<cn.c.myframelayout android:layout_height="fill_parent" android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <cn.c.mylinearlayout android:layout_height="wrap_content" android:layout_width="wrap_content"> <cn.c.mybutton android:layout_height="200dip" android:layout_width="200dip" android:text="自定义Button" android:textcolor="@android:color/black"> 上一篇http://www.2cto.com/kf/201412/365609.html</cn.c.mybutton></cn.c.mylinearlayout></cn.c.myframelayout> |
结伴旅游,一个免费的交友网站:www.jieberu.com
推推族,免费得门票,游景区:www.tuituizu.com
Android事件分发详解(六)——ACTION_DOWN的消费验证的更多相关文章
- Android事件分发详解(三)——ViewGroup的dispatchTouchEvent()源码学习
package cc.aa; import android.os.Environment; import android.view.MotionEvent; import android.view.V ...
- Android系统输入事件分发详解
什么是输入事件? 我们知道,运行android系统的设备本质上是一台计算机,使用者在和计算机进行交互的时候可以抽象成简单的对计算机的输入和输出(IO).那么对于运行在计算机上的操作系统来说,操作系统在 ...
- Android事件分发机制详解(2)----分析ViewGruop的事件分发
首先,我们需要 知道什么是ViewGroup,它和普通的View有什么区别? ViewGroup就是一组View的集合,它包含很多子View和ViewGroup,是Android 所有布局的父类或间接 ...
- 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象
前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...
- 通俗理解Android事件分发与消费机制
深入:Android Touch事件传递机制全面解析(从WMS到View树) 通俗理解Android事件分发与消费机制 说起Android滑动冲突,是个很常见的场景,比如SliddingMenu与Li ...
- Android 自定义 View 详解
View 的绘制系列文章: Android View 绘制流程之 DecorView 与 ViewRootImpl Android View 的绘制流程之 Measure 过程详解 (一) Andro ...
- Android事件分发与责任链模式
一.责任链模式 责任链模式是一种行为模式,为请求创建一个接收者的对象链.这样就避免,一个请求链接多个接收者的情况.进行外部解耦.类似于单向链表结构. 优点: 1. 降低耦合度.它将请求的发送者和接收者 ...
- Android事件分发机制二:viewGroup与view对事件的处理
前言 很高兴遇见你~ 在上一篇文章 Android事件分发机制一:事件是如何到达activity的? 中,我们讨论了触摸信息从屏幕产生到发送给具体 的view处理的整体流程,这里先来简单回顾一下: 触 ...
- 本以为精通Android事件分发机制,没想到被面试官问懵了
文章中出现的源码均基于8.0 前言 事件分发机制不仅仅是核心知识点更是难点,并且还是View的一大难题滑动冲突解决方法的理论基础,因此掌握好View的事件分发机制是十分重要的. 一.基本认识 1. 事 ...
随机推荐
- python中函数的参数和返回值
目录 函数 目标 01. 函数参数和返回值的作用 1.1 无参数,无返回值 1.2 无参数,有返回值 1.3 有参数,无返回值 1.4 有参数,有返回值 02. 函数的返回值 进阶 示例 -- 温度和 ...
- HDU 1160 FatMouse's Speed (动态规划、最长下降子序列)
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Object的create、assign、getPrototypeOf与拷贝
Object的create.assign.getPrototypeOf与拷贝:https://www.cnblogs.com/ninalei/p/8655567.html
- python pycharm 注册码
D87IQPUU3Q-eyJsaWNlbnNlSWQiOiJEODdJUVBVVTNRIiwibGljZW5zZWVOYW1lIjoiTnNzIEltIiwiYXNzaWduZWVOYW1lIjoiI ...
- L2-001. 紧急救援(迪杰斯特拉算法)
L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国 ...
- 作业调度框架Quartz.NET-现学现用-02-任务监听 - 简书
原文:作业调度框架Quartz.NET-现学现用-02-任务监听 - 简书 前言 任务调度系统并不是完美的,它会出现任务执行失败的情况.如果你需要处理任务失败后的逻辑,希望这篇笔记可以为你提供些帮助. ...
- vue elementui table组件内容换行
解决方案 tableData = [ { "name": "domain111", "metric": [ "平均耗时" ...
- super、this关键字
super调用(父类) 调用方法 语法: super.父类方法名(形参列表); 可以在子类方法和构造器中使用,调用父类被覆盖的方法. 实例变量 语法: super.父类实例变量名; ...
- [StructLayout(LayoutKind.Sequential) ] 是什么意思
首先介绍一下 结构体和类的区别 :类是按引用传递 结构体是按值传递进入正题:结构体是由若干成员组成的.布局有两种1.Sequential,顺序布局,比如struct S1{int a;int b;}那 ...
- 利用cmd运行java程序
在运行以下程序时,要确保正确配置java的环境变量!!! 此处仅仅使用“记事本”来写java程序!!! 1. 新建一个记事本文件,命名为HelloWorld.java 这里需要注意的是,要确保关闭了隐 ...