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. 事 ...
随机推荐
- Spring(七)--Spring JDBC
Spring JDBC 1.需要的实体类和数据库 2.需要的dao层 package com.xdf.dao; import com.xdf.bean.Student; import org.spri ...
- 使用Tomcat、JNDI与ActiveMQ实现JMS消息通信服务
前言 之所以使用JNDI 是出于通用性考虑,该例子使用JMS规范提供的通用接口,没有使用具体JMS提供者的接口,这样可以保证我们编写的程序适用于任何一种JMS实现(ActiveMQ.HornetQ等) ...
- 微信小程序与内嵌webview之间来回跳转的几点总结,以及二维码的使用
截止到发稿小程序支持的功能,后续如果小程序更新在完善文稿. 1. 小程序可以内嵌组件跳转到h5页面,前提是在小程序后台配置相应的业务域名.新打开的h5页面会替代小程序组件内的其它组件,即为h5不能与小 ...
- Python类函数调用:missing 1 required positional argument
在Python中,应该先对类进行实例化,然后在应用类.注意,实例化的过程是应该加括号的.
- 【转载】Django自带的注册登陆功能
1.登陆 知识点: a.auth.authenticate(username=name值, password=password值) 验证用户名和密码 b.auth.login(request, use ...
- EasyTest-接口自动化测试平台部署上线问题记录
平台url: http://easytest.xyz 花巨资搞了个阿里云服务器,哈哈,有想体验指导的大佬私聊我~~~ 部署环境 云服务器:Ubuntu Server 16.04.1 LTS 64位 ...
- 10个用Java谋生非常有趣的方式
令我惊讶的是,有些人觉得编程并不令人兴奋——只将它当作是一份枯燥的工作.不过,虽然可能的确有很多无聊的编程工作,但这并不意味着你不得不接受这些工作中的一个.程序员有各种各样的机会,运用他们的技能去做一 ...
- 深入Spring Boot:那些注入不了的 Spring 占位符 ( ${} 表达式 )
Spring里的占位符 spring里的占位符通常表现的形式是: 1 2 3 <bean id="dataSource" destroy-method="close ...
- scipy.spatial.distance.cdist
scipy.spatial.distance.cdist(XA, XB, metric='euclidean', p=2, V=None, VI=None, w=None)[source] Compu ...
- vue项目进行时,script标签中,methods事件中函数使用的async/await
用 async/await 来处理异步 await关键字只能放到async函数里面,通过await得到就是Promise返回的内容:当然也能通过then()去获取,若通过then()获取了则就无Pro ...