android触摸事件分发机制

一直对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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章