Android的onTouchEventon、dispatchTouchEvent、InterceptTouchEvent按键消息派发流程(原)

    Android自定义View时按键消息流程是绕不过去的知识点,其中又涉及到三大方法 onTouchEventdispatchTouchEventonInterceptTouchEvent,他们之间的关系如何?优先级如何?出现矛盾时又会采取怎样的处理方式,我们这一节来做一下测试。

1.Demo源码

 搭建的Demo示例也比较简单,分别创建了TouchEventFlowActivity、TouchEventViewGroup、TouchEventView三个对象来测试消息流程,代码分别如下,也可以访问github的测试Demo中直接下载文件。



1.1.TouchEventFlowActivity

@EActivity(R.layout.touch_event_test)
public class TouchEventFlowActivity extends AppCompatActivity {
    public static final String TAG = "TouchEventTag";


    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        boolean returnResult = super.dispatchTouchEvent(event);
        Log.d(TouchEventFlowActivity.TAG, "Activity--dispatchTouchEvent:" + event.getAction() + ",returnResult:" + returnResult);
        return returnResult;
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        boolean returnResult = super.onTouchEvent(event);
//        returnResult = true;
        Log.d(TouchEventFlowActivity.TAG, "Activity--onTouchEvent:" + event.getAction() + ",returnResult:" + returnResult);
        return returnResult;
    }
}

touch_event_test的布局文件如此:

<com.able.libs.touchEventFlowTest.TouchEventViewGroup
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">


    <com.able.libs.touchEventFlowTest.TouchEventView
        android:id="@+id/view1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="view1"/>


    <com.able.libs.touchEventFlowTest.TouchEventView
        android:id="@+id/view2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="view2"/>
</com.able.libs.touchEventFlowTest.TouchEventViewGroup>

1.2.TouchEventViewGroup



public class TouchEventViewGroup extends LinearLayout {
    public TouchEventViewGroup(Context context) {
        super(context);
    }


    public TouchEventViewGroup(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }


    public TouchEventViewGroup(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        boolean returnResult = super.dispatchTouchEvent(ev);
//        returnResult = false;
        Log.d(TouchEventFlowActivity.TAG, "ViewGroup--dispatchTouchEvent:" + ev.getAction() + ",returnResult:" + returnResult);
        return returnResult;
    }


    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean returnResult = super.onInterceptTouchEvent(ev);
//        returnResult = false;
        Log.d(TouchEventFlowActivity.TAG, "ViewGroup--onInterceptTouchEvent:" + ev.getAction() + ",returnResult:" + returnResult);
        return returnResult;
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        boolean returnResult = super.onTouchEvent(event);
        returnResult = true;
        Log.d(TouchEventFlowActivity.TAG, "ViewGroup--onTouchEvent:" + event.getAction() + ",returnResult:" + returnResult);
        return returnResult;
    }
}

1.3.TouchEventView


public class TouchEventView extends android.support.v7.widget.AppCompatButton {
    public TouchEventView(Context context) {
        super(context);
    }


    public TouchEventView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }


    public TouchEventView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        boolean returnResult = super.dispatchTouchEvent(event);
//        returnResult = false;
        Log.d(TouchEventFlowActivity.TAG, "View--dispatchTouchEvent:" + event.getAction() + ",returnResult:" + returnResult);
        return returnResult;
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        boolean returnResult = super.onTouchEvent(event);
        returnResult = true;
        Log.d(TouchEventFlowActivity.TAG, "View--onTouchEvent:" + event.getAction() + ",returnResult:" + returnResult);
        return returnResult;
    }
}

1.4.代码说明


    以上就是该测试示例的全部代码,需要注意的是, @EActivity注释是用的 androidannotations的注释。
    该Demo中有一个Activity,布局里面用到了我们自定义的TouchEventViewGroup,该ViewGroup中包含了两个自定义TouchEventView。

    代码中的returnResult变量可以控制每个方法是否强制返回true或false。

    好了,测试开始。


2.View内部状态


2.1.View的onTouchEvent返回结果是否会影响View的dispatchTouchEvent?


    设置View的onTouchEvent=true

