androidイベント伝達メカニズム及びオンインテットタッチイベント()とOnTouchEvent()詳細解三のACT ION_CANCEL事件とイベントフィードバック

7698 ワード

ANDROID事件伝達メカニズムとONINTERNET TOUCHEVEN()とONEUCHEVNT()の二の秘密と指導の物語を詳しく説明します。
ANDROID事件伝達メカニズムとONINTERNET TOUCHEVEN()とONEUCHEVEN()のまとめ
前の2つのブログはオンインテットTouchEventとOnTouchEventの処理の流れを話しました。
オリジナル作品、転載は出所を説明してください。 http://www.cnblogs.com/xiaoQLu/archive/2013/04/02/2994030.html
ACTION_CANCELイベントでは、公式文書では、現在のジェスチャーがリリースされていますので、他のイベントを受信することはありません。ACTIONに移動してください。UP同様に対応します。
いったいどのような状況がこの事件を引き起こしますか?現在のコントロール(サブコントロール、息子)が前駆イベント(ACT ION_MOVEまたはACTION_MOVE)を受信すると、その親コントロール(オヤジ)が突然介入し、イベントの伝達を遮断すると、現在のコントロールにACT ION_uが送られてきます。CANCELは、このイベントを受けた後、パイプコントロールがtrueまたはfalseに戻り、この動作が完了したと考えられています。親コントロールのOnTouchEventでは処理されません。その後のイベントは、dispatchEvent方式で直接親コントロールに転送されます。これは前の結論とはちょっと違っていますが、サブコントロールのOnTouchEventがfalseに戻ると、イベントが処理されていないことを示しています。親のコントロールに戻るということです。ここで訂正してください。ACT ION_だけです。DOWNイベントこそフィードバックできます。ACTION_MOVEとACT ION_UPイベントはACT IONをフォローします。DOWNイベント、ACT ION_。DOWNはどのコントロールで処理されていますか?後のイベントはここに伝えられています。親コントロールには投げられません。ACTION_。CANCELもフィードバックできません。もう一つのポイントは、タッチエリアの範囲の問題は、タッチエリアがサブコントロール内にある場合、父親コントロールがイベントの転送を中断していない場合、このイベントをパイプコントロールがブロックしていないかどうかは、サブコントロールのOnTouchEventに伝えられます。責任と見なされます。私が注文したのはあなたです。お父さんがブロックしていないので、彼が処理したくないと説明します。ここに来ました。止めようが止めまいが、あなたが解決してください。
結論:ACTION_CANCELイベントは、先駆イベントを受けた後、その後のイベントが親コントロールによってブロックされた場合に発生し、ワンタッチイベントのイベントが親コントロールにフィードバックされるのはACT ION_だけです。DOWNイベント中
実例説明:LineearView 1は親コントロール、LayoutView 2はサブコントロール、クリックエリアはLayoutView 2で、親コントロールのoneInterceptTouchEvent方法はACT ION_にあります。DOWNの時にはイベントをブロックしていませんでしたが、ACTION_MOVEの時にいきなり手を入れて、イベントをブロックすると、サブコントロールにACT ION_uが送られてきます。CANCEL
 
 
public class LayoutView1 extends LinearLayout {

    private final String TAG = "LayoutView1";

    public LayoutView1(Context context, AttributeSet attrs) {
        super(context, attrs);
        Log.d(TAG, TAG);
    }

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

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        switch (action) {
        case MotionEvent.ACTION_DOWN:
            Log.d(TAG, "1:onTouchEvent action:ACTION_DOWN");
            break;
        case MotionEvent.ACTION_MOVE:
            Log.d(TAG, "1:onTouchEvent action:ACTION_MOVE");
            break;
        case MotionEvent.ACTION_UP:
            Log.d(TAG, "1:onTouchEvent action:ACTION_UP");
            break;
        case MotionEvent.ACTION_CANCEL:
            Log.d(TAG, "1:onTouchEvent action:ACTION_CANCEL");
            break;
        }
        return true;
    }
}
public class LayoutView2 extends LinearLayout {
    private final String TAG = "LayoutView2";   

    public LayoutView2(Context context, AttributeSet attrs) {
       super(context, attrs);
       Log.d(TAG,TAG);
    }

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

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
       int action = ev.getAction();
       switch(action){
       case MotionEvent.ACTION_DOWN:
           Log.d(TAG,"2:onTouchEvent action:ACTION_DOWN");
           //return false;
           break;
       case MotionEvent.ACTION_MOVE:
           Log.d(TAG,"2:onTouchEvent action:ACTION_MOVE");
           return false;
           //break;
       case MotionEvent.ACTION_UP:
           Log.d(TAG,"2:onTouchEvent action:ACTION_UP");
           break;
       case MotionEvent.ACTION_CANCEL:
           Log.d(TAG,"2:onTouchEvent action:ACTION_CANCEL");
           break;
       }     
       return true;
    } 
}
分からないダウンロードのソースコードがあります。運行してみます。結果を見てください。
ソースのダウンロード:http://files.cnblogs.com/xiaoQLu/MotionEventTest.rar