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 packagecom.example.touchdemo;2
3 importandroid.content.Context;4 importandroid.util.AttributeSet;5 importandroid.view.MotionEvent;6 importandroid.widget.LinearLayout;7
8 public class TouchFatherView extendsLinearLayout {9
10 publicTouchFatherView(Context context) {11 super(context);12 }13 publicTouchFatherView(Context context, AttributeSet attrs) {14 super(context, attrs);15 }16 @Override17 public booleanonInterceptTouchEvent(MotionEvent ev) {18 switch(ev.getAction()) {19 caseMotionEvent.ACTION_DOWN:20 return true;21 caseMotionEvent.ACTION_UP:22 break;23 default:24 break;25 }26 return super.onInterceptTouchEvent(ev);27 }28
29 @Override30 public booleanonTouchEvent(MotionEvent event) {31 switch(event.getAction()) {32 caseMotionEvent.ACTION_DOWN:33 System.out.println("父类中按下");34 break;35 caseMotionEvent.ACTION_UP:36 System.out.println("父类中释放");37 break;38 default:39 break;40 }41 return true;42 }43 }
子类:
1 packagecom.example.touchdemo;2
3 importandroid.content.Context;4 importandroid.util.AttributeSet;5 importandroid.view.MotionEvent;6 importandroid.widget.LinearLayout;7
8 public class TouchSonView extendsLinearLayout {9
10 publicTouchSonView(Context context) {11 super(context);12 }13
14 publicTouchSonView(Context context, AttributeSet attrs) {15 super(context, attrs);16 }17
18 @Override19 public booleanonInterceptTouchEvent(MotionEvent ev) {20 switch(ev.getAction()) {21 caseMotionEvent.ACTION_DOWN:22 break;23 caseMotionEvent.ACTION_UP:24 break;25 default:26 break;27 }28 return super.onInterceptTouchEvent(ev);29 }30
31 @Override32 public booleanonTouchEvent(MotionEvent event) {33 switch(event.getAction()) {34 caseMotionEvent.ACTION_DOWN:35 System.out.println("子类中按下");36 break;37 caseMotionEvent.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的时候,那么就还是由夫类来处理。
最后简单画张图解释一下流程:
画的有点难看,请见谅^_^
有不对的地方还请大家指出来,一起学习