Java上的touch_Android OnTouch事件解析

本文详细解析了Android中触摸事件的分发机制,包括onInterceptTouchEvent和onTouchEvent方法的作用及交互过程。通过实例演示了如何通过设置返回值来控制触摸事件是否传递给子视图。
摘要由CSDN通过智能技术生成

1.onTouch事件分类

(1)onInterceptTouchEvent(MotionEvent ev)

(2)onTouchEvent(MotionEvent event)

2.使用注意事项:

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

使用下面的案例来解释:

816c45eb6a47d6f55adf6fd1f9aa645a.png

如图红色的子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的时候

1d2587672702f2c4a4740f904ce245b0.png

这个时候onTouch事件直接由父类处理,不再分发给子类。

当我们将父类中onInterceptTouchEvent(MotionEvent ev)中的返回值设置为false的时候

884101074d73c09be7c6630dd2915a30.png

这个时候onTouch事件直接分发给子类处理,父类不再处理。

注意:上面的讨论中我们忽略OnTouch事件的返回值。

现在我们讨论一下OnTouch事件的返回值

当我们父类中onInterceptTouchEvent(MotionEvent ev)中的返回值设置为false的时候,子类OnTouch处理,

这时如果子类中onTouch事件返回为FALSE的时候,那么就直接由父类onTouch来接受处理,

子类中onTouch事件返回为true的时候,那么就还是由子类来处理,

同理,当在父类的时候,如果onTouch事件返回为FALSE的时候,就没有直接不再处理了,如果夫类中onTouch事件返回为true的时候,那么就还是由夫类来处理。

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

c82973c5c0b3d440509f73ddf473873e.png

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值