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
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