onTouchEvent和onInterceptTouchEvent

onTouch是view中OnTouchListener接口中的方法,处理view及其子类被touch时的事件处理。

当然,前提是touch事件能够传递到指定的view,


onTouchEvent同样也是在view中定义的一个方法,处理传递的view的手势事件,手势事件类型包括

Action_down,Action_move,Action_up,action_cancel四种事件。一旦onTouchEvent方法被调用,并返回true,则这个手势事件就结束了,

并不会向下传递到子控件。


onInterceptTouchEvent是在viewGroup里面定义的,Android中的Layout布局类一般都是继承此类的,onInterceptTouchEvent是用于拦截手势事件,每个

手势事件都会事先调用onInterceptTouchEvent,此方法返回false, 则手势事件会向子控件传递,返回true,则调用onTouchEvent方法。


本人个别观点:

1, 在自身ViewGroup空白区域(该点击区域没有任何子view)中实现滑动, 单击, 长按事件的处理:

     自身注册onClick和onLongClick事件, 当单击或者长按空白区域时, 流程是: 

      down:   onInterceptTouchEvent(ViewGroup)----> onTouchEvent(ViewGroup);

      move:   onTouchEvent(ViewGroup);

      up:        onTouchEvent(ViewGroup). 

    当开始滑动的时, 在上层控件分配事件的时候, 就会根据这个滑动的状态(比如距离,和时间上的差)来分配:

    down: onInterceptTouchEvent(ViewGroup);

    move: onInterceptTouchEvent(ViewGroup);----------在这边的时候根据onInterceptTouchEvent返回的值(true or false)来确定是否将

                                                                                                将事件移交到onTouchEvent那边.

    up: 待定

概念介绍

1、onInterceptTouchEvent()是用于处理惩罚事务(重点onInterceptTouchEvent这个事务是从父控件开端往子控件传的,直到有阻碍或者到没有这个事务的view,然后就往回从子到父控件,此次是onTouch的)(类似于预处理惩罚,当然也可以不处理惩罚)并改变事务的传递标的目标,也就是决意是否容许Touch事务持续向下(子控件)传递,一但返回True(代表事务在当前的viewGroup中会被处理惩罚),则向下传递之路被截断(所有子控件将没有机会参与Touch事务),同时把事务传递给当前的控件的onTouchEvent()处理惩罚;返回false,则把事务交给子控件的onInterceptTouchEvent()

 

2、onTouchEvent()用于处理惩罚事务(重点onTouch这个事务是从子控件回传到父控件的,一层层向下传),返回值决意当前控件是否花费(consume)了这个事务,也就是说在当前控件在处理惩罚完Touch事务后,是否还容许Touch事务持续向上(父控件)传递。返回false,则向上传递给父控件,具体一点就是这个touch事务就给了父控件,那么后面的up事务就是到这里touch触发,不会在传给它的子控件。若是父控件依然是false,那touch的处理惩罚就给到父控件的父控件,那么up的事务处理惩罚都在父控件的父控件,不会触发下面的。

返回true,若是是子控件返回true,那么它的touch事务都在这里处理惩罚,父控件是处理惩罚不了,因为它收不到子控件传给他的touch,被子控件给阻碍了。(这里烦琐了这么多就是为了加深记忆,这个两个事务懂得起来都这么麻烦了,更何况去记,记我必然是一会儿就忘的了^0^)

(注:可能你会感觉是否花费了有关系吗,反正我已经针对事务编写了处理惩罚代码?答案是有差别!比如ACTION_MOVE或者ACTION_UP产生的前提是必然曾经产生了ACTION_DOWN,若是你没有花费ACTION_DOWN,那么体系会认为ACTION_DOWN没有产生过,所以ACTION_MOVE或者ACTION_UP就不克不及被捕获。)

具体介绍