01-31 17:33:00.055 28485-28485/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:0,returnResult:false
01-31 17:33:00.058 28485-28485/com.able.libs D/TouchEventTag: View--onTouchEvent:0,returnResult:true
01-31 17:33:00.059 28485-28485/com.able.libs D/TouchEventTag: View--dispatchTouchEvent:0,returnResult:true
01-31 17:33:00.059 28485-28485/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:0,returnResult:true
01-31 17:33:00.059 28485-28485/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:0,returnResult:true


01-31 17:33:00.078 28485-28485/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:2,returnResult:false
01-31 17:33:00.079 28485-28485/com.able.libs D/TouchEventTag: View--onTouchEvent:2,returnResult:true
01-31 17:33:00.079 28485-28485/com.able.libs D/TouchEventTag: View--dispatchTouchEvent:2,returnResult:true
01-31 17:33:00.079 28485-28485/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:2,returnResult:true
01-31 17:33:00.079 28485-28485/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:true
01-31 17:33:00.108 28485-28485/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:2,returnResult:false
01-31 17:33:00.109 28485-28485/com.able.libs D/TouchEventTag: View--onTouchEvent:2,returnResult:true
01-31 17:33:00.109 28485-28485/com.able.libs D/TouchEventTag: View--dispatchTouchEvent:2,returnResult:true
01-31 17:33:00.110 28485-28485/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:2,returnResult:true
01-31 17:33:00.110 28485-28485/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:true


01-31 17:33:00.111 28485-28485/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:1,returnResult:false
01-31 17:33:00.112 28485-28485/com.able.libs D/TouchEventTag: View--onTouchEvent:1,returnResult:true
01-31 17:33:00.112 28485-28485/com.able.libs D/TouchEventTag: View--dispatchTouchEvent:1,returnResult:true
01-31 17:33:00.112 28485-28485/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:1,returnResult:true
01-31 17:33:00.113 28485-28485/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:1,returnResult:true


    设置View的onTouchEvent=false


01-31 17:34:11.059 28760-28760/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:0,returnResult:false
01-31 17:34:11.061 28760-28760/com.able.libs D/TouchEventTag: View--onTouchEvent:0,returnResult:false
01-31 17:34:11.061 28760-28760/com.able.libs D/TouchEventTag: View--dispatchTouchEvent:0,returnResult:false
01-31 17:34:11.061 28760-28760/com.able.libs D/TouchEventTag: ViewGroup--onTouchEvent:0,returnResult:false
01-31 17:34:11.061 28760-28760/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:0,returnResult:false
01-31 17:34:11.062 28760-28760/com.able.libs D/TouchEventTag: Activity--onTouchEvent:0,returnResult:false
01-31 17:34:11.062 28760-28760/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:0,returnResult:false


01-31 17:34:11.100 28760-28760/com.able.libs D/TouchEventTag: Activity--onTouchEvent:2,returnResult:false
01-31 17:34:11.100 28760-28760/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:false
01-31 17:34:11.139 28760-28760/com.able.libs D/TouchEventTag: Activity--onTouchEvent:2,returnResult:false
01-31 17:34:11.139 28760-28760/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:false


01-31 17:34:11.140 28760-28760/com.able.libs D/TouchEventTag: Activity--onTouchEvent:1,returnResult:false
01-31 17:34:11.140 28760-28760/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:1,returnResult:false

小结


    View的onTouchEvent结果会影响到dispatchTouchEvent的结果,如果View不处理事件,就上交


2.2.View的dispatchTouchEvent对onTouchEvent的影响



    设置View的dispatchTouchEvent=false,View的onTouchEvent=false

01-31 17:53:56.123 29336-29336/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:0,returnResult:false
01-31 17:53:56.127 29336-29336/com.able.libs D/TouchEventTag: View--onTouchEvent:0,returnResult:false
01-31 17:53:56.127 29336-29336/com.able.libs D/TouchEventTag: View--dispatchTouchEvent:0,returnResult:false
01-31 17:53:56.128 29336-29336/com.able.libs D/TouchEventTag: ViewGroup--onTouchEvent:0,returnResult:false
01-31 17:53:56.128 29336-29336/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:0,returnResult:false
01-31 17:53:56.129 29336-29336/com.able.libs D/TouchEventTag: Activity--onTouchEvent:0,returnResult:false
01-31 17:53:56.129 29336-29336/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:0,returnResult:false


