android触摸事件分发机制

本文详细解析了Android系统的触控事件处理流程,包括dispatchTouchEvent、onInterceptTouchEvent及onTouchEvent等关键方法的作用机制,并通过具体示例展示了事件传递的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直对android的分发机制不是非常清楚,这次自己测试一下


先把测试结果贴上来:

默认的传递是这样的:

activity dispatchTouchEvent --> viewgroup dispatchTouchEvent --> viewgroup onInterceptTouchEvent --> view dispatchTouchEvent --> view onTouchEvent

--> viewgroup onTouchEvent --> activity onTouchEvent

可以这样理解:dispatchTouchEvent 事件分发 是负责自己和父容器的分发,如果返回为true 交给自己的onInterceptTouchEvent (view没有onInterceptTouchEvent  直接交给onTouchEvent),如果返回为false,则把事件交给父容器的onTouchEvent

onInterceptTouchEvent 事件拦截 是负责自己和子View的分发,如果返回为true 交给自己的onTouchEvent 如果为false,交给子view的dispatchTouchEvent 

需要注意的是,如果ACTION_DOWN被某view或者activity或者viewgroup消费,其后的一系类触摸事件都会传递到这个消费者中

继续改

viewgroup onInterceptTouchEvent 的ACTION_DOWN事件返回false,此时DOWN事件会交给子view的dispatchTouchEvent,然后子view的dispatchTouchEvent的DOWN事件返回true,子view的dispatchTouchEvent的MOVE事件返回false,我们知道,事件如果被View消费了,则不会继续往上传递,但是viewgroup的ontouchEvent却不能能接受的DOWN事件。可见事件的传递是一整套的,例如如果某个消费体消费了MOVE事件,则必定会消费DOWN事件,如果消费了DOWN事件,则必然会消费MOVE事件。


activity中:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    LogUtil.i("activity dispatchTouchEvent");
    switch (ev.getAction()){
        case MotionEvent.ACTION_DOWN:
            LogUtil.i("activity dispatchTouchEvent ACTION_DOWN");
            break;
        case MotionEvent.ACTION_MOVE:
            LogUtil.i("activity dispatchTouchEvent ACTION_MOVE");
            break;
        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_UP:
            LogUtil.i("activity dispatchTouchEvent ACTION_UP");
            break;
    }
    return super.dispatchTouchEvent(ev);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    LogUtil.i("activity onTouchEvent");
    switch (event.getAction()){
        case MotionEvent.ACTION_DOWN:
            LogUtil.i("activity onTouchEvent ACTION_DOWN");
            break;
        case MotionEvent.ACTION_MOVE:
            LogUtil.i("activity onTouchEvent ACTION_MOVE");
            break;
        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_UP:
            LogUtil.i("activity onTouchEvent ACTION_UP");
            break;
    }
    return super.onTouchEvent(event);
}

relativelatyout中:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    LogUtil.i("ralativelayout dispatchTouchEvent");
    switch (ev.getAction()){
        case MotionEvent.ACTION_DOWN:
            LogUtil.i("ralativelayout dispatchTouchEvent ACTION_DOWN");
            break;
        case MotionEvent.ACTION_MOVE:
            LogUtil.i("ralativelayout dispatchTouchEvent ACTION_MOVE");
            break;
        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_UP:
            LogUtil.i("ralativelayout dispatchTouchEvent ACTION_UP");
            break;
    }
    return super.dispatchTouchEvent(ev);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    LogUtil.i("ralativelayout onInterceptTouchEvent");
    switch (ev.getAction()){
        case MotionEvent.ACTION_DOWN:
            LogUtil.i("ralativelayout onInterceptTouchEvent ACTION_DOWN");
            break;
        case MotionEvent.ACTION_MOVE:
            LogUtil.i("ralativelayout onInterceptTouchEvent ACTION_MOVE");
            break;
        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_UP:
            LogUtil.i("ralativelayout onInterceptTouchEvent ACTION_UP");
            break;
    }
    return super.onInterceptTouchEvent(ev);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    LogUtil.i("ralativelayout onTouchEvent");
    switch (event.getAction()){
        case MotionEvent.ACTION_DOWN:
            LogUtil.i("ralativelayout onTouchEvent ACTION_DOWN");
            break;
        case MotionEvent.ACTION_MOVE:
            LogUtil.i("ralativelayout onTouchEvent ACTION_MOVE");
            break;
        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_UP:
            LogUtil.i("ralativelayout onTouchEvent ACTION_UP");
            break;
    }
    return super.onTouchEvent(event);
}
view中:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    LogUtil.i("view dispatchTouchEvent");
    switch (ev.getAction()){
        case MotionEvent.ACTION_DOWN:
            LogUtil.i("view dispatchTouchEvent ACTION_DOWN");
            break;
        case MotionEvent.ACTION_MOVE:
            LogUtil.i("view dispatchTouchEvent ACTION_MOVE");
            break;
        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_UP:
            LogUtil.i("view dispatchTouchEvent ACTION_UP");
            break;
    }
    return super.dispatchTouchEvent(ev);
}


@Override
public boolean onTouchEvent(MotionEvent event) {
    LogUtil.i("view onTouchEvent");
    switch (event.getAction()){
        case MotionEvent.ACTION_DOWN:
            LogUtil.i("view onTouchEvent ACTION_DOWN");
            break;
        case MotionEvent.ACTION_MOVE:
            LogUtil.i("view onTouchEvent ACTION_MOVE");
            break;
        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_UP:
            LogUtil.i("view onTouchEvent ACTION_UP");
            break;
    }
    return super.onTouchEvent(event);
}
打印出来的日志:

03-23 17:16:17.855 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity dispatchTouchEvent
03-23 17:16:17.855 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity dispatchTouchEvent ACTION_DOWN
03-23 17:16:17.865 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: ralativelayout dispatchTouchEvent
03-23 17:16:17.865 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: ralativelayout dispatchTouchEvent ACTION_DOWN
03-23 17:16:17.875 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: ralativelayout onInterceptTouchEvent
03-23 17:16:17.875 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: ralativelayout onInterceptTouchEvent ACTION_DOWN
03-23 17:16:17.875 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: view dispatchTouchEvent
03-23 17:16:17.875 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: view dispatchTouchEvent ACTION_DOWN
03-23 17:16:17.875 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: view onTouchEvent
03-23 17:16:17.875 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: view onTouchEvent ACTION_DOWN
03-23 17:16:17.875 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: ralativelayout onTouchEvent
03-23 17:16:17.885 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: ralativelayout onTouchEvent ACTION_DOWN
03-23 17:16:17.885 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity onTouchEvent
03-23 17:16:17.885 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity onTouchEvent ACTION_DOWN
03-23 17:16:17.885 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity dispatchTouchEvent
03-23 17:16:17.885 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity dispatchTouchEvent ACTION_MOVE
03-23 17:16:17.885 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity onTouchEvent
03-23 17:16:17.895 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity onTouchEvent ACTION_MOVE
03-23 17:16:17.895 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity dispatchTouchEvent
03-23 17:16:17.895 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity dispatchTouchEvent ACTION_UP
03-23 17:16:17.895 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity onTouchEvent
03-23 17:16:17.905 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity onTouchEvent ACTION_UP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值