Android onInterceptTouchEvent与onTouchEvent调用关系

来源:互联网 发布:淘宝客服销售案例 编辑:程序博客网 时间:2024/06/14 23:21

概述

onInterceptTouchEvent()是用来拦截Touch事件,ViewGroup有,View没有,onTouchEvent()是Touch事件,ViewGroup与View都有。

实例讲解

当一个Touch事件发生后,会由父布局开始依次执行onInterceptTouchEvent(),如果都没有拦截,则一直往下传,直到底层的View,调用onTouchEvent(),如果一直没有消费,则再依次往上传。
这里写图片描述
自定义Layout:

package com.whu.touchevent;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.widget.LinearLayout;/** * Created by Fly on 2016/10/26. */public class MyLayout extends LinearLayout{    private static final String TAG = "MyLayout";    public MyLayout(Context context) {        super(context);    }    public MyLayout(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        switch (ev.getAction()){            case MotionEvent.ACTION_DOWN:                Log.i(TAG, "onInterceptTouchEvent: " + "action down");                break;            case MotionEvent.ACTION_MOVE:                Log.i(TAG, "onInterceptTouchEvent: " + "action move");            case MotionEvent.ACTION_UP:                Log.i(TAG, "onInterceptTouchEvent: " + "action up");                break;        }        return false;    }    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()){            case MotionEvent.ACTION_DOWN:                Log.i(TAG, "onTouchEvent: " + "action down");                break;            case MotionEvent.ACTION_MOVE:                Log.i(TAG, "onTouchEvent: " + "action move");                break;            case MotionEvent.ACTION_UP:                Log.i(TAG, "onTouchEvent: " + "action up");                break;        }        return false;    }}

自定义View:

package com.whu.touchevent;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.widget.Button;/** * Created by Fly on 2016/10/26. */public class MyView extends Button{    private static final String TAG = "MyView";    public MyView(Context context) {        super(context);    }    public MyView(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()){            case MotionEvent.ACTION_DOWN:                Log.i(TAG, "onTouchEvent: " + "action down");                break;            case MotionEvent.ACTION_MOVE:                Log.i(TAG, "onTouchEvent: " + "action move");                break;            case MotionEvent.ACTION_UP:                Log.i(TAG, "onTouchEvent: " + "action up");                break;        }        return true;    }}
  1. layout的onInterceptTouchEvent和onTouchEvent都返回false,view的onTouchEvent返回false
10-26 15:33:43.241 4897-4897/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action down10-26 15:33:43.241 4897-4897/com.whu.touchevent I/MyView: onTouchEvent: action down10-26 15:33:43.241 4897-4897/com.whu.touchevent I/MyLayout: onTouchEvent: action down

layout没有拦截,走到view的ontouch,view没有消费,继续走,走到layout的ontouch,依然没有消费,继续向上。
2. layout的onInterceptTouchEvent和onTouchEvent都返回false,view的onTouchEvent返回true

10-26 15:38:42.885 11983-11983/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action down10-26 15:38:42.885 11983-11983/com.whu.touchevent I/MyView: onTouchEvent: action down10-26 15:38:42.933 11983-11983/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action move10-26 15:38:42.933 11983-11983/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action up10-26 15:38:42.933 11983-11983/com.whu.touchevent I/MyView: onTouchEvent: action move10-26 15:38:42.949 11983-11983/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action move10-26 15:38:42.949 11983-11983/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action up10-26 15:38:42.949 11983-11983/com.whu.touchevent I/MyView: onTouchEvent: action move10-26 15:38:42.957 11983-11983/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action move10-26 15:38:42.957 11983-11983/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action up10-26 15:38:42.957 11983-11983/com.whu.touchevent I/MyView: onTouchEvent: action move10-26 15:38:42.965 11983-11983/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action move10-26 15:38:42.965 11983-11983/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action up10-26 15:38:42.965 11983-11983/com.whu.touchevent I/MyView: onTouchEvent: action move10-26 15:38:42.966 11983-11983/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action up10-26 15:38:42.966 11983-11983/com.whu.touchevent I/MyView: onTouchEvent: action up

可以看到,如果view消费了这个touch(onTouchEvent返回true),则每次都会像父布局的onInterceptTouchEvent判断是否拦截了。
3. layout的onInterceptTouchEvent返回true,layout的onTouchEvent返回false

10-26 15:41:13.790 20170-20170/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action down10-26 15:41:13.790 20170-20170/com.whu.touchevent I/MyLayout: onTouchEvent: action down

拦截了后就不会向View传递了,但是并没有消费,所以只有down事件传递进去
4. layout的onInterceptTouchEvent和onTouchEvent都返回true

10-26 15:43:34.204 25353-25353/com.whu.touchevent I/MyLayout: onInterceptTouchEvent: action down10-26 15:43:34.204 25353-25353/com.whu.touchevent I/MyLayout: onTouchEvent: action down10-26 15:43:34.272 25353-25353/com.whu.touchevent I/MyLayout: onTouchEvent: action move10-26 15:43:34.287 25353-25353/com.whu.touchevent I/MyLayout: onTouchEvent: action move10-26 15:43:34.295 25353-25353/com.whu.touchevent I/MyLayout: onTouchEvent: action move10-26 15:43:34.304 25353-25353/com.whu.touchevent I/MyLayout: onTouchEvent: action move10-26 15:43:34.312 25353-25353/com.whu.touchevent I/MyLayout: onTouchEvent: action move10-26 15:43:34.320 25353-25353/com.whu.touchevent I/MyLayout: onTouchEvent: action move10-26 15:43:34.320 25353-25353/com.whu.touchevent I/MyLayout: onTouchEvent: action up

拦截并且消费,则down、move、up都被消费。

0 0
原创粉丝点击