Android触屏事件流
来源:互联网 发布:纸巾淘宝店铺装修风格 编辑:程序博客网 时间:2024/05/29 05:06
一次触屏事件分为三个动作
ACTION_DOWN, ACTION_MOVE 和 ACTION_UP。
其中ACTION_DOWN和ACTION_UP在一次触屏事件中只会触发一次,ACTION_MOVE可能触发任意次(包括0次)。
主要响应触屏的组件有两种,一种是可以包含子元素的(ViewGroup比如LinearLayout),另一种是不能包含子元素的View(最底层的View比如Button)。
当一个触屏事件产生时,正两者的响应方法有一个主要的区别就是LinearLayout有onInterceptTouchEvent方法,而Button没有onInterceptTouchEvent方法。
1
ViewGroup(比如LinearLayout)
2
boolean
dispatchTouchEvent(MotionEvent event)
3
boolean
onInterceptTouchEvent(MotionEvent event)
4
boolean
onTouchEvent(MotionEvent event)
5
6
View(比如Button)
7
boolean
dispatchTouchEvent(MotionEvent event)
8
boolean
onTouchEvent(MotionEvent event)
总的来说,dispatchTouchEvent决定处理什么,onInterceptTouchEvent决定谁来处理,onTouchEvent决定怎么处理。所以对于Button来谁,没有小弟,自然不存在决定谁来处理的问题,故没有onInterceptTouchEvent方法
下面具体说一下这三个函数的主要作用:
dispatchTouchEvent决定处理什么,看名字就知道是事件分发,初看我还以为是分发到子元素呢,原来不是直接到子元素。其实更好的理解是这是一个过滤方法。此方法的主要作用是决定相应事件的类型。
假如dispatchTouchEvent返回false,那么在响应了ACTION_DOWN之后,后续的ACTION_MOVE和ACTION_UP均忽略,因此ACTION_MOVE和ACTION_UP永远不会有得到处理的机会。
假如dispatchTouchEvent,那么后续的ACTION_MOVE和ACTION_UP均被接受,可以被其他方法响应。
特别注意,如果在这一步的dispatchTouchEvent中没有调用super.dispatchTouchEvent(event),那么事件就到此为止,被终结了。此时此刻只有dispatchTouchEvent会响应事件,另外两个方法根本没有机会来响应事件。并且,事件不会传递到子元素中。
onInterceptTouchEvent,主要决定谁来处理(即是否拦截事件)。只要在dispatchTouchEvent中调用了super.dispatchTouchEvent(event)那么,事件(event)会被交给onInterceptTouchEvent去处理。注意,这里事件(event)是否会调用onInterceptTouchEvent与dispatchTouchEvent的返回值是true还是false无关。再次强调,dispatchTouchEvent只决定处理什么,并不能指定谁来调用。
假如onInterceptTouchEvent返回false,将事件(event)交自己的子元素处理(此时事件流是从外到内,从父元素到子元素)。
假如onInterceptTouchEvent返回true,将事件(event)交给自己的onTouchEvent来处理,并且如果有后续的ACTION_MOVE和ACTION_UP(前一步dispatchTouchEvent中返回true)的话,将不再调用onInterceptTouchEvent,直接将事件传递给自己的onTouchEvent来处理。
注意上一步,在onInterceptTouchEvent返回true的情况下,onTouchEvent将获得事件并进行具体的处理。
假如onTouchEvent返回false,将事件(event)交父元素处理,(注意在这一步,事件流反向了,此时事件流是从内到外,从子元素到父元素)。
假如onTouchEvent返回true,本次事件(event)就到此为止,被终结了。
对照上面的说法,下面给出实例说明:
01
public
class
MyLinearLayout1
extends
LinearLayout{
02
03
private
String TAG =
"第一层MyLinearLayout"
;
04
05
public
MyLinearLayout1(Context context) {
06
super
(context);
07
this
.setBackgroundColor(Color.WHITE);
08
}
09
public
void
setTagString(String tag){
10
TAG = tag;
11
}
12
13
@Override
14
public
boolean
dispatchTouchEvent(MotionEvent event){
15
if
(MotionEvent.ACTION_DOWN == event.getAction()){
16
Log.v(TAG +
"dispatchTouchEvent:"
,
"ACTION_DOWN"
);
17
}
else
if
(MotionEvent.ACTION_MOVE == event.getAction()){
18
Log.v(TAG +
"dispatchTouchEvent:"
,
"ACTION_MOVE"
);
19
}
else
{
20
Log.v(TAG +
"dispatchTouchEvent:"
,
"ACTION_UP"
);
21
}
22
<span style=
"color:#e53333;"
>
//super.dispatchTouchEvent(event);</span> return true;
23
}
24
25
@Override
26
public
boolean
onInterceptTouchEvent(MotionEvent event){
super
.onInterceptTouchEvent
27
28
if
(MotionEvent.ACTION_DOWN == event.getAction()){
29
Log.v(TAG +
"onInterceptTouchEvent:"
,
"ACTION_DOWN"
);
30
}
else
if
(MotionEvent.ACTION_MOVE == event.getAction()){
31
Log.v(TAG +
"onInterceptTouchEvent:"
,
"ACTION_MOVE"
);
32
}
else
{
33
Log.v(TAG +
"onInterceptTouchEvent:"
,
"ACTION_UP"
);
34
}
35
return
true
;
36
}
37
38
@Override
39
public
boolean
onTouchEvent(MotionEvent event){
super
.onTouchEvent(event)
40
if
(MotionEvent.ACTION_DOWN == event.getAction()){
41
Log.v(TAG +
"onTouchEvent:"
,
"ACTION_DOWN"
);
42
}
else
if
(MotionEvent.ACTION_MOVE == event.getAction()){
43
Log.v(TAG +
"onTouchEvent:"
,
"ACTION_MOVE"
);
44
}
else
{
45
Log.v(TAG +
"onTouchEvent:"
,
"ACTION_UP"
);
46
}
47
48
return
true
;
49
}
50
}
打印信息:
1
第一层MyLinearLayoutdispatchTouchEvent:(460): ACTION_DOWN
2
第一层MyLinearLayoutdispatchTouchEvent:(460): ACTION_UP
1
第一层MyLinearLayoutdispatchTouchEvent:(460): ACTION_DOWN
现在,将super.dispatchTouchEvent(event)的注释去掉,注意,现在的boolean dispatchTouchEvent(MotionEvent event)变成下面这样:
01
@Override
02
public
boolean
dispatchTouchEvent(MotionEvent event){
03
if
(MotionEvent.ACTION_DOWN == event.getAction()){
04
Log.v(TAG +
"dispatchTouchEvent:"
,
"ACTION_DOWN"
);
05
}
else
if
(MotionEvent.ACTION_MOVE == event.getAction()){
06
Log.v(TAG +
"dispatchTouchEvent:"
,
"ACTION_MOVE"
);
07
}
else
{
08
Log.v(TAG +
"dispatchTouchEvent:"
,
"ACTION_UP"
);
09
}<p> <span style=
"color:#e53333;"
>
super
.dispatchTouchEvent(event);
//去掉注释了</span></p>
10
<p>
return
true
;</p>
11
}
1
第一层MyLinearLayout ACTION_DOWN:(783): ACTION_DOWN
2
第一层MyLinearLayout onInterceptTouchEvent:(783): ACTION_DOWN
3
第一层MyLinearLayout onTouchEvent:(783): ACTION_DOWN
4
第一层MyLinearLayout dispatchTouchEvent:(783): ACTION_UP
5
第一层MyLinearLayout onTouchEvent:(783): ACTION_UP
1
ACTION_DOWN:ACTION_DOWN——>onInterceptTouchEvent——>onTouchEvent
2
ACTION_UP:ACTION_DOWN——>onTouchEvent
- Android触屏事件流
- Android 触屏事件
- Android触屏事件(一、事件分发)
- Android触屏事件(二、事件分发)
- Android中的触屏事件
- android 触屏事件总结
- android cocos2d 触屏事件
- Android重温--触屏事件
- Android 触屏事件处理_手势识别 鼠标事件
- Android OnTouchListener触屏事件接口
- Android OnTouchListener触屏事件接口
- Android触屏滑动事件总结
- Android OnTouchListener触屏事件接口
- android 简单的触屏事件
- android触屏事件处理onInterceptTouchEvent
- Android 触屏事件 (单击,双击,滑动)
- android触屏事件处理总结--dispatchTouchEvent
- android触屏事件处理总结--dispatchTouchEvent
- HDU 4415 Assassin’s Creed 苦逼的贪心
- android背景选择器selector使用方法
- 科研资助
- AndroidManifest---定义Android清单
- STDIN_FILENO和stdin区别
- Android触屏事件流
- 禁止主机端口的几种思路
- 七夕,染红了我的相思
- ECSHOP仿趣玩导航分类效果实现
- Ubuntu 10.04 下配置NFS并挂载共享目录到目标板上
- svn: Can't connect to host '': 由于目标机器积极 原因及解决办法
- hdu1509 Windows Message Queue
- Mnatis发送邮件配置
- S3C6410 PWM驱动(一) --- 相关头文件