Android touchEvent事件传递

网上介绍touchevent事件非常多,这里通过一个简单的Demo来描述事件的传递和拦截过程。
请参考:http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html

先介绍touch event相关的知识点。

一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE…->ACTION_MOVE->ACTION_UP

android系统中的每个View以及它的子类都具有下面两个和TouchEvent处理密切相关的方法:

  1. public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent
  2. public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent

而每个ViewGroup以及它的子类都具有下面三个和TouchEvent处理密切相关的方法:

  1. public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent
  2. public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent
  3. public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent

当TouchEvent发生时, TouchEvent最先到达最顶层 view 的 dispatchTouchEvent ,然后由 dispatchTouchEvent 方法进行分发,首先交给这个 view 的 interceptTouchEvent 方法来决定是否要拦截这个事件,如果 interceptTouchEvent 返回 true ,也就是拦截掉了,则交给它的 onTouchEvent 来处理,如果 interceptTouchEvent 返回 false ,那么就传递给子 view ,由子 view 的 dispatchTouchEvent 再来开始这个事件的分发。如果事件传递到某一层的子 view 的 onTouchEvent 上了,这个方法返回了 false ,那么这个事件会从这个 view 往上传递,都是 onTouchEvent 来接收。而如果传递到最上面的 onTouchEvent 也返回 false 的话,这个事件就会“消失”,而且接收不到下一次事件。

注意:View及其子类不存在onInterceptTouchEvent方法。

源码分析请参考:
Android触摸屏事件派发机制详解与源码分析一(View篇)


Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)

接下来通过code来看看具体的传递过程。

在布局文件中定义个container

<FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

自定义一些ViewGroup和View,重写一些和事件相关的方法。

public class TouchViewGroup2 extends LinearLayout{

    public static final String TAG = "TouchEvent";

    public TouchViewGroup2(Context context) {
        super(context);
        ViewGroup.LayoutParams vl = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        setLayoutParams(vl);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_UP");
                break;
            case MotionEvent.ACTION_CANCEL:
                Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_CANCEL");
                break;
        }
        return super.onTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_UP");
                break;
            case MotionEvent.ACTION_CANCEL:
                Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_CANCEL");
                break;
        }
        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "TouchViewGroup2 dispatchTouchEvent action:ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d(TAG, "TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(TAG, "TouchViewGroup2 dispatchTouchEvent action:ACTION_UP");
                break;
            case MotionEvent.ACTION_CANCEL:
                Log.d(TAG, "TouchViewGroup2 dispatchTouchEvent action:ACTION_CANCEL");
                break;
        }
        return super.dispatchTouchEvent(ev);
    }
}
public class TouchViewGroup extends LinearLayout {

    public static final String TAG = "TouchEvent";

    public TouchViewGroup(Context context) {
        super(context);
        ViewGroup.LayoutParams vl = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        setLayoutParams(vl);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "TouchViewGroup onTouchEvent action:ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d(TAG, "TouchViewGroup onTouchEvent action:ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(TAG, "TouchViewGroup onTouchEvent action:ACTION_UP");
                break;
            case MotionEvent.ACTION_CANCEL:
                Log.d(TAG, "TouchViewGroup onTouchEvent action:ACTION_CANCEL");
                break;
        }
        return super.onTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "TouchViewGroup onInterceptTouchEvent action:ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d(TAG, "TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(TAG, "TouchViewGroup onInterceptTouchEvent action:ACTION_UP");
                break;
            case MotionEvent.ACTION_CANCEL:
                Log.d(TAG, "TouchViewGroup onInterceptTouchEvent action:ACTION_CANCEL");
                break;
        }
        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "TouchViewGroup dispatchTouchEvent action:ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d(TAG, "TouchViewGroup dispatchTouchEvent action:ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(TAG, "TouchViewGroup dispatchTouchEvent action:ACTION_UP");
                break;
            case MotionEvent.ACTION_CANCEL:
                Log.d(TAG, "TouchViewGroup dispatchTouchEvent action:ACTION_CANCEL");
                break;
        }
        return super.dispatchTouchEvent(ev);
    }
}
public class TouchView extends View {

    public static final String TAG = "TouchEvent";

    public TouchView(Context context) {
        super(context);
        ViewGroup.LayoutParams vl = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        setLayoutParams(vl);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "TouchView onTouchEvent action:ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d(TAG, "TouchView onTouchEvent action:ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(TAG, "TouchView onTouchEvent action:ACTION_UP");
                break;
            case MotionEvent.ACTION_CANCEL:
                Log.d(TAG, "TouchView onTouchEvent action:ACTION_CANCEL");
                break;
        }
        return super.onTouchEvent(event);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        int action = event.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "TouchView dispatchTouchEvent action:ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d(TAG, "TouchView dispatchTouchEvent action:ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(TAG, "TouchView dispatchTouchEvent action:ACTION_UP");
                break;
            case MotionEvent.ACTION_CANCEL:
                Log.d(TAG, "TouchView dispatchTouchEvent action:ACTION_CANCEL");
                break;
        }
        return super.dispatchTouchEvent(event);
    }

}

