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
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。