详细剖析 android onInterceptTouchEvent(MotionEvent event) 和 onTouchEvent(MotionEvent event) 的事件传递机制

最近遇到 添加 ScrollView 之后 某些组件的 onTouchEvent() 没有响应,现在我们来解剖一下android 对于这种事件的处理和内部的传递机制。



1.ViewGroup代表可以包含子组件的类,例如我们的(LinearLayout、TableLayout、ScrollView);

2.ChildView 代表不能包含其他组件的类 ,例如我们的(Button、TextView、EditText);


对于 ViewGroup 有包含  onInterceptTouchEvent(MotionEvent event)onTouchEvent(MotionEvent event)

而且 ChildView 只包含了  onTouchEvent(MotionEvent event)


如果有疑问的话可以去看一下 Button 和 TextView 的 API 里面确实查不到 onInterceptTouchEvent(MotionEvent event)


===============================================================================


为了大家更好理解我制作成图片了。


需要用到的源代码   MainActivity.java  myScroll.java(继承 ScrollView)  myLayout.java(继承 LinearLayout)   myText.java(继承 EditText)   activity_main.xml(布局文件)

  1. //MainActivity.java  
  1. package com.example.lab;  
  2.   
  3.   
  4. import android.app.Activity;  
  5. import android.os.Bundle;  
  6.   
  7.   
  8. public class MainActivity extends Activity  
  9. {  
  10. <span style="white-space:pre">  </span>  
  11. <span style="white-space:pre">  </span>@Override  
  12. <span style="white-space:pre">  </span>protected void onCreate(Bundle savedInstanceState)  
  13. <span style="white-space:pre">  </span>{  
  14. <span style="white-space:pre">      </span>super.onCreate(savedInstanceState);  
  15. <span style="white-space:pre">      </span>setContentView(R.layout.activity_main);  
  16. <span style="white-space:pre">  </span>}  
  17. <span style="white-space:pre">  </span>  
  18. }  


  1. //myScroll.java  
  1. package com.example.lab;  
  2.   
  3. import android.content.Context;  
  4. import android.util.AttributeSet;  
  5. import android.util.Log;  
  6. import android.view.MotionEvent;  
  7. import android.widget.ScrollView;  
  8.   
  9. public class myScroll extends ScrollView  
  10. {  
  11.   
  12.       
  13.     public myScroll(Context context)  
  14.     {  
  15.         super(context);  
  16.   
  17.     }  
  18.   
  19.     public myScroll(Context context, AttributeSet attrs)  
  20.     {  
  21.         super(context, attrs);  
  22.           
  23.     }  
  24.       
  25.     public myScroll(Context context, AttributeSet attrs, int defStyle)  
  26.     {  
  27.         super(context, attrs, defStyle);  
  28.     }  
  29.       
  30.     @Override  
  31.     public boolean onInterceptTouchEvent(MotionEvent event)   
  32.     {  
  33.         boolean b = super.onInterceptTouchEvent(event);  
  34.         Log.e("Info","Return " + b + " From myScroll OnInterceptTouchEvent" + "---" + "GetActionEvent:" + event.getActionMasked());  
  35.         return b;  
  36.     }  
  37.       
  38.     @Override  
  39.     public boolean onTouchEvent(MotionEvent event)  
  40.     {  
  41.   
  42.         boolean b = super.onTouchEvent(event);  
  43.         Log.e("Info","Return " + b + " From myScroll OnTouchEvent" + "---" + "GetActionEvent:" + event.getActionMasked());  
  44.         return b;  
  45.     }  
  46. }  


  1. //myLayout.java  
  1. package com.example.lab;  
  2.   
  3. import android.content.Context;  
  4. import android.util.AttributeSet;  
  5. import android.util.Log;  
  6. import android.view.MotionEvent;  
  7. import android.widget.LinearLayout;  
  8.   
  9. public class myLayout extends LinearLayout  
  10. {  
  11.   
  12.     public myLayout(Context context)  
  13.     {  
  14.         super(context);  
  15.     }  
  16.       
  17.     public myLayout(Context context, AttributeSet attrs)  
  18.     {  
  19.         super(context, attrs);  
  20.     }  
  21.       
  22.     public boolean onInterceptTouchEvent (MotionEvent event)  
  23.     {  
  24.         boolean b = super.onInterceptTouchEvent(event);  
  25.         Log.e("Info","Return " + b + " From myLayout OnInterceptTouchEvent" + "---" + "GetActionEvent:" + event.getActionMasked());  
  26.         return b;  
  27.     }  
  28.       
  29.     public boolean onTouchEvent(MotionEvent ev)  
  30.     {  
  31.         boolean b = super.onTouchEvent(ev);;  
  32.         Log.e("Info","Return " + b + " From myLayout OnTouchEvent" + "---" + "GetActionEvent:" + ev.getActionMasked());  
  33.         return b;  
  34.     }  
  35.       
  36. }  


  1.   
  1. //myText.java  
  1. package com.example.lab;  
  2.   
  3. import android.content.Context;  
  4. import android.util.AttributeSet;  
  5. import android.util.Log;  
  6. import android.view.MotionEvent;  
  7. import android.widget.EditText;  
  8.   
  9. public class myText extends EditText  
  10. {  
  11.   
  12.     public myText(Context context)  
  13.     {  
  14.         super(context);  
  15.     }  
  16.     public myText(Context context, AttributeSet attrs)  
  17.     {  
  18.         super(context, attrs);  
  19.     }  
  20.     public myText(Context context, AttributeSet attrs, int defStyle)  
  21.     {  
  22.         super(context, attrs, defStyle);  
  23.     }  
  24.       
  25.     @Override  
  26.     public boolean onTouchEvent(MotionEvent event)  
  27.     {     
  28.         boolean b = super.onTouchEvent(event);  
  29.         Log.e("Info","Return " + b + " From myText OnTouchEvent" + "---" + "GetActionEvent:" + event.getActionMasked());  
  30.         return b;  
  31.     }  
  32. }  

  1. avtivity_main.xml  
  1. <com.example.lab.myScroll xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="match_parent"  
  3.     android:layout_height="match_parent" >  
  4.   
  5.     <com.example.lab.myLayout  
  6.         android:layout_width="match_parent"  
  7.         android:layout_height="match_parent" >  
  8.   
  9.         <com.example.lab.myText  
  10.             android:layout_width="match_parent"  
  11.         android:layout_height="match_parent"  
  12.             >  
  13.         </com.example.lab.myText>  
  14.           
  15.     </com.example.lab.myLayout>  
  16.   
  17. </com.example.lab.myScroll>  


创建一个包名为 com.example.lab 然后把文件放到对应的地方就可以了运行了。


===========================================================================


有了源码,来说一下机制吧。

上面的布局文件  scroll 在最外层  layout 在中间  最里面的 text  如下面 这张图片


  

当我们触发屏幕事件的时候(点击屏幕、手指在屏幕上移动) 事件的传播流程是这样的。

如果 onInterceptTouchEvent()  返回的是 false(说明事件会传递下去),这里可以把  onInterceptTouchEvent() 看成是守门人,当它返回 false 的时候,证明目前这个类的 onTouchEvent 不是用来处理这个事件的,事件继续向内传播,如果返回 true 则由本类的onTouchEvent 进行处理,并停止事件的传播


制作这张图,看起来可能会直观一点。




其实onInterceptTouchEvent() 就是判断事件,OntouchEvent()就是处理事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值