onInterceptTouchEvent与OnTouchEvent事件机制

原文链接

onInterceptTouchEvent用于拦截touch事件

OnTouchEvent 处理touch事件

onInterceptTouchEvent主要用于拦截touch事件,当返回值为true时,该事件不向下层view传递,而是本层onTouchEvent中处理touch事件。返回值为false时,事件传递到下层View的onInterceptTouchEvent

onTouchEvent,返回值为true时,touch事件被消耗不会向上层传递,返回false时,touch事件继续向上层view中的OntouchEvent传递,同时下次touch事件不会再传递到本层view处理


Demo实例

容器父View

[java]  view plain copy
  1. public class MyLayout extends ViewGroup {  
  2.   
  3.     private int lastX;  
  4.     private int lastY;  
  5.     private int thresholdX=100;  
  6.     private boolean isDrag=false;  
  7.       
  8.       
  9.     public MyLayout(Context context, AttributeSet attrs) {  
  10.         // TODO Auto-generated constructor stub  
  11.         super(context, attrs);  
  12.     }  
  13.   
  14.     public MyLayout(Context context, AttributeSet attrs, int defStyle) {  
  15.         super(context, attrs, defStyle);  
  16.         // TODO Auto-generated constructor stub  
  17.   
  18.     }  
  19.       
  20.     @Override  
  21.     protected void onLayout(boolean changed, int l, int t, int r, int b) {  
  22.         // TODO Auto-generated method stub  
  23.            for (int i = 0; i < getChildCount(); i++) {  
  24.                View child=getChildAt(i);  
  25.      
  26.                    child.layout(00, child.getMeasuredWidth(), child.getMeasuredHeight());               
  27.           }  
  28.     }  
  29.       @Override  
  30.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  31.         // TODO Auto-generated method stub  
  32.         super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
  33.         for (int i = 0; i <getChildCount(); i++) {  
  34.             View child=getChildAt(i);  
  35.             //child.measure(widthMeasureSpec,heightMeasureSpec);  
  36.             LayoutParams lp=(LayoutParams)child.getLayoutParams();  
  37.               
  38.             child.measure(getChildMeasureSpec(widthMeasureSpec, 0, lp.width), getChildMeasureSpec(heightMeasureSpec,0,lp.height));  
  39.               
  40.         }  
  41.     }  
  42.     @Override  
  43.      public boolean dispatchTouchEvent(MotionEvent ev) {  
  44.             // TODO Auto-generated method stub  
  45.             return super.dispatchTouchEvent(ev);  
  46.         }  
  47.      @Override  
  48.     public boolean onInterceptTouchEvent(MotionEvent ev) {  
  49.         // TODO Auto-generated method stub  
  50.          switch (ev.getAction()) {  
  51.             case MotionEvent.ACTION_DOWN:  
  52.                 Log.i("debug""-----onInterceptTouchEvent-------Aciton_down----------");  
  53.                 break;  
  54.             case MotionEvent.ACTION_MOVE:  
  55.                 Log.i("debug""--------onInterceptTouchEvent----Aciton_move----------");  
  56.                 break;  
  57.             case MotionEvent.ACTION_CANCEL:  
  58.                 Log.i("debug""---------onInterceptTouchEvent---Aciton_cancel----------");  
  59.                 break;  
  60.             case MotionEvent.ACTION_UP:  
  61.                 Log.i("debug""-------onInterceptTouchEvent-----Aciton_up----------");  
  62.                 break;  
  63.   
  64.             default:  
  65.                 break;  
  66.             }  
  67.         return false;  
  68.     }  
  69.      @Override  
  70.     public boolean onTouchEvent(MotionEvent event) {  
  71.         // TODO Auto-generated method stub  
  72.           
  73.          switch (event.getAction()) {  
  74.         case MotionEvent.ACTION_DOWN:  
  75.             Log.i("debug""-----mylayout-------Aciton_down----------");  
  76.             break;  
  77.         case MotionEvent.ACTION_MOVE:  
  78.             Log.i("debug""------mylayout-----Aciton_move----------");  
  79.             break;  
  80.         case MotionEvent.ACTION_CANCEL:  
  81.             Log.i("debug""------mylayout-----Aciton_cancel----------");  
  82.             break;  
  83.         case MotionEvent.ACTION_UP:  
  84.             Log.i("debug""------mylayout-----Aciton_up----------");  
  85.             break;  
  86.   
  87.         default:  
  88.             break;  
  89.         }  
  90.            
  91.         return true;  
  92.     }  
自定义子view

[java]  view plain copy
  1. public class CustomeImageView extends ImageView {  
  2.     public CustomeImageView(Context context, AttributeSet attrs) {  
  3.         super(context, attrs);  
  4.         // TODO Auto-generated constructor stub  
  5.     }  
  6.   
  7.     public CustomeImageView(Context context, AttributeSet attrs, int defStyle) {  
  8.         super(context, attrs, defStyle);  
  9.         // TODO Auto-generated constructor stub  
  10.     }  
  11.     @Override  
  12.     public boolean onTouchEvent(MotionEvent event) {  
  13.         // TODO Auto-generated method stub  
  14.          switch (event.getAction()) {  
  15.             case MotionEvent.ACTION_DOWN:  
  16.                 Log.i("debug""-------imageview-----Aciton_down----------");  
  17.                 break;  
  18.             case MotionEvent.ACTION_MOVE:  
  19.                 Log.i("debug""-------ImageView-----Aciton_move----------");  
  20.                 break;  
  21.             case MotionEvent.ACTION_CANCEL:  
  22.                 Log.i("debug""-------ImageView-----Aciton_cancel----------");  
  23.                 break;  
  24.             case MotionEvent.ACTION_UP:  
  25.                 Log.i("debug""--------ImageView----Aciton_up----------");  
  26.                 break;  
  27.   
  28.             default:  
  29.                 break;  
  30.             }  
  31.         return false;  
  32.     }  
  33.   
  34. }  
步骤一,MyLayout中onInterceptTouchEvent返回true,touch事件不会传递给子View,打印LOG

步骤二,MyLayout中onInterceptTouchEvent返回false,子View中的onTouchEvent能接受到触摸事件,Log


步骤三,在子VIew中测试OnTouchEvent返回值f(前提触摸事件可以传递到子view)若返回false,在一次touch事件中(Action_down开始Action_up结束)子view接受一次down事件,并把事件向上层传递

步骤三,在子VIew中测试OnTouchEvent返回值f(前提触摸事件可以传递到子view)若返回true,子View可以接受touch的所有事件,并且事件不会向上层传递




总结,android触摸事件传递机制,首先是dispatchTouchEvent根据onInterceptTouchEvent的返回值确定事件是分发给自己还是分配给子VIew的dispatchTouchEvent,子View在决定事件是否继续向下传递,事件传递到最后一个view时,调用该view的onTouchEvent函数去处理触摸事件,若函数返回true,则以后就会在此处理,不会向上层的onTouchEvent传递。返回false,就会传递到上一层的onTouchEvent,根据返回值决定是否处理事件,


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值