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

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