1.onTouch事件分类
(1)onInterceptTouchEvent(MotionEvent ev)
(2)onTouchEvent(MotionEvent event)
2.使用注意事项:
在viewGroup中可以通过对onInterceptTouchEvent(MotionEvent ev)返回值的设置来处理子类view和ViewGroup的onTouch事件。
使用下面的案例来解释:

如图红色的子view在蓝色的ViewGroup中,那么当我们触摸的时候,到底哪一个会响应,你想让谁响应,下面我们通过这个讲解:
首先定义这个父类的ViewGroup,重写其中的
onInterceptTouchEvent(MotionEvent ev);
onTouchEvent(MotionEvent event);
然后定义这个子类view,重写其中的onTouchEvent(MotionEvent event)方法,
好了,准备工作已经完成了,下面就开始正式的讨论了:
onInterceptTouchEvent(MotionEvent ev);是OnTouch事件的拦截事件,当我们将其返回值设置为true的时候,这时Ontouch事件就不会分发给他的子view,直接被自己的OnTouch事件监听
先看父类和子类的代码
父类:
1 package com.example.touchdemo; 2 3 import android.content.Context; 4 import android.util.AttributeSet; 5 import android.view.MotionEvent; 6 import android.widget.LinearLayout; 7 8 public class TouchFatherView extends LinearLayout { 9 10 public TouchFatherView(Context context) { 11 super(context); 12 } 13 public TouchFatherView(Context context, AttributeSet attrs) { 14 super(context, attrs); 15 } 16 @Override 17 public boolean onInterceptTouchEvent(MotionEvent ev) { 18 switch (ev.getAction()) { 19 case MotionEvent.ACTION_DOWN: 20 return true; 21 case MotionEvent.ACTION_UP: 22 break; 23 default: 24 break; 25 } 26 return super.onInterceptTouchEvent(ev); 27 } 28 29 @Override 30 public boolean onTouchEvent(MotionEvent event) { 31 switch (event.getAction()) { 32 case MotionEvent.ACTION_DOWN: 33 System.out.println("父类中按下"); 34 break; 35 case MotionEvent.ACTION_UP: 36 System.out.println("父类中释放"); 37 break; 38 default: 39 break; 40 } 41 return true; 42 } 43 }
子类:
1 package com.example.touchdemo; 2 3 import android.content.Context; 4 import android.util.AttributeSet; 5 import android.view.MotionEvent; 6 import android.widget.LinearLayout; 7 8 public class TouchSonView extends LinearLayout { 9 10 public TouchSonView(Context context) { 11 super(context); 12 } 13 14 public TouchSonView(Context context, AttributeSet attrs) { 15 super(context, attrs); 16 } 17 18 @Override 19 public boolean onInterceptTouchEvent(MotionEvent ev) { 20 switch (ev.getAction()) { 21 case MotionEvent.ACTION_DOWN: 22 break; 23 case MotionEvent.ACTION_UP: 24 break; 25 default: 26 break; 27 } 28 return super.onInterceptTouchEvent(ev); 29 } 30 31 @Override 32 public boolean onTouchEvent(MotionEvent event) { 33 switch (event.getAction()) { 34 case MotionEvent.ACTION_DOWN: 35 System.out.println("子类中按下"); 36 break; 37 case MotionEvent.ACTION_UP: 38 System.out.println("子类中释放"); 39 break; 40 default: 41 break; 42 } 43 return false; 44 } 45 46 47 }
这两个类都是很简单的,集成LinerLayout,重写其中的
onInterceptTouchEvent(MotionEvent ev);
onTouchEvent(MotionEvent event);
当我们将父类中onInterceptTouchEvent(MotionEvent ev)中的返回值设置为true的时候

这个时候onTouch事件直接由父类处理,不再分发给子类。
当我们将父类中onInterceptTouchEvent(MotionEvent ev)中的返回值设置为false的时候

这个时候onTouch事件直接分发给子类处理,父类不再处理。
注意:上面的讨论中我们忽略OnTouch事件的返回值。
现在我们讨论一下OnTouch事件的返回值
当我们父类中onInterceptTouchEvent(MotionEvent ev)中的返回值设置为false的时候,子类OnTouch处理,
这时如果子类中onTouch事件返回为FALSE的时候,那么就直接由父类onTouch来接受处理,
子类中onTouch事件返回为true的时候,那么就还是由子类来处理,
同理,当在父类的时候,如果onTouch事件返回为FALSE的时候,就没有直接不再处理了,如果夫类中onTouch事件返回为true的时候,那么就还是由夫类来处理。
最后简单画张图解释一下流程:

画的有点难看,请见谅^_^
有不对的地方还请大家指出来,一起学习
浙公网安备 33010602011771号