在Android中当一个ViewGroup 中包含一个组件,当点击这个组件同时监听其onTouch事件,那么到底是父组件响应还是子组件响应呢?傻蛋在网上找到了一篇相关的帖子,照着例子测试了一番,发现网上的那篇有点问题,先把测试结果总结如下.

在触发OnTouch事件的时候Android的GroupView会调用如下三个函数:

public boolean dispatchTouchEvent(MotionEvent ev) 用于事件的分发

public boolean onInterceptTouchEvent(MotionEvent ev) 用于事件的拦截

public boolean onTouchEvent(MotionEvent ev) 处理事件

当然我们可以在容器类中如继承自LinearLayout的类中重写这三个方法。而继承View类的子类只能重写dispatch和onTouchEvent两个方法。当点击后这三个方法相继执行。

自己写了一个TextView子类MyTextView和LinearLayout子类MyLinearLayout,TextView包含在LinearLayout中。

当点击MyTextView时,程序会先进入到LinearLayout的dispatchTouchEvent中,这个类必须调用super.dispatchTouchEvent(ev); 否在后面的两个方法无法触发,所以傻蛋发现这个方法根本没有必要重写,因为框架是在super.dispatchTouchEvent(ev);中来调用onInterceptTouchEvent和onTouchEvent方法的,所以手动的设置dispatchTouchEvent的返回值是无效的,除非你不想让框架触发这两个方法。

当执行完dispathTouchEvent后会执行onInterception方法,如果返回为true,这表示MyLinearLayout把这个Touch事件拦截了,就会执行自己的Ontouch方法。如果为false则表示不拦截,此事件会分发到把事件传递给它的子控件MyTextView中。

当事件传递到MyTextView后,会执行dispatchTouchEvent,然后会执行onTouchEvent。挡在MyTextView中的onTouchEvent返回为false的话,当执行完onTouchEvent中的事件后,事件会再分发给MyLinearLaytout,执行LinearLayout的onTouchEvent。

主要代码如下