01-31 17:53:56.192 29336-29336/com.able.libs D/TouchEventTag: Activity--onTouchEvent:2,returnResult:false
01-31 17:53:56.192 29336-29336/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:false


01-31 17:53:56.193 29336-29336/com.able.libs D/TouchEventTag: Activity--onTouchEvent:1,returnResult:false
01-31 17:53:56.194 29336-29336/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:1,returnResult:false

    设置View的dispatchTouchEvent=false,View的onTouchEvent=true


01-31 17:55:25.437 29670-29670/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:0,returnResult:false
01-31 17:55:25.439 29670-29670/com.able.libs D/TouchEventTag: View--onTouchEvent:0,returnResult:true
01-31 17:55:25.439 29670-29670/com.able.libs D/TouchEventTag: View--dispatchTouchEvent:0,returnResult:false
01-31 17:55:25.440 29670-29670/com.able.libs D/TouchEventTag: ViewGroup--onTouchEvent:0,returnResult:false
01-31 17:55:25.440 29670-29670/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:0,returnResult:false
01-31 17:55:25.440 29670-29670/com.able.libs D/TouchEventTag: Activity--onTouchEvent:0,returnResult:false
01-31 17:55:25.440 29670-29670/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:0,returnResult:false


01-31 17:55:25.461 29670-29670/com.able.libs D/TouchEventTag: Activity--onTouchEvent:2,returnResult:false
01-31 17:55:25.461 29670-29670/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:false
01-31 17:55:25.479 29670-29670/com.able.libs D/TouchEventTag: Activity--onTouchEvent:2,returnResult:false
01-31 17:55:25.479 29670-29670/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:false
01-31 17:55:25.496 29670-29670/com.able.libs D/TouchEventTag: Activity--onTouchEvent:2,returnResult:false
01-31 17:55:25.496 29670-29670/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:false


01-31 17:55:25.501 29670-29670/com.able.libs D/TouchEventTag: Activity--onTouchEvent:1,returnResult:false
01-31 17:55:25.501 29670-29670/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:1,returnResult:false
小结


    无论View的onTouchEvent何种状态,只要View的dispatchTouchEvent=false,消息就不会发给View



2.3.View内部小结



    View的dispatchTouchEvent根据onTouchEvent改变,但是优先级又高于onTouchEvent

3.ViewGroup与View之间优先级



    设置View的onTouchEvent返回true


01-31 18:09:06.612 30329-30329/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:0,returnResult:false
01-31 18:09:06.613 30329-30329/com.able.libs D/TouchEventTag: View--onTouchEvent:0,returnResult:true
01-31 18:09:06.613 30329-30329/com.able.libs D/TouchEventTag: View--dispatchTouchEvent:0,returnResult:true
01-31 18:09:06.613 30329-30329/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:0,returnResult:true
01-31 18:09:06.613 30329-30329/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:0,returnResult:true
01-31 18:09:06.651 30329-30329/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:2,returnResult:false
01-31 18:09:06.651 30329-30329/com.able.libs D/TouchEventTag: View--onTouchEvent:2,returnResult:true
01-31 18:09:06.651 30329-30329/com.able.libs D/TouchEventTag: View--dispatchTouchEvent:2,returnResult:true
01-31 18:09:06.651 30329-30329/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:2,returnResult:true
01-31 18:09:06.651 30329-30329/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:true
01-31 18:09:06.667 30329-30329/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:2,returnResult:false
01-31 18:09:06.667 30329-30329/com.able.libs D/TouchEventTag: View--onTouchEvent:2,returnResult:true
01-31 18:09:06.668 30329-30329/com.able.libs D/TouchEventTag: View--dispatchTouchEvent:2,returnResult:true
01-31 18:09:06.668 30329-30329/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:2,returnResult:true
01-31 18:09:06.668 30329-30329/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:true


01-31 18:09:06.712 30329-30329/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:1,returnResult:false
01-31 18:09:06.712 30329-30329/com.able.libs D/TouchEventTag: View--onTouchEvent:1,returnResult:true
01-31 18:09:06.713 30329-30329/com.able.libs D/TouchEventTag: View--dispatchTouchEvent:1,returnResult:true
01-31 18:09:06.713 30329-30329/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:1,returnResult:true
01-31 18:09:06.713 30329-30329/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:1,returnResult:true

