1.onTouch事件分类

(1)onInterceptTouchEvent(MotionEvent ev)

(2)onTouchEvent(MotionEvent event)

2.使用注意事项:

  在viewGroup中可以通过对onInterceptTouchEvent(MotionEvent ev)返回值的设置来处理子类viewViewGrouponTouch事件。

使用下面的案例来解释:

如图红色的子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的时候,那么就还是由夫类来处理。

最后简单画张图解释一下流程:

 

画的有点难看,请见谅^_^

有不对的地方还请大家指出来,一起学习

 

 

posted on 2014-10-23 15:37  javaliwei  阅读(1387)  评论(0)    收藏  举报