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