小结


    只要View的onTouchEvent处理,消息就不再发送给ViewGroup


    设置View的onTouchEvent返回false


01-31 18:12:28.601 30827-30827/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:0,returnResult:false
01-31 18:12:28.606 30827-30827/com.able.libs D/TouchEventTag: View--onTouchEvent:0,returnResult:false
01-31 18:12:28.606 30827-30827/com.able.libs D/TouchEventTag: View--dispatchTouchEvent:0,returnResult:false
01-31 18:12:28.607 30827-30827/com.able.libs D/TouchEventTag: ViewGroup--onTouchEvent:0,returnResult:false
01-31 18:12:28.607 30827-30827/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:0,returnResult:false
01-31 18:12:28.608 30827-30827/com.able.libs D/TouchEventTag: Activity--onTouchEvent:0,returnResult:false
01-31 18:12:28.608 30827-30827/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:0,returnResult:false
01-31 18:12:28.617 30827-30827/com.able.libs D/TouchEventTag: Activity--onTouchEvent:2,returnResult:false
01-31 18:12:28.617 30827-30827/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:false
01-31 18:12:28.668 30827-30827/com.able.libs D/TouchEventTag: Activity--onTouchEvent:2,returnResult:false
01-31 18:12:28.668 30827-30827/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:false


01-31 18:12:28.671 30827-30827/com.able.libs D/TouchEventTag: Activity--onTouchEvent:1,returnResult:false
01-31 18:12:28.671 30827-30827/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:1,returnResult:false

小结


    View不处理消息时,才会轮到ViewGroup



再来个小结


    ViewGroup只有等View不处理时,才会轮到他处理,而如果ViewGroup也没有处理,那么就只能留给Activity处理


4.ViewGroup内部状态


4.1.ViewGroup的onTouchEvent对dispatchTouchEvent的影响


    要测试就要先在View中dispatchTouchEvent=false,封堵View的流程
    设置ViewGroup的onTouchEvent返回true

01-31 18:23:26.165 31388-31388/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:0,returnResult:false
01-31 18:23:26.166 31388-31388/com.able.libs D/TouchEventTag: View--onTouchEvent:0,returnResult:true
01-31 18:23:26.166 31388-31388/com.able.libs D/TouchEventTag: View--dispatchTouchEvent:0,returnResult:false
01-31 18:23:26.166 31388-31388/com.able.libs D/TouchEventTag: ViewGroup--onTouchEvent:0,returnResult:true
01-31 18:23:26.166 31388-31388/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:0,returnResult:true
01-31 18:23:26.166 31388-31388/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:0,returnResult:true


01-31 18:23:26.204 31388-31388/com.able.libs D/TouchEventTag: ViewGroup--onTouchEvent:2,returnResult:true
01-31 18:23:26.204 31388-31388/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:2,returnResult:true
01-31 18:23:26.204 31388-31388/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:true
01-31 18:23:26.254 31388-31388/com.able.libs D/TouchEventTag: ViewGroup--onTouchEvent:2,returnResult:true
01-31 18:23:26.254 31388-31388/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:2,returnResult:true
01-31 18:23:26.254 31388-31388/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:true


01-31 18:23:26.266 31388-31388/com.able.libs D/TouchEventTag: ViewGroup--onTouchEvent:1,returnResult:true
01-31 18:23:26.266 31388-31388/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:1,returnResult:true
01-31 18:23:26.266 31388-31388/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:1,returnResult:true

    设置ViewGroup的onTouchEvent返回false

01-31 18:24:32.798 31553-31553/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:0,returnResult:false
01-31 18:24:32.803 31553-31553/com.able.libs D/TouchEventTag: View--onTouchEvent:0,returnResult:true
01-31 18:24:32.803 31553-31553/com.able.libs D/TouchEventTag: View--dispatchTouchEvent:0,returnResult:false
01-31 18:24:32.805 31553-31553/com.able.libs D/TouchEventTag: ViewGroup--onTouchEvent:0,returnResult:false
01-31 18:24:32.805 31553-31553/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:0,returnResult:false
01-31 18:24:32.807 31553-31553/com.able.libs D/TouchEventTag: Activity--onTouchEvent:0,returnResult:false
01-31 18:24:32.807 31553-31553/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:0,returnResult:false


