由于一直是看别人的资料不是特别清晰 所以这次自己试验
主布局很简单 两个简单的自定义View 里面都复写三个方法 为的是方便打log查看调用顺序
dispatchTouchEvent
onInterceptTouchEvent
onTouchEvent
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<com.example.toucheventdemo.MyLinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.example.toucheventdemo.view
android:layout_width="100dip"
android:layout_height="100dip"
android:background="@android:color/black"
></com.example.toucheventdemo.view>
</com.example.toucheventdemo.MyLinearLayout>
</RelativeLayout>
1:正常的按下 并 滑动了
输出log为
03-18 23:26:56.422: E/wow(7372): MyLinearLayout------->dispatchTouchEvent_down
03-18 23:26:56.422: E/wow(7372): MyLinearLayout------->onInterceptTouchEvent down
03-18 23:26:56.422: E/wow(7372): ViewPager--->dispatchTouchEvent_down
03-18 23:26:56.422: E/wow(7372): ViewPager--->onInterceptTouchEvent down
03-18 23:26:56.422: E/wow(7372): ViewPager--->onTouchEvent down
03-18 23:26:56.422: E/wow(7372): MyLinearLayout------->onTouchEvent down
没有任何move和up动作 因为没有任何一个view的onTouchEvent返回true 表示所有view都不消费点击事件
①:更改父view的dispatch (默认情况下那三个方法全是返回的super的)
1:true
所有的事件都被拦截在了父view的 dispatchTouchEvent了 后面的所有方法包括子类的一概不响应了
但是此时可以响应 down move up
2:false
所有事件都被父view的 dispatch拦截了 但是此时只能响应 down
3:super
03-18 23:59:23.240: E/wow(16370): MyLinearLayout------->dispatchTouchEvent_down
03-18 23:59:23.240: E/wow(16370): MyLinearLayout------->onInterceptTouchEvent down
03-18 23:59:23.240: E/wow(16370): ViewPager--->dispatchTouchEvent_down
03-18 23:59:23.240: E/wow(16370): ViewPager--->onInterceptTouchEvent down
03-18 23:59:23.240: E/wow(16370): ViewPager--->onTouchEvent down
03-18 23:59:23.240: E/wow(16370): MyLinearLayout------->onTouchEvent down
1:true
按下去并且移动
03-18 23:34:54.072: E/wow(9690): MyLinearLayout------->dispatchTouchEvent_down
03-18 23:34:54.082: E/wow(9690): MyLinearLayout------->onInterceptTouchEvent down
03-18 23:34:54.082: E/wow(9690): MyLinearLayout------->onTouchEvent down
父view的三个方法都响应了 最终被onTouchEvent响应
因为该view拦截了事件 所以所有响应要交给该view的onTouchEvent 而要都intercept必须是从disptch开始调用它的 所以三个方法都响应了
2:false
03-18 23:37:57.097: E/wow(11082): MyLinearLayout------->dispatchTouchEvent_down
03-18 23:37:57.097: E/wow(11082): MyLinearLayout------->onInterceptTouchEvent down
03-18 23:37:57.097: E/wow(11082): ViewPager--->dispatchTouchEvent_down
03-18 23:37:57.097: E/wow(11082): ViewPager--->onInterceptTouchEvent down
03-18 23:37:57.097: E/wow(11082): ViewPager--->onTouchEvent down
03-18 23:37:57.107: E/wow(11082): MyLinearLayout------->onTouchEvent down
说明不拦截 一切正常
3:改成return super。
和2的log是一样的 这也说明了系统对ViewGroup默认返回false不拦截
③对父的 onTouchEvent
1:返回true
03-18 23:40:56.679: E/wow(12168): MyLinearLayout------->dispatchTouchEvent_down
03-18 23:40:56.689: E/wow(12168): MyLinearLayout------->onInterceptTouchEvent down
03-18 23:40:56.689: E/wow(12168): ViewPager--->dispatchTouchEvent_down
03-18 23:40:56.689: E/wow(12168): ViewPager--->onInterceptTouchEvent down
03-18 23:40:56.689: E/wow(12168): ViewPager--->onTouchEvent down
03-18 23:40:56.689: E/wow(12168): MyLinearLayout------->onTouchEvent down
03-18 23:40:56.709: E/wow(12168): MyLinearLayout------->dispatchTouchEvent_move
03-18 23:40:56.709: E/wow(12168): MyLinearLayout------->onTouchEvent move
03-18 23:40:56.719: E/wow(12168): MyLinearLayout------->dispatchTouchEvent_up
03-18 23:40:56.729: E/wow(12168): MyLinearLayout------->onTouchEvent up
正常逻辑
因为分发机制是要先dispatch从tree树自上往下的 当最终确认了消费体的时候才会将以后的事件直接给该view
2:返回false
03-18 23:43:47.361: E/wow(12674): MyLinearLayout------->dispatchTouchEvent_down
03-18 23:43:47.361: E/wow(12674): MyLinearLayout------->onInterceptTouchEvent down
03-18 23:43:47.361: E/wow(12674): ViewPager--->dispatchTouchEvent_down
03-18 23:43:47.361: E/wow(12674): ViewPager--->onInterceptTouchEvent down
03-18 23:43:47.361: E/wow(12674): ViewPager--->onTouchEvent down
03-18 23:43:47.371: E/wow(12674): MyLinearLayout------->onTouchEvent down
因为没有最终确定消费体 所以无任何view可以接受move 和 up 因此所有view只能响应down
3:返回super
同2
--------------------------------------------------------------------------------------------------------------------------------------------
现在将父view都还原成super 下面来更改子view
①子view的dispatch
1:返回true:
类似于父view返回true时候一样 但是此时的log反应可以在父类的结果上更进一步
当dispatch返回true的时候,当前view的其他任何touch方法都不会被调用 但是其dispatch会一直接受到其父view传来的各种消息 down move up (其父view要传递消息过来必定是父view的两个方法都要过一遍的:注意,不是三个)
03-18 23:47:27.566: E/wow(13663): MyLinearLayout------->dispatchTouchEvent_down
03-18 23:47:27.566: E/wow(13663): MyLinearLayout------->onInterceptTouchEvent down
03-18 23:47:27.566: E/wow(13663): ViewPager--->dispatchTouchEvent_down
03-18 23:47:27.596: E/wow(13663): MyLinearLayout------->dispatchTouchEvent_move
03-18 23:47:27.596: E/wow(13663): MyLinearLayout------->onInterceptTouchEvent move
03-18 23:47:27.596: E/wow(13663): ViewPager--->dispatchTouchEvent_move
03-18 23:47:27.606: E/wow(13663): MyLinearLayout------->dispatchTouchEvent_up
03-18 23:47:27.606: E/wow(13663): MyLinearLayout------->onInterceptTouchEvent up
03-18 23:47:27.606: E/wow(13663): ViewPager--->dispatchTouchEvent_up
要注意:这里并没有onTouchEvent 因为这里根本没有冒泡的过程了
2:返回false:
说明不消费,但是因为没有任何一个目标消费view 所以 move up事件是没法触发的,因为这两个时间必须要先有一个view消费了down。
按下并滑动 虽然没有调用子view的onTouchEvent但是却可以冒泡
03-18 23:53:21.404: E/wow(14460): MyLinearLayout------->dispatchTouchEvent_down
03-18 23:53:21.404: E/wow(14460): MyLinearLayout------->onInterceptTouchEvent down
03-18 23:53:21.404: E/wow(14460): ViewPager--->dispatchTouchEvent_down
03-18 23:53:21.404: E/wow(14460): MyLinearLayout------->onTouchEvent down
在此基础上对父view的dispatch返回false时候的效果做扩展结论:
当dispatch返回false的时候 最多响应到这个view的dispatch 且不会响应down 和 up了
3:返回super
按下并滑动
03-18 23:54:21.067: E/wow(15318): MyLinearLayout------->dispatchTouchEvent_down
03-18 23:54:21.067: E/wow(15318): MyLinearLayout------->onInterceptTouchEvent down
03-18 23:54:21.067: E/wow(15318): ViewPager--->dispatchTouchEvent_down
03-18 23:54:21.067: E/wow(15318): ViewPager--->onInterceptTouchEvent down
03-18 23:54:21.067: E/wow(15318): ViewPager--->onTouchEvent down
03-18 23:54:21.067: E/wow(15318): MyLinearLayout------->onTouchEvent down
比上面多响应了intercept和onTouch
②子view的onInterceptEvent
1:true
按下并滑动
同父类此时的情况 三个方法都响应了
③子view的onTouch
1:true
所有事件都从父view分发到子view 但是不会冒泡回去了 父类view一路过来的话其三个方法都会调用都
子view只会在第一次down分发的时候调用interceptTouchEvent后面就不会再调用了