onInterceptTouchEvent()是ViewGroup的一个办法,目标是在体系向该ViewGroup及其各个childView触发onTouchEvent()之前对相干事务进行一次阻碍,Android这么设计的设法也很好懂得,因为ViewGroup会包含若干childView,是以须要可以或许同一监控各类touch事务的机会,是以纯粹的不克不及包含子view的控件是没有这个办法的,如LinearLayout就有,TextView就没有。

onInterceptTouchEvent()应用也很简单,若是在ViewGroup里覆写了该办法,那么就可以对各类touch事务加以阻碍。然则如何阻碍,是否所有的touch事务都须要阻碍则是斗劲错杂的,touch事务在onInterceptTouchEvent()和onTouchEvent以及各个childView间的传递机制完全取决于onInterceptTouchEvent()和onTouchEvent()的返回值。并且,针对down事务处理惩罚的返回值直接影响到后续move和up事务的接管和传递。

关于返回值的题目,根蒂根基规矩很清楚,若是return true,那么默示该办法花费了此次事务,若是return false,那么默示该办法并未处理惩罚完全,该事务仍然须要以某种体式格式传递下去持续守候处理惩罚。

 

因为onInterceptTouchEvent()的机制斗劲错杂,上方的申明写的也斗劲错杂,总结一下,根蒂根基的规矩是:

1. down事务起首会传递到onInterceptTouchEvent()办法

2. 若是该ViewGroup的onInterceptTouchEvent()在接管到down事务处理惩罚完成之后return false,那么后续的move, up等事务将持续会先传递给该ViewGroup,之后才和down事务一样传递给终极的目标view的onTouchEvent()处理惩罚。

3. 若是该ViewGroup的onInterceptTouchEvent()在接管到down事务处理惩罚完成之后return true,那么后续的move, up等事务将不再传递给onInterceptTouchEvent(),而是和down事务一样传递给该ViewGroup的onTouchEvent()处理惩罚,重视,目标view将接管不到任何事务。

4. 若是终极须要处理惩罚事务的view的onTouchEvent()返回了false,那么该事务将被传递至其上一层次的view的onTouchEvent()处理惩罚。

5. 若是终极须要处理惩罚事务的view 的onTouchEvent()返回了true,那么后续事务将可以持续传递给该view的onTouchEvent()处理惩罚。

 

具体例子

下面用一个简单的实验申明上述错杂的规矩。视图自底向上共3层,此中LayoutView1和LayoutView2就是LinearLayout, MyTextView就是TextView:

对应的xml布局文件如下:

<?xml version="1.0" encoding="utf-8"?>

<com.touchstudy.LayoutView1 xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent" >

<com.touchstudy.LayoutView2

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:gravity="center">

<com.touchstudy.MyTextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/tv"

android:text="AB"

android:textSize="40sp"

android:textStyle="bold"

android:background="#FFFFFF"

android:textColor="#0000FF"/>

</com.touchstudy.LayoutView2>

</com.touchstudy.LayoutView1>

下面看具体景象:

1. onInterceptTouchEvent()处理惩罚down事务均返回false,onTouchEvent()处理惩罚事务均返回true

------------------------------------------------------------------------------------------------------------------------------

04-11 03:58:42.620: DEBUG/LayoutView1(614): onInterceptTouchEvent action:ACTION_DOWN

04-11 03:58:42.620: DEBUG/LayoutView2(614): onInterceptTouchEvent action:ACTION_DOWN

04-11 03:58:42.620: DEBUG/MyTextView(614): onTouchEvent action:ACTION_DOWN

04-11 03:58:42.800: DEBUG/LayoutView1(614): onInterceptTouchEvent action:ACTION_MOVE

04-11 03:58:42.800: DEBUG/LayoutView2(614): onInterceptTouchEvent action:ACTION_MOVE

04-11 03:58:42.800: DEBUG/MyTextView(614): onTouchEvent action:ACTION_MOVE

…… //省略过多的ACTION_MOVE

04-11 03:58:43.130: DEBUG/LayoutView1(614): onInterceptTouchEvent action:ACTION_UP

04-11 03:58:43.130: DEBUG/LayoutView2(614): onInterceptTouchEvent action:ACTION_UP

04-11 03:58:43.150: DEBUG/MyTextView(614): onTouchEvent action:ACTION_UP

------------------------------------------------------------------------------------------------------------------------------

这是最常见的景象,onInterceptTouchEvent并没有做任何改变事务传递时序的操纵,结果上和没有覆写该办法是一样的。可以看到,各类事务的传递本身是自底向上的,次序是:LayoutView1->LayoutView2->MyTextView。重视,在onInterceptTouchEvent均返回false时,LayoutView1和LayoutView2的onTouchEvent并不会收到事务,而是终极传递给了MyTextView。

2. LayoutView1的onInterceptTouchEvent()处理惩罚down事务返回true,

MyTextView的onTouchEvent()处理惩罚事务返回true

------------------------------------------------------------------------------------------------------------------------------

04-11 03:09:27.589: DEBUG/LayoutView1(446): onInterceptTouchEvent action:ACTION_DOWN

04-11 03:09:27.589: DEBUG/LayoutView1(446): onTouchEvent action:ACTION_DOWN

04-11 03:09:27.629: DEBUG/LayoutView1(446): onTouchEvent action:ACTION_MOVE

04-11 03:09:27.689: DEBUG/LayoutView1(446): onTouchEvent action:ACTION_MOVE

…… //省略过多的ACTION_MOVE

04-11 03:09:27.959: DEBUG/LayoutView1(446): onTouchEvent action:ACTION_UP

------------------------------------------------------------------------------------------------------------------------------

从Log可以看到,因为LayoutView1在阻碍第一次down事务时return true,所今后续的事务(包含第一次的down)将由LayoutView1本身处理惩罚,事务不再传递下去。

3. LayoutView1,LayoutView2的onInterceptTouchEvent()处理惩罚down事务返回false,

MyTextView的onTouchEvent()处理惩罚事务返回false

LayoutView2的onTouchEvent()处理惩罚事务返回true

----------------------------------------------------------------------------------------------------------------------------

04-11 09:50:21.147: DEBUG/LayoutView1(301): onInterceptTouchEvent action:ACTION_DOWN

04-11 09:50:21.147: DEBUG/LayoutView2(301): onInterceptTouchEvent action:ACTION_DOWN

04-11 09:50:21.147: DEBUG/MyTextView(301): onTouchEvent action:ACTION_DOWN

04-11 09:50:21.147: DEBUG/LayoutView2(301): onTouchEvent action:ACTION_DOWN

04-11 09:50:21.176: DEBUG/LayoutView1(301): onInterceptTouchEvent action:ACTION_MOVE

04-11 09:50:21.176: DEBUG/LayoutView2(301): onTouchEvent action:ACTION_MOVE

04-11 09:50:21.206: DEBUG/LayoutView1(301): onInterceptTouchEvent action:ACTION_MOVE

04-11 09:50:21.217: DEBUG/LayoutView2(301): onTouchEvent action:ACTION_MOVE

…… //省略过多的ACTION_MOVE

04-11 09:50:21.486: DEBUG/LayoutView1(301): onInterceptTouchEvent action:ACTION_UP

04-11 09:50:21.486: DEBUG/LayoutView2(301): onTouchEvent action:ACTION_UP

----------------------------------------------------------------------------------------------------------------------------

可以看到,因为MyTextView在onTouchEvent()中return false,down事务被传递给其父view,即LayoutView2的onTouchEvent()办法处理惩罚,因为在LayoutView2的onTouchEvent()中return true,所以down事务传递并没有上传到LayoutView1。重视,后续的move和up事务均被传递给LayoutView2的onTouchEvent()处理惩罚,而没有传递给MyTextView。

项目源码

http://files.cnblogs.com/not-code/testtouchstudy.zip


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值