安卓觸摸事件探究

參考,http://blog.csdn.net/chunqiuwei/article/details/41084921
/**
 * 第一步,dispatchTouchEvent,
 *          false:結束
 *          true:到onInterceptTouchEvent
 *              第二步:到onInterceptTouchEvent,
 *                  true:到viewGroup的onTouchEvent
 *                  false:到View dispatchTouchEvent
 *                      第三步:View dispatchTouchEvent
 *                          第四步:View onTouchEvent
 *                                true:view消費touch事件,viewGroup不能消費
 *                                false:viewGroup決定是否消費touch事件
 *
 *
 * @param ev
 * @return
 */
例子原型
MyLinearLayout包含一個MyView
狀況一,
MyLinearLayout,
    dispatchTouchEvent返回false
    onInterceptTouchEvent返回false
    onTouchEvent返回false
MyView
    dispatchTouchEvent返回false  
    onTouchEvent返回false
結果
03-18 15:26:00.726    6884-6884/com.example.myapp D/zyr﹕ A DIS ACTION_DOWN
03-18 15:26:00.726    6884-6884/com.example.myapp D/zyr﹕ A INT ACTION_DOWN
03-18 15:26:00.726    6884-6884/com.example.myapp E/zyr﹕ B DIS ACTION_DOWN
03-18 15:26:00.726    6884-6884/com.example.myapp E/zyr﹕ B TOU ACTION_DOWN
03-18 15:26:00.726    6884-6884/com.example.myapp D/zyr﹕ A TOU ACTION_DOWN
03-18 15:26:05.396    6884-6884/com.example.myapp D/zyr﹕ A DIS ACTION_DOWN
03-18 15:26:05.396    6884-6884/com.example.myapp D/zyr﹕ A INT ACTION_DOWN
03-18 15:26:05.396    6884-6884/com.example.myapp E/zyr﹕ B DIS ACTION_DOWN
03-18 15:26:05.396    6884-6884/com.example.myapp E/zyr﹕ B TOU ACTION_DOWN
03-18 15:26:05.396    6884-6884/com.example.myapp D/zyr﹕ A TOU ACTION_DOWN

結論app

由圖,沒有view消費本次觸摸事件,Action_Move事件根本傳遞不進來

狀況二,spa

MyLinearLayout,
    dispatchTouchEvent返回false
    onInterceptTouchEvent返回false
    onTouchEvent返回false
MyView
    dispatchTouchEvent返回false  
    onTouchEvent返回true

結果.net

03-18 15:36:33.641  10292-10292/com.example.myapp D/zyr﹕ A DIS ACTION_DOWN
03-18 15:36:33.641  10292-10292/com.example.myapp D/zyr﹕ A INT ACTION_DOWN
03-18 15:36:33.641  10292-10292/com.example.myapp E/zyr﹕ B DIS ACTION_DOWN
03-18 15:36:33.641  10292-10292/com.example.myapp E/zyr﹕ B TOU ACTION_DOWN
03-18 15:36:33.676  10292-10292/com.example.myapp D/zyr﹕ A DIS ACTION_MOVE
03-18 15:36:33.676  10292-10292/com.example.myapp D/zyr﹕ A INT ACTION_MOVE
03-18 15:36:33.676  10292-10292/com.example.myapp E/zyr﹕ B DIS ACTION_MOVE
03-18 15:36:33.676  10292-10292/com.example.myapp E/zyr﹕ B TOU ACTION_MOVE
03-18 15:36:33.691  10292-10292/com.example.myapp D/zyr﹕ A DIS ACTION_MOVE
03-18 15:36:33.691  10292-10292/com.example.myapp D/zyr﹕ A INT ACTION_MOVE
03-18 15:36:33.691  10292-10292/com.example.myapp E/zyr﹕ B DIS ACTION_MOVE
03-18 15:36:33.691  10292-10292/com.example.myapp E/zyr﹕ B TOU ACTION_MOVE
03-18 15:36:33.711  10292-10292/com.example.myapp D/zyr﹕ A DIS ACTION_MOVE
03-18 15:36:33.711  10292-10292/com.example.myapp D/zyr﹕ A INT ACTION_MOVE
03-18 15:36:33.711  10292-10292/com.example.myapp E/zyr﹕ B DIS ACTION_MOVE
03-18 15:36:33.711  10292-10292/com.example.myapp E/zyr﹕ B TOU ACTION_MOVE
03-18 15:36:33.721  10292-10292/com.example.myapp D/zyr﹕ A DIS ACTION_MOVE
03-18 15:36:33.721  10292-10292/com.example.myapp D/zyr﹕ A INT ACTION_MOVE
03-18 15:36:33.721  10292-10292/com.example.myapp E/zyr﹕ B DIS ACTION_MOVE
03-18 15:36:33.721  10292-10292/com.example.myapp E/zyr﹕ B TOU ACTION_MOVE
03-18 15:36:33.721  10292-10292/com.example.myapp D/zyr﹕ A DIS ACTION_UP
03-18 15:36:33.721  10292-10292/com.example.myapp D/zyr﹕ A INT ACTION_UP
03-18 15:36:33.721  10292-10292/com.example.myapp E/zyr﹕ B DIS ACTION_UP
03-18 15:36:33.721  10292-10292/com.example.myapp E/zyr﹕ B TOU ACTION_UP

結論code

MyView消費ACTION_DOWN,以後ACTION_MOVE傳遞進來,消費ACTION_MOVE,ACTION_UP同理

 狀況三,blog

MyLinearLayout,
    dispatchTouchEvent返回false
    onInterceptTouchEvent返回false
    onTouchEvent返回true
MyView
    dispatchTouchEvent返回false  
    onTouchEvent返回true

結果事件

03-18 15:40:18.056  29163-29163/com.example.myapp D/zyr﹕ A DIS ACTION_DOWN
03-18 15:40:18.056  29163-29163/com.example.myapp D/zyr﹕ A INT ACTION_DOWN
03-18 15:40:18.056  29163-29163/com.example.myapp E/zyr﹕ B DIS ACTION_DOWN
03-18 15:40:18.056  29163-29163/com.example.myapp E/zyr﹕ B TOU ACTION_DOWN
03-18 15:40:18.076  29163-29163/com.example.myapp D/zyr﹕ A DIS ACTION_MOVE
03-18 15:40:18.076  29163-29163/com.example.myapp D/zyr﹕ A INT ACTION_MOVE
03-18 15:40:18.076  29163-29163/com.example.myapp E/zyr﹕ B DIS ACTION_MOVE
03-18 15:40:18.076  29163-29163/com.example.myapp E/zyr﹕ B TOU ACTION_MOVE
03-18 15:40:18.096  29163-29163/com.example.myapp D/zyr﹕ A DIS ACTION_MOVE
03-18 15:40:18.096  29163-29163/com.example.myapp D/zyr﹕ A INT ACTION_MOVE
03-18 15:40:18.096  29163-29163/com.example.myapp E/zyr﹕ B DIS ACTION_MOVE
03-18 15:40:18.096  29163-29163/com.example.myapp E/zyr﹕ B TOU ACTION_MOVE
03-18 15:40:18.111  29163-29163/com.example.myapp D/zyr﹕ A DIS ACTION_MOVE
03-18 15:40:18.111  29163-29163/com.example.myapp D/zyr﹕ A INT ACTION_MOVE
03-18 15:40:18.111  29163-29163/com.example.myapp E/zyr﹕ B DIS ACTION_MOVE
03-18 15:40:18.111  29163-29163/com.example.myapp E/zyr﹕ B TOU ACTION_MOVE
03-18 15:40:18.126  29163-29163/com.example.myapp D/zyr﹕ A DIS ACTION_MOVE
03-18 15:40:18.126  29163-29163/com.example.myapp D/zyr﹕ A INT ACTION_MOVE
03-18 15:40:18.126  29163-29163/com.example.myapp E/zyr﹕ B DIS ACTION_MOVE
03-18 15:40:18.126  29163-29163/com.example.myapp E/zyr﹕ B TOU ACTION_MOVE
03-18 15:40:18.131  29163-29163/com.example.myapp D/zyr﹕ A DIS ACTION_UP
03-18 15:40:18.131  29163-29163/com.example.myapp D/zyr﹕ A INT ACTION_UP
03-18 15:40:18.131  29163-29163/com.example.myapp E/zyr﹕ B DIS ACTION_UP
03-18 15:40:18.131  29163-29163/com.example.myapp E/zyr﹕ B TOU ACTION_UP

結論get

雖然MyLinearLayout的onTouch返回true,可是MyTouch也是返回true,因爲安卓觸摸事件傳遞是由上而下,可是消費觸摸事件是由下而上的,因此處於下面的MyView消費掉了觸摸事件,MyLinearLayout沒法消費

狀況四,原型

研究onInterceptTouchEventio

MyLinearLayout,
    dispatchTouchEvent返回false
    onInterceptTouchEvent返回true
    onTouchEvent返回false
MyView
    dispatchTouchEvent返回false  
    onTouchEvent返回true

結果class

03-18 15:44:37.701  20477-20477/com.example.myapp D/zyr﹕ A DIS ACTION_DOWN
03-18 15:44:37.701  20477-20477/com.example.myapp D/zyr﹕ A INT ACTION_DOWN
03-18 15:44:37.701  20477-20477/com.example.myapp D/zyr﹕ A TOU ACTION_DOWN

結論

 

雖然MyView的onTouch返回true,可是被MyLinearLayout攔截下來了(MyLinearLayout的onInterceptTouchEvent返回true),可是MyLinearLayout的onTouch返回false,即它並無消費這次觸摸事件,so,,,這次觸摸事件就此結束,固然Action_Move是沒有機會傳遞拉.

狀況五,

MyLinearLayout,
    dispatchTouchEvent返回false
    onInterceptTouchEvent
                       ACTION_DOWN,false
                       ACTION_MOVE,true
                       ACTION_UP,false
    onTouchEvent
                       ACTION_DOWN,false
                       ACTION_MOVE,true
                       ACTION_UP,false
MyView
    dispatchTouchEvent返回false  
    onTouchEvent返回true    

結果

03-18 16:09:36.241    8257-8257/com.example.myapp D/zyr﹕ A DIS ACTION_DOWN
03-18 16:09:36.241    8257-8257/com.example.myapp D/zyr﹕ A INT ACTION_DOWN
03-18 16:09:36.241    8257-8257/com.example.myapp E/zyr﹕ B DIS ACTION_DOWN
03-18 16:09:36.241    8257-8257/com.example.myapp E/zyr﹕ B TOU ACTION_DOWN
03-18 16:09:36.271    8257-8257/com.example.myapp D/zyr﹕ A DIS ACTION_MOVE
03-18 16:09:36.271    8257-8257/com.example.myapp D/zyr﹕ A INT ACTION_MOVE
03-18 16:09:36.296    8257-8257/com.example.myapp D/zyr﹕ A DIS ACTION_MOVE
03-18 16:09:36.296    8257-8257/com.example.myapp D/zyr﹕ A TOU ACTION_MOVE
03-18 16:09:36.296    8257-8257/com.example.myapp D/zyr﹕ A DIS ACTION_UP
03-18 16:09:36.296    8257-8257/com.example.myapp D/zyr﹕ A TOU ACTION_UP

結論

試着本身分析把.
相關文章
相關標籤/搜索