目录
摘要:
为了掌握手势冲突的解决办法,必须了解清楚Android事件分发的流程。事件分发的技术文档看了比较多,看完了感觉还是不理解,为了验证文档的结论,突发奇想地想要用实验的方式证明,于是有了这篇文章。事件分发流程分为View和ViewGroup两种,相关的方法是dispatchTouchEvent、onTouchEvent和onInterceptTouchEvent以及requestDisallowInterceptTouchEvent,前面两个方法继承于View,后面两个方法继承ViewGroup。
整备材料:
(1)重写的View或ViewGroup:MyImageView、MyButton、MyLinearLayout和MyRelativeLayout
- /**
- *重写View的dispatchTouchEvent和onTouchEvent方法
- */
- @Override
- public boolean dispatchTouchEvent(MotionEvent event) {
- boolean flag = super.dispatchTouchEvent(event);
- // if (event.getAction() == MotionEvent.ACTION_DOWN)
- // Log.d(TAG, "dispatchTouchEvent: " + flag);
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- Log.d(TAG, "dispatchTouchEvent: ACTION_DOWN " + flag);
- break;
- case MotionEvent.ACTION_MOVE:
- Log.d(TAG, "dispatchTouchEvent: ACTION_MOVE " + flag);
- break;
- case MotionEvent.ACTION_UP:
- Log.d(TAG, "dispatchTouchEvent: ACTION_UP " + flag);
- break;
- }
- return flag;
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- boolean flag = super.onTouchEvent(event);
- // if (event.getAction() == MotionEvent.ACTION_DOWN)
- // Log.d(TAG, "onTouchEvent: " + flag);
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- Log.d(TAG, "onTouchEvent: ACTION_DOWN " + flag);
- break;
- case MotionEvent.ACTION_MOVE:
- Log.d(TAG, "onTouchEvent: ACTION_MOVE " + flag);
- break;
- case MotionEvent.ACTION_UP:
- Log.d(TAG, "onTouchEvent: ACTION_UP " + flag);
- break;
- }
- return flag;
- }
- /**
- *重写ViewGroup的dispatchTouchEvent和onTouchEvent方法外,同时重写onInterceptTouchEvent、requestDisallowInterceptTouchEvent方法
- */
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- boolean flag = super.onInterceptTouchEvent(ev);
- // if (ev.getAction()==MotionEvent.ACTION_DOWN)
- // Log.d(TAG, "onInterceptTouchEvent: "+flag);
- switch (ev.getAction()) {
- case MotionEvent.ACTION_DOWN:
- Log.d(TAG, "onInterceptTouchEvent: ACTION_DOWN " + flag);
- break;
- case MotionEvent.ACTION_MOVE:
- Log.d(TAG, "onInterceptTouchEvent: ACTION_MOVE " + flag);
- break;
- case MotionEvent.ACTION_UP:
- Log.d(TAG, "onInterceptTouchEvent: ACTION_UP " + flag);
- break;
- }
- return flag;
- }
- @Override
- public boolean dispatchTouchEvent(MotionEvent event) {
- boolean flag = super.dispatchTouchEvent(event);
- // if (event.getAction()==MotionEvent.ACTION_DOWN)
- // Log.d(TAG, "dispatchTouchEvent: " + flag);
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- Log.d(TAG, "dispatchTouchEvent: ACTION_DOWN " + flag);
- break;
- case MotionEvent.ACTION_MOVE:
- Log.d(TAG, "dispatchTouchEvent: ACTION_MOVE " + flag);
- break;
- case MotionEvent.ACTION_UP:
- Log.d(TAG, "dispatchTouchEvent: ACTION_UP " + flag);
- break;
- }
- return flag;
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- boolean flag = super.onTouchEvent(event);
- // if (event.getAction()==MotionEvent.ACTION_DOWN)
- // Log.d(TAG, "onTouchEvent: "+flag);
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- Log.d(TAG, "onTouchEvent: ACTION_DOWN " + flag);
- break;
- case MotionEvent.ACTION_MOVE:
- Log.d(TAG, "onTouchEvent: ACTION_MOVE " + flag);
- break;
- case MotionEvent.ACTION_UP:
- Log.d(TAG, "onTouchEvent: ACTION_UP " + flag);
- break;
- }
- return flag;
- }
- @Override
- public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
- super.requestDisallowInterceptTouchEvent(disallowIntercept);
- Log.d(TAG, "requestDisallowInterceptTouchEvent: ");
- }
(2)设置布局文件:activity_event_dispatch.xml
- <?xml version="1.0" encoding="utf-8"?>
- <cn.teachcourse.view.MyRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/activity_event_dispatch"
- 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="cn.teachcourse.view.EventDispatchActivity">
- <cn.teachcourse.view.MyImageView
- android:id="@+id/dispatch_iv"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/beautiful_girl" />
- <cn.teachcourse.view.MyLinearlayout
- android:id="@+id/dispatch_ll"
- android:layout_width="match_parent"
- android:layout_height="100dp"
- android:layout_below="@+id/dispatch_iv"
- android:layout_marginTop="@dimen/activity_horizontal_margin"
- android:background="@drawable/default_bg">
- </cn.teachcourse.view.MyLinearlayout>
- <cn.teachcourse.view.MyLinearlayout
- android:id="@+id/dispatch_event_ll"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_below="@+id/dispatch_ll"
- android:layout_marginTop="@dimen/activity_horizontal_margin">
- <cn.teachcourse.view.MyImageView
- android:id="@+id/dispatch_event_iv"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:clickable="false"
- android:src="@drawable/beautiful_girl" />
- <cn.teachcourse.view.MyButton
- android:id="@+id/dispatch_event_btn"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/app_name"
- android:layout_margin="@dimen/activity_vertical_margin" />
- </cn.teachcourse.view.MyLinearlayout>
- </cn.teachcourse.view.MyRelativeLayout>
(3)通过鼠标在屏幕上滑动,查看log打印的结果,得出实验的结论。
实验一:证明事件传递由外到内,事件响应由内到外
与事件传递相关的方法是:
(1)dispatchTouchEvent:传递当前触摸屏幕的事件给下一个target view,或者当前view(如果当前view是target view)
return true,表示触摸屏幕的事件被当前view处理,否则交由下一个target view处理。
MyButton、MyImageView分别继承Button和ImageView,重写View的dispatchTouchEvent、onTouchEvent方法,滑动MyButton和MyImageView,查看log打印的结果:
- /**
- *MyButton打印结果
- */
- D/MyRelativeLayout: onInterceptTouchEvent: ACTION_DOWN false
- D/MyLinearlayout: onInterceptTouchEvent: ACTION_DOWN false
- D/MyButton: onTouchEvent: ACTION_DOWN true
- D/MyButton: dispatchTouchEvent: ACTION_DOWN true
- D/MyLinearlayout: dispatchTouchEvent: ACTION_DOWN true
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_DOWN true
- D/MyRelativeLayout: onInterceptTouchEvent: ACTION_MOVE true
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE true
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_UP false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_UP false
- /**
- *MyImageView打印结果
- */
- D/MyRelativeLayout: onInterceptTouchEvent: ACTION_DOWN false
- D/MyLinearlayout: onInterceptTouchEvent: ACTION_DOWN false
- D/MyImageView: onTouchEvent: ACTION_DOWN false
- D/MyImageView: dispatchTouchEvent: ACTION_DOWN false
- D/MyLinearlayout: onTouchEvent: ACTION_DOWN false
- D/MyLinearlayout: dispatchTouchEvent: ACTION_DOWN false
- D/MyRelativeLayout: onTouchEvent: ACTION_DOWN false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_DOWN false
为什么MyImageView打印结果和MyButton不同?
原因是MyImageView继承ImageView,ImageView默认clickable=false,类似TextView默认无法点击一样。想要让MyImageView和MyButton打印一样的结果,将clickable设置为true即可。
结论:
从实验一,我们大概可以看到滑动MyImageView控件后,事件传递的流程:MyRelativeLayout——>MyLinearLayout——>MyButton(或MyImageView)——>MyLinearLayout——>MyRelativeLayout,根据视图结构的外层向内层传递,然后再由内层向外层响应。
实验二:证明滑动手势伴随一个ACTION_DOWN、多个ACTION_MOVE和一个ACTION_UP
在实验一中,我们将MyImageView的clickable属性设置为true,然后继续在该控件上不停的滑动,查看log的打印结果:
- D/MyRelativeLayout: onInterceptTouchEvent: ACTION_DOWN false
- D/MyLinearlayout: onInterceptTouchEvent: ACTION_DOWN false
- D/MyImageView: onTouchEvent: ACTION_DOWN true
- D/MyImageView: dispatchTouchEvent: ACTION_DOWN true
- D/MyLinearlayout: dispatchTouchEvent: ACTION_DOWN true
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_DOWN true
- D/MyRelativeLayout: onInterceptTouchEvent: ACTION_MOVE true
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE true
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: onTouchEvent: ACTION_UP false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_UP false
结论:打印的结果和MyButton的顺序完全一样,同时分析可以看出,中间全部重复ACTION_MOVE这个动作,只有开始出现ACTION_DOWN,结束出现了ACTION_UP,说明滑动手势伴随一个ACTION_DOWN、多个ACTION_MOVE和一个ACTION_UP,了解这个对我们有什么好处呢?不急,后面慢慢说呀。
实验三:证明onInterceptTouchEvent返回true,禁止事件继续传递
onInterceptTouchEvent和requestDisallowInterceptTouchEvent继承属于ViewGroup,查看源码熟悉它们的用法:
- /**
- * Implement this method to intercept all touch screen motion events. This
- * allows you to watch events as they are dispatched to your children, and
- * take ownership of the current gesture at any point.
- *
- * <p>Using this function takes some care, as it has a fairly complicated
- * interaction with {@link View#onTouchEvent(MotionEvent)
- * View.onTouchEvent(MotionEvent)}, and using it requires implementing
- * that method as well as this one in the correct way. Events will be
- * received in the following order:
- *
- * <ol>
- * <li> You will receive the down event here.
- * <li> The down event will be handled either by a child of this view
- * group, or given to your own onTouchEvent() method to handle; this means
- * you should implement onTouchEvent() to return true, so you will
- * continue to see the rest of the gesture (instead of looking for
- * a parent view to handle it). Also, by returning true from
- * onTouchEvent(), you will not receive any following
- * events in onInterceptTouchEvent() and all touch processing must
- * happen in onTouchEvent() like normal.
- * <li> For as long as you return false from this function, each following
- * event (up to and including the final up) will be delivered first here
- * and then to the target's onTouchEvent().
- * <li> If you return true from here, you will not receive any
- * following events: the target view will receive the same event but
- * with the action {@link MotionEvent#ACTION_CANCEL}, and all further
- * events will be delivered to your onTouchEvent() method and no longer
- * appear here.
- * </ol>
- *
- * @param ev The motion event being dispatched down the hierarchy.
- * @return Return true to steal motion events from the children and have
- * them dispatched to this ViewGroup through onTouchEvent().
- * The current target will receive an ACTION_CANCEL event, and no further
- * messages will be delivered here.
- */
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- return false;
- }
翻译的大概意思:实现onInterceptTouchEvent方法拦截所有触摸屏幕的事件,该方法允许你观察被发送给子控件的事件,并获取当前触摸屏幕手势的所有权。
(1)这里首先获取触摸屏幕ACTION_DOWN事件
(2)ACTION_DOWN事件可以被当前ViewGroup的子控件处理,也可以传递给当前ViewGroup的onTouchEvent()方法处理;也就是说你应该实现onTouchEvent()方法并返回true,于是你将会继续观察到手势的其他事件。同时,通过onTouchEvent返回true,你将无法在onInterceptTouchEvent方法中接收任何ACTION_DOWN之外的事件;target view将会接收到相同的事件,只是伴随着ACTION_CANCEL事件,后面所有的事件将会被传递到onTouchEvent()方法,不会再在这里出现。
(3)只要该方法返回false,接下来的每一个事件都将会首先传递到这里,然后在传递到target的onTouchEvent()方法
(4)如果该方法返回true,你将无法接收接下来的任何一个事件;target view将会接收到相同的事件,只是伴随着ACTION_CANCEL事件,后面所有的事件将会被传递到onTouchEvent()方法,不会再在这里出现。
为了验证第(3)点阐述的两层意思,我们选择重写的MyRelativeLayout控件,第一层意思:让当前的MyRelativeLayout的onTouchEvent返回true,结果是否可以证明该方法里可以接收ACTION_DOWN之外的其它事件,查看log打印结果:
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- /**
- *默认flag=false,返回true
- */
- boolean flag = super.onTouchEvent(event);
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- Log.d(TAG, "onTouchEvent: ACTION_DOWN " + flag);
- break;
- case MotionEvent.ACTION_MOVE:
- Log.d(TAG, "onTouchEvent: ACTION_MOVE " + flag);
- break;
- case MotionEvent.ACTION_UP:
- Log.d(TAG, "onTouchEvent: ACTION_UP " + flag);
- break;
- }
- return !flag;
- }
- /**
- *MyRelativeLayout的onTouchEvent打印结果
- */
- D/MyRelativeLayout: onInterceptTouchEvent: ACTION_DOWN false
- D/MyLinearlayout: onInterceptTouchEvent: ACTION_DOWN false
- D/MyImageView: onTouchEvent: ACTION_DOWN true
- D/MyImageView: dispatchTouchEvent: ACTION_DOWN true
- D/MyLinearlayout: dispatchTouchEvent: ACTION_DOWN true
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_DOWN true
- D/MyRelativeLayout: onInterceptTouchEvent: ACTION_MOVE true
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE true
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE true
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE true
- D/MyRelativeLayout: onTouchEvent: ACTION_MOVE false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_MOVE true
- D/MyRelativeLayout: onTouchEvent: ACTION_UP false
- D/MyRelativeLayout: dispatchTouchEvent: ACTION_UP true
看到onTouchEvent响应了ACTION_MOVE、ACTION_UP事件,证明第一层意识是正确。
接下来证明第二层:当前MyRelativeLayout的onTouchEvent返回true后,将无法在onInterceptTouchEvent()方法中接收ACTION_DOWN之外的事件。
PS:从上面的打印结果,无法得出该结论,其中onInterceptTouchEvent打印了一句:ACTION_MOVE
推荐阅读
你可能感兴趣的文章
转载请注明出处: https://www.teachcourse.cn/2108.html ,谢谢支持!