在Activity的onCreate方法中给container添加相应的ViewGroup和View。

ViewGroup vg = (ViewGroup)findViewById(R.id.container);
ViewGroup vg1 = new TouchViewGroup(this);
ViewGroup vg2 = new TouchViewGroup2(this);
View v1 = new TouchView(this);
vg.addView(vg1);
vg1.addView(vg2);
vg2.addView(v1);

在TouchView上滑动一下,查看一些log输出。

  • 上面的code不做任何修改。输出下面的log
D/TouchEvent(19634): TouchViewGroup dispatchTouchEvent action:ACTION_DOWN
D/TouchEvent(19634): TouchViewGroup onInterceptTouchEvent action:ACTION_DOWN
D/TouchEvent(19634): TouchViewGroup2 dispatchTouchEvent action:ACTION_DOWN
D/TouchEvent(19634): TouchViewGroup2 onInterceptTouchEvent action:ACTION_DOWN
D/TouchEvent(19634): TouchView dispatchTouchEvent action:ACTION_DOWN
D/TouchEvent(19634): TouchView onTouchEvent action:ACTION_DOWN
D/TouchEvent(19634): TouchViewGroup2 onTouchEvent action:ACTION_DOWN
D/TouchEvent(19634): TouchViewGroup onTouchEvent action:ACTION_DOWN

我们发现,只输出了ACTION_DOWN事件。因为TouchViewGroup、TouchViewGroup2和TouchView的相应方法都返回的是false,导致没有相应view消费此次事件,所以这个事件“消失”了。

  • 将TouchView的onTouchEvent返回值改为true。
@Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "TouchView onTouchEvent action:ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d(TAG, "TouchView onTouchEvent action:ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(TAG, "TouchView onTouchEvent action:ACTION_UP");
                break;
            case MotionEvent.ACTION_CANCEL:
                Log.d(TAG, "TouchView onTouchEvent action:ACTION_CANCEL");
                break;
        }
        //return super.onTouchEvent(event);
        return true;
    }

输出log:

D/TouchEvent(21567): TouchViewGroup dispatchTouchEvent action:ACTION_DOWN
D/TouchEvent(21567): TouchViewGroup onInterceptTouchEvent action:ACTION_DOWN
D/TouchEvent(21567): TouchViewGroup2 dispatchTouchEvent action:ACTION_DOWN
D/TouchEvent(21567): TouchViewGroup2 onInterceptTouchEvent action:ACTION_DOWN
D/TouchEvent(21567): TouchView dispatchTouchEvent action:ACTION_DOWN
D/TouchEvent(21567): TouchView onTouchEvent action:ACTION_DOWN
D/TouchEvent(21567): TouchViewGroup dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchViewGroup2 onInterceptTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchView dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchView onTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchViewGroup dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchViewGroup2 onInterceptTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchView dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchView onTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchViewGroup dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchViewGroup2 onInterceptTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchView dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchView onTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchViewGroup dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchViewGroup2 onInterceptTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchView dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchView onTouchEvent action:ACTION_MOVE
D/TouchEvent(21567): TouchViewGroup dispatchTouchEvent action:ACTION_UP
D/TouchEvent(21567): TouchViewGroup onInterceptTouchEvent action:ACTION_UP
D/TouchEvent(21567): TouchViewGroup2 dispatchTouchEvent action:ACTION_UP
D/TouchEvent(21567): TouchViewGroup2 onInterceptTouchEvent action:ACTION_UP
D/TouchEvent(21567): TouchView dispatchTouchEvent action:ACTION_UP
D/TouchEvent(21567): TouchView onTouchEvent action:ACTION_UP
  • 将TouchViewGroup2的onInterceptTouchEvent和onTouchEvent返回值改为true。
 @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_UP");
                break;
            case MotionEvent.ACTION_CANCEL:
                Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_CANCEL");
                break;
        }
        //return super.onTouchEvent(event);
        return true;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_UP");
                break;
            case MotionEvent.ACTION_CANCEL:
                Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_CANCEL");
                break;
        }
        //return super.onInterceptTouchEvent(ev);
        return true;
    }

输出log:

D/TouchEvent(21964): TouchViewGroup dispatchTouchEvent action:ACTION_DOWN
D/TouchEvent(21964): TouchViewGroup onInterceptTouchEvent action:ACTION_DOWN
D/TouchEvent(21964): TouchViewGroup2 dispatchTouchEvent action:ACTION_DOWN
D/TouchEvent(21964): TouchViewGroup2 onInterceptTouchEvent action:ACTION_DOWN
D/TouchEvent(21964): TouchViewGroup2 onTouchEvent action:ACTION_DOWN
D/TouchEvent(21964): TouchViewGroup dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(21964): TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE
D/TouchEvent(21964): TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(21964): TouchViewGroup2 onTouchEvent action:ACTION_MOVE
D/TouchEvent(21964): TouchViewGroup dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(21964): TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE
D/TouchEvent(21964): TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(21964): TouchViewGroup2 onTouchEvent action:ACTION_MOVE
D/TouchEvent(21964): TouchViewGroup dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(21964): TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE
D/TouchEvent(21964): TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(21964): TouchViewGroup2 onTouchEvent action:ACTION_MOVE
D/TouchEvent(21964): TouchViewGroup dispatchTouchEvent action:ACTION_UP
D/TouchEvent(21964): TouchViewGroup onInterceptTouchEvent action:ACTION_UP
D/TouchEvent(21964): TouchViewGroup2 dispatchTouchEvent action:ACTION_UP
D/TouchEvent(21964): TouchViewGroup2 onTouchEvent action:ACTION_UP

我们发现TouchViewGroup2的onInterceptTouchEvent只在第一次ACTION_DOWN时调用了,之后都没有调用。

  • 修改TouchView的onTouchEvent和TouchViewGroup2的onTouchEvent onInterceptTouchEvent方法。
@Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "TouchView onTouchEvent action:ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d(TAG, "TouchView onTouchEvent action:ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(TAG, "TouchView onTouchEvent action:ACTION_UP");
                break;
            case MotionEvent.ACTION_CANCEL:
                Log.d(TAG, "TouchView onTouchEvent action:ACTION_CANCEL");
                break;
        }
        //return super.onTouchEvent(event);
        return true;
    }
 @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_UP");
                break;
            case MotionEvent.ACTION_CANCEL:
                Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_CANCEL");
                break;
        }
        //return super.onTouchEvent(event);
        return true;
    }

    private int count = 0;
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_UP");
                break;
            case MotionEvent.ACTION_CANCEL:
                Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_CANCEL");
                break;
        }
        count++;
        if (count == 3) {
            return true;
        }
        return super.onInterceptTouchEvent(ev);
    }

输出log:

D/TouchEvent(22817): TouchViewGroup dispatchTouchEvent action:ACTION_DOWN
D/TouchEvent(22817): TouchViewGroup onInterceptTouchEvent action:ACTION_DOWN
D/TouchEvent(22817): TouchViewGroup2 dispatchTouchEvent action:ACTION_DOWN
D/TouchEvent(22817): TouchViewGroup2 onInterceptTouchEvent action:ACTION_DOWN
D/TouchEvent(22817): TouchView dispatchTouchEvent action:ACTION_DOWN
D/TouchEvent(22817): TouchView onTouchEvent action:ACTION_DOWN
D/TouchEvent(22817): TouchViewGroup dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(22817): TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE
D/TouchEvent(22817): TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(22817): TouchViewGroup2 onInterceptTouchEvent action:ACTION_MOVE
D/TouchEvent(22817): TouchView dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(22817): TouchView onTouchEvent action:ACTION_MOVE
D/TouchEvent(22817): TouchViewGroup dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(22817): TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE
D/TouchEvent(22817): TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(22817): TouchViewGroup2 onInterceptTouchEvent action:ACTION_MOVE
D/TouchEvent(22817): TouchView dispatchTouchEvent action:ACTION_CANCEL
D/TouchEvent(22817): TouchView onTouchEvent action:ACTION_CANCEL
D/TouchEvent(22817): TouchViewGroup dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(22817): TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE
D/TouchEvent(22817): TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE
D/TouchEvent(22817): TouchViewGroup2 onTouchEvent action:ACTION_MOVE
D/TouchEvent(22817): TouchViewGroup dispatchTouchEvent action:ACTION_UP
D/TouchEvent(22817): TouchViewGroup onInterceptTouchEvent action:ACTION_UP
D/TouchEvent(22817): TouchViewGroup2 dispatchTouchEvent action:ACTION_UP
D/TouchEvent(22817): TouchViewGroup2 onTouchEvent action:ACTION_UP

从log中可以看出,前两次的事件都是交付给TouchView的onTouchEvent处理。第三次由于TouchViewGroup2的onInterceptTouchEvent返回值为true,所以就向TouchView发送了ACTION_CANCEL事件。之后的事件都是传给了TouchViewGroup2的onTouchEvent处理。

暂时就先分析到这里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值