01-31 18:24:32.853 31553-31553/com.able.libs D/TouchEventTag: Activity--onTouchEvent:1,returnResult:false
01-31 18:24:32.853 31553-31553/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:1,returnResult:false

小结


    和View一样,ViewGroup的onTouchEvent会影响dispatchTouchEvent的返回值,ViewGroup如果不处理,就上交给Activity处理


4.2.ViewGroup的dispatchTouchEvent对onTouchEvent的影响


    设置ViewGroup的onTouchEvent返回true,dispatchTouchEvent返回false
01-31 18:30:54.474 32098-32098/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:0,returnResult:false
01-31 18:30:54.475 32098-32098/com.able.libs D/TouchEventTag: View--onTouchEvent:0,returnResult:true
01-31 18:30:54.475 32098-32098/com.able.libs D/TouchEventTag: View--dispatchTouchEvent:0,returnResult:false
01-31 18:30:54.475 32098-32098/com.able.libs D/TouchEventTag: ViewGroup--onTouchEvent:0,returnResult:true
01-31 18:30:54.475 32098-32098/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:0,returnResult:false
01-31 18:30:54.476 32098-32098/com.able.libs D/TouchEventTag: Activity--onTouchEvent:0,returnResult:false
01-31 18:30:54.476 32098-32098/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:0,returnResult:false


01-31 18:30:54.497 32098-32098/com.able.libs D/TouchEventTag: Activity--onTouchEvent:2,returnResult:false
01-31 18:30:54.497 32098-32098/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:false


01-31 18:30:54.557 32098-32098/com.able.libs D/TouchEventTag: Activity--onTouchEvent:1,returnResult:false
01-31 18:30:54.558 32098-32098/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:1,returnResult:false

小结


    即便ViewGroup的onTouchEvent返回了true,但是由于dispatchTouchEvent为false,所以事件还是上交了
    说明和View一样,ViewGroup的dispatchTouchEvent优先级高于onTouchEvent

4.3.ViewGroup的onInterceptTouchEvent对ViewGroup的影响


    ViewGroup的onInterceptTouchEvent返回true,onTouchEvent也返回true

01-26 16:36:02.152 8768-8768/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:0,returnResult:true
01-26 16:36:02.152 8768-8768/com.able.libs D/TouchEventTag: ViewGroup--onTouchEvent:0,returnResult:true
01-26 16:36:02.152 8768-8768/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:0,returnResult:true
01-26 16:36:02.152 8768-8768/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:0,returnResult:true


01-26 16:36:02.190 8768-8768/com.able.libs D/TouchEventTag: ViewGroup--onTouchEvent:2,returnResult:true
01-26 16:36:02.190 8768-8768/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:2,returnResult:true
01-26 16:36:02.190 8768-8768/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:true
01-26 16:36:02.235 8768-8768/com.able.libs D/TouchEventTag: ViewGroup--onTouchEvent:2,returnResult:true
01-26 16:36:02.235 8768-8768/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:2,returnResult:true
01-26 16:36:02.235 8768-8768/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:true


01-26 16:36:02.235 8768-8768/com.able.libs D/TouchEventTag: ViewGroup--onTouchEvent:1,returnResult:true
01-26 16:36:02.235 8768-8768/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:1,returnResult:true
01-26 16:36:02.235 8768-8768/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:1,returnResult:true

小结


    ViewGroup中onInterceptTouchEvent拦截,并且处理了,以后的消息也只停留在ViewGroup中

    ViewGroup的onInterceptTouchEvent返回true,但是onTouchEvent返回false

01-26 16:32:57.300 8594-8594/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:0,returnResult:true
01-26 16:32:57.301 8594-8594/com.able.libs D/TouchEventTag: ViewGroup--onTouchEvent:0,returnResult:false
01-26 16:32:57.301 8594-8594/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:0,returnResult:false
01-26 16:32:57.302 8594-8594/com.able.libs D/TouchEventTag: Activity--onTouchEvent:0,returnResult:false
01-26 16:32:57.302 8594-8594/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:0,returnResult:false


01-26 16:32:57.323 8594-8594/com.able.libs D/TouchEventTag: Activity--onTouchEvent:2,returnResult:false
01-26 16:32:57.323 8594-8594/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:false
01-26 16:32:57.352 8594-8594/com.able.libs D/TouchEventTag: Activity--onTouchEvent:2,returnResult:false
01-26 16:32:57.352 8594-8594/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:false
01-26 16:32:57.364 8594-8594/com.able.libs D/TouchEventTag: Activity--onTouchEvent:2,returnResult:false
01-26 16:32:57.364 8594-8594/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:false


01-26 16:32:57.365 8594-8594/com.able.libs D/TouchEventTag: Activity--onTouchEvent:1,returnResult:false
01-26 16:32:57.366 8594-8594/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:1,returnResult:false

小结


    ViewGroup中onInterceptTouchEvent拦截,但是没有处理,那么还是上交给Activity


再来个小结
    ViewGroup的onInterceptTouchEvent拦截之后消息不再发给View,这也是onInterceptTouchEvent最主要的作用,因为通过dispatchTouchEvent拦截,都会先进入View再来询问ViewGroup
    但是ViewGroup的拦截后,如果处理就给ViewGroup处理,如果不处理,还是上交给Activity

5.View、ViewGroup都想处理


    前提是ViewGroup不要在onInterceptTouchEvent中拦截哦
    设置View和ViewGroup的onTouchEvent都返回true

01-31 18:40:41.641 32429-32429/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:0,returnResult:false
01-31 18:40:41.643 32429-32429/com.able.libs D/TouchEventTag: View--onTouchEvent:0,returnResult:true
01-31 18:40:41.643 32429-32429/com.able.libs D/TouchEventTag: View--dispatchTouchEvent:0,returnResult:true
01-31 18:40:41.643 32429-32429/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:0,returnResult:true
01-31 18:40:41.643 32429-32429/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:0,returnResult:true


01-31 18:40:41.663 32429-32429/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:2,returnResult:false
01-31 18:40:41.663 32429-32429/com.able.libs D/TouchEventTag: View--onTouchEvent:2,returnResult:true
01-31 18:40:41.663 32429-32429/com.able.libs D/TouchEventTag: View--dispatchTouchEvent:2,returnResult:true
01-31 18:40:41.663 32429-32429/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:2,returnResult:true
01-31 18:40:41.663 32429-32429/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:true
01-31 18:40:41.687 32429-32429/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:2,returnResult:false
01-31 18:40:41.687 32429-32429/com.able.libs D/TouchEventTag: View--onTouchEvent:2,returnResult:true
01-31 18:40:41.687 32429-32429/com.able.libs D/TouchEventTag: View--dispatchTouchEvent:2,returnResult:true
01-31 18:40:41.688 32429-32429/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:2,returnResult:true
01-31 18:40:41.688 32429-32429/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:true
01-31 18:40:41.691 32429-32429/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:2,returnResult:false
01-31 18:40:41.692 32429-32429/com.able.libs D/TouchEventTag: View--onTouchEvent:2,returnResult:true
01-31 18:40:41.692 32429-32429/com.able.libs D/TouchEventTag: View--dispatchTouchEvent:2,returnResult:true
01-31 18:40:41.692 32429-32429/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:2,returnResult:true
01-31 18:40:41.692 32429-32429/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:2,returnResult:true


01-31 18:40:41.693 32429-32429/com.able.libs D/TouchEventTag: ViewGroup--onInterceptTouchEvent:1,returnResult:false
01-31 18:40:41.694 32429-32429/com.able.libs D/TouchEventTag: View--onTouchEvent:1,returnResult:true
01-31 18:40:41.694 32429-32429/com.able.libs D/TouchEventTag: View--dispatchTouchEvent:1,returnResult:true
01-31 18:40:41.694 32429-32429/com.able.libs D/TouchEventTag: ViewGroup--dispatchTouchEvent:1,returnResult:true
01-31 18:40:41.694 32429-32429/com.able.libs D/TouchEventTag: Activity--dispatchTouchEvent:1,returnResult:true

小结


    View的优先级高于ViewGroup,只要View消耗掉,就不会再询问ViewGroup


6.总结


    消息流程是View--ViewGroup--Activity,所以不想处理时层层递交(Activity是终点站),想处理时,随时可以拦截
    View和ViewGroup的内部,onTouchEvent决定了他们的dispatchTouchEvent的值,但是dispatchTouchEvent优先级又高于onTouchEvent(只要拦截,就一定交给当前对象处理,只要不拦截,就一定不交给当前对象处理)
    ViewGroup的onInterceptTouchEvent决定了是否不向View派发消息,但是即使拦截了,如果ViewGroup没有处理,还是要上交的
### 回答1: 如果您想在Android应用程序中模拟`dispatchTouchEvent`但是您发现即使移动了很短的距离,也没有触发滑动事件,那么您可能需要检查以下几点: 1. 您正在模拟的事件是否为触摸事件 只有触摸事件才能触发滑动事件,如果您正在模拟的是其他类型的事件,例如按下或释放事件,那么它们不会触发滑动事件。 2. 触摸事件是否被正确处理 您需要确保您的应用程序正确处理了触摸事件。如果您的应用程序没有正确处理触摸事件,则不会触发滑动事件。您可以在代码中检查是否有任何逻辑错误或其他问题。 3. 您移动的距离是否足够长 滑动事件通常需要移动一定的距离才能触发。如果您的移动距离太短,则可能不会触发滑动事件。您可以尝试增加移动距离以查看是否会触发滑动事件。 4. 触摸事件是否在正确的View上分发 您需要确保触摸事件在正确的View上分发。如果您的事件被错误地分发到其他View上,则可能不会触发滑动事件。您可以在代码中检查事件分发的逻辑以确保事件被正确地分发到目标View上。 希望这些提示可以帮助您找到问题所在并解决问题。 ### 回答2: 在Android模拟dispatchTouchEvent事件时,如果手指在屏幕上的滑动距离很短,即没有产生明显的滑动效果,可能有以下几种情况: 首先,可能是由于手指接触屏幕的时间非常短暂,无法产生连续的触摸事件,导致无法触发滑动操作。Android系统通过一系列的手势识别算法来判断用户的触摸行为,如果触摸时间过短,系统可能会将其判定为点击事件,而非滑动事件。 其次,可能是由于滑动距离实际上并不足够大,无法满足系统设置的滑动阈值。Android系统为了提升用户体验,在滑动操作识别时会设置一个最小滑动距离阈值。如果手指的滑动距离不超过该阈值,系统将不会将其判定为滑动操作。 另外,也可能是在模拟dispatchTouchEvent事件时出现了问题。dispatchTouchEvent是Activity或View的一个方法,用于分发触摸事件。如果模拟的事件没有正确地传递给相应的View或没有正确处理,那么滑动操作可能无法生效。 总之,在Android模拟dispatchTouchEvent事件并期望实现滑动效果时,需要注意手指接触屏幕的时间、滑动距离是否满足系统要求,以及正确处理触摸事件的传递和处理。 ### 回答3: 当Android模拟`dispatchTouchEvent`时,如果距离很短且没有滑动,可以有以下因。 首先,可能是因为滑动的距离确实很短,无法引发滑动事件。Android的滑动事件通常是通过触摸屏幕的开始点和结束点之间的水平或垂直位移来判断是否发生滑动。如果滑动的位移非常小,可能不足以被视为滑动事件。 其次,可能是因为`dispatchTouchEvent`方法的使用不正确或被其他代码截断或修改。在Android中,`dispatchTouchEvent`是一个用于分发触摸事件的方法,该方法被调用后会依次经过Activity、ViewGroup以及View等组件,并在这些组件中执行相应的触摸事件方法。如果在这个过程中,`dispatchTouchEvent`方法被其他代码修改或截断,可能会导致滑动事件的距离不正确。 另外,也有可能是因为滑动事件的处理逻辑有误。在`dispatchTouchEvent`方法中,会涉及到对触摸事件的处理和分发,以及相应的滑动逻辑。如果滑动事件的处理逻辑有误,可能导致滑动事件无法正确触发。 总之,要解决Android模拟`dispatchTouchEvent`距离很短且没有滑动的问题,首先需要确保滑动距离足够大以被识别为滑动事件。其次,需要检查`dispatchTouchEvent`方法的使用是否正确,并确保没有被其他代码截断或修改。最后,需要检查滑动事件的处理逻辑是否正确,以确保滑动事件能够正确触发和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值