?[Copy to clipboard] Download zuiniuwang.java
        
  1. /**
  2. *MyLinearLayout.java
  3. *com.androidtest.touch.test
  4. *
  5. *Function:TODO
  6. *
  7. *verdateauthor
  8. *──────────────────────────────────
  9. *2011-5-24Leon
  10. *
  11. *Copyright(c)2011,TNTAllRightsReserved.
  12. */
  13. packagecom.androidtest.touch.test;
  14. importandroid.content.Context;
  15. importandroid.util.AttributeSet;
  16. importandroid.util.Log;
  17. importandroid.view.MotionEvent;
  18. importandroid.widget.LinearLayout;
  19. /**
  20. *ClassName:MyLinearLayoutFunction:TODOADDFUNCTIONReason:TODOADDREASON
  21. *
  22. *@authorLeon
  23. *@version
  24. *@sinceVer1.1
  25. *@Date2011-5-24
  26. */
  27. publicclassMyLinearLayoutextendsLinearLayout{
  28. privatefinalstaticStringTAG=MyLinearLayout.class.getSimpleName();
  29. publicMyLinearLayout(Contextcontext,AttributeSetattrs){
  30. super(context,attrs);
  31. //TODOAuto-generatedconstructorstub
  32. Log.v(TAG,TAG);
  33. }
  34. @Override
  35. publicbooleandispatchTouchEvent(MotionEventev){
  36. intaction=ev.getAction();
  37. switch(action){
  38. caseMotionEvent.ACTION_DOWN:
  39. Log.d(TAG,"dispatchTouchEventaction:ACTION_DOWN");
  40. break;
  41. caseMotionEvent.ACTION_MOVE:
  42. Log.d(TAG,"dispatchTouchEventaction:ACTION_MOVE");
  43. break;
  44. caseMotionEvent.ACTION_UP:
  45. Log.d(TAG,"dispatchTouchEventaction:ACTION_UP");
  46. break;
  47. caseMotionEvent.ACTION_CANCEL:
  48. Log.d(TAG,"dispatchTouchEventaction:ACTION_CANCEL");
  49. break;
  50. }
  51. //Log.v(TAG,"dispatchTouchEvent"+super.dispatchTouchEvent(ev));
  52. super.dispatchTouchEvent(ev);
  53. Log.v(TAG,"dispatchTouchEvent"+"test.................");
  54. returntrue;
  55. }
  56. @Override
  57. publicbooleanonInterceptTouchEvent(MotionEventev){
  58. intaction=ev.getAction();
  59. switch(action){
  60. caseMotionEvent.ACTION_DOWN:
  61. Log.d(TAG,"onInterceptTouchEventaction:ACTION_DOWN");
  62. break;
  63. caseMotionEvent.ACTION_MOVE:
  64. Log.d(TAG,"onInterceptTouchEventaction:ACTION_MOVE");
  65. break;
  66. caseMotionEvent.ACTION_UP:
  67. Log.d(TAG,"onInterceptTouchEventaction:ACTION_UP");
  68. break;
  69. caseMotionEvent.ACTION_CANCEL:
  70. Log.d(TAG,"onInterceptTouchEventaction:ACTION_CANCEL");
  71. break;
  72. }
  73. returnfalse;
  74. }
  75. @Override
  76. publicbooleanonTouchEvent(MotionEventev){
  77. intaction=ev.getAction();
  78. switch(action){
  79. caseMotionEvent.ACTION_DOWN:
  80. Log.d(TAG,"---onTouchEventaction:ACTION_DOWN");
  81. break;
  82. caseMotionEvent.ACTION_MOVE:
  83. Log.d(TAG,"---onTouchEventaction:ACTION_MOVE");
  84. break;
  85. caseMotionEvent.ACTION_UP:
  86. Log.d(TAG,"---onTouchEventaction:ACTION_UP");
  87. break;
  88. caseMotionEvent.ACTION_CANCEL:
  89. Log.d(TAG,"---onTouchEventaction:ACTION_CANCEL");
  90. break;
  91. }
  92. returntrue;
  93. }
  94. }
  95. /**
  96. *MyTestView.java
  97. *com.androidtest.touch.test
  98. *
  99. *Function:TODO
  100. *
  101. *verdateauthor
  102. *──────────────────────────────────
  103. *2011-5-24Leon
  104. *
  105. *Copyright(c)2011,TNTAllRightsReserved.
  106. */
  107. packagecom.androidtest.touch.test;
  108. importandroid.content.Context;
  109. importandroid.util.AttributeSet;
  110. importandroid.util.Log;
  111. importandroid.view.MotionEvent;
  112. importandroid.widget.TextView;
  113. /**
  114. *ClassName:MyTestViewFunction:TODOADDFUNCTIONReason:TODOADDREASON
  115. *
  116. *@authorLeon
  117. *@version
  118. *@sinceVer1.1
  119. *@Date2011-5-24
  120. */
  121. publicclassMyTestViewextendsTextView{
  122. publicstaticfinalStringTAG=MyTestView.class.getSimpleName();
  123. publicMyTestView(Contextcontext,AttributeSetattrs){
  124. super(context,attrs);
  125. //TODOAuto-generatedconstructorstub
  126. Log.v(TAG,TAG);
  127. }
  128. @Override
  129. publicbooleandispatchTouchEvent(MotionEventev){
  130. intaction=ev.getAction();
  131. switch(action){
  132. caseMotionEvent.ACTION_DOWN:
  133. Log.d(TAG,"dispatchTouchEventaction:ACTION_DOWN");
  134. break;
  135. caseMotionEvent.ACTION_MOVE:
  136. Log.d(TAG,"dispatchTouchEventaction:ACTION_MOVE");
  137. break;
  138. caseMotionEvent.ACTION_UP:
  139. Log.d(TAG,"dispatchTouchEventaction:ACTION_UP");
  140. break;
  141. caseMotionEvent.ACTION_CANCEL:
  142. Log.d(TAG,"onTouchEventaction:ACTION_CANCEL");
  143. break;
  144. }
  145. returnsuper.dispatchTouchEvent(ev);
  146. }
  147. @Override
  148. publicbooleanonTouchEvent(MotionEventev){
  149. intaction=ev.getAction();
  150. switch(action){
  151. caseMotionEvent.ACTION_DOWN:
  152. Log.d(TAG,"---onTouchEventaction:ACTION_DOWN");
  153. break;
  154. caseMotionEvent.ACTION_MOVE:
  155. Log.d(TAG,"---onTouchEventaction:ACTION_MOVE");
  156. break;
  157. caseMotionEvent.ACTION_UP:
  158. Log.d(TAG,"---onTouchEventaction:ACTION_UP");
  159. break;
  160. caseMotionEvent.ACTION_CANCEL:
  161. Log.d(TAG,"---onTouchEventaction:ACTION_CANCEL");
  162. break;
  163. }
  164. returnfalse;
  165. }
  166. }
  167. /**
  168. *TestTouchEvent.java
  169. *com.androidtest.touch.test
  170. *
  171. *Function:TODO
  172. *
  173. *verdateauthor
  174. *──────────────────────────────────
  175. *2011-5-24Leon
  176. *
  177. *Copyright(c)2011,TNTAllRightsReserved.
  178. */
  179. packagecom.androidtest.touch.test;
  180. importcom.androidtest.R;
  181. importandroid.app.Activity;
  182. importandroid.os.Bundle;
  183. /**
  184. *ClassName:TestTouchEvent
  185. *Function:TODOADDFUNCTION
  186. *Reason:TODOADDREASON
  187. *
  188. *@authorLeon
  189. *@version
  190. *@sinceVer1.1
  191. *@Date2011-5-24
  192. */
  193. publicclassTestTouchEventextendsActivity{
  194. @Override
  195. protectedvoidonCreate(BundlesavedInstanceState){
  196. //TODOAuto-generatedmethodstub
  197. super.onCreate(savedInstanceState);
  198. this.setContentView(R.layout.test_touch_event);
  199. }
  200. }
?[Copy to clipboard] Download zuiniuwang.xml
        
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <com.androidtest.touch.test.mylinearlayoutandroid:gravity="center"android:layout_height="fill_parent"android:layout_width="fill_parent"android:orientation="vertical"xmlns:android="http://schemas.android.com/apk/res/android">
  3. <com.androidtest.touch.test.mytestviewandroid:background="#FFFFFF"android:id="@+id/tv"android:layout_height="200px"android:layout_width="200px"android:text="leon"android:textcolor="#0000FF"android:textsize="40sp"android:textstyle="bold">
  4. </com.androidtest.touch.test.mytestview></com.androidtest.touch.test.mylinearlayout>

本文出自 “最牛傻蛋的博客” 博客,转载请与作者联系!

更多相关文章

  1. Android之SQLite学习
  2. 【Android-Error】Android(安卓)4.4.4 java.lang.NoClassDefFoun
  3. Android(安卓)Studio常用快捷键、Android(安卓)Studio快捷键大全
  4. Android线程优先级设置方法
  5. TextView支持的XML属性及相关方法
  6. Android和H5之间的交互
  7. drawRoundRect方法:绘制圆角矩形
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. 如何将占位符放在struts textfield标记中
  2. 使用Acrobat的javascript调试器
  3. PHP发布请求未识别的索引错误
  4. 为什么elementFromPoint()在IE 11上的ifram
  5. JavaScript - 检测click事件是否触发了D
  6. WebKit "拒绝设置不安全的标题'内容长度'
  7. 关于JavaScript变量声明及其初始化的问题
  8. 原生js操作dom的笔记整理
  9. Javascript操作DOM常用API总结
  10. Angularjs指令ng-hide在单元格模板中不对