AndroidでのdispatchTouchEvent、onInterceptTouchEvent、onTouchEventの理解



Understanding Dispatchtouchevent



【順番】 http://blog.csdn.net/guitk/article/details/7057155

onInterceptTouchEventは、イベントが渡される方向を変更するために使用されます。方向を渡す決定は戻り値です。戻り値がfalseの場合、イベントは子コントロールに渡されます。戻り値がtrueの場合、イベントは現在のコントロールのonTouchEvent()に渡されます。これはInterceptと呼ばれます。



[tisa ps:これを使用する正しい方法は、このメソッド内でイベントをインターセプトする必要があるかどうかを判断してから戻ることだけです。インターセプトする必要がある場合でも、trueを直接返し、onTouchEventメソッドで処理する必要があります。 ]

onTouchEventはイベントを処理するために使用され、戻り値は現在のコントロールがこのイベントを消費するかどうかを決定します。特にACTION_DOWNイベントの場合、trueを返すということは、後続のイベントを処理したいということです。falseを返すということは、このイベントを気にせず、親クラスによって処理されるように返すことを意味します。



多分あなたはあなたが消費して差別化したかどうか尋ねなければなりません。とにかく、私はイベントの処理コードを書きましたか?答えは違います!たとえば、ACTION_MOVEまたはACTION_UPは、ACTION_DOWNが発生したに違いないという前提で発生します。 ACTION_DOWNを消費しない場合、システムはACTION_DOWNが発生していないと見なすため、ACTION_MOVEまたはACTION_UPをキャプチャできません。

onInterceptTouchEvent()とonTouchEvent()をオーバーライドしない場合(これらの戻り値はすべてfalseです)、上記のレイアウトの場合、MotionEventイベントの順序は次のとおりです。



コントロールのonInterceptTouchEvent()がtrueの値を返すと、切り捨てが発生し、イベントが現在のコントロールのonTouchEvent()に渡されます。 LayoutView2のonInterceptTouchEvent()の値をtrueに戻すと、配信プロセスは次のようになります。

LayoutView2のonInterceptTouchEvent()とonTouchEvent()を同時にtrueに設定すると、LayoutView2は渡されたイベントを消費し、後続のイベント(ACTION_MOVEまたはACTION_UPの後にACTION_DOWNが続くなど)はLayoutView2のonTouchEvent()に直接渡されます。他のコントロールに任意の機能を与えます。また、ACTION_CANCELイベントを子スペースに渡します。配信プロセスは次のようになります(ACTION_CANCELイベントは図に描かれていません)。

[tisa ps:全体として、onInterceptTouchEventはルートビューから渡され、onTouchEventは正反対です。 ]

【順番】 http://blog.csdn.net/cyp331203/article/details/41039635

Androidのタッチイベント配信プロセスで最も重要なことは、dispatchTouchEvent()、onInterceptTouchEvent()、およびonTouchEvent()メソッドです。これは初心者の悩みのひとつで、私も始めました。メモリのdispatchTouchEvent()、onInterceptTouchEvent()、およびonTouchEvent()の処理を記録します。

dispatchTouchEventはタッチイベントの配布を処理し、イベントは(ほとんどの場合)アクティビティのdispatchTouchEventで始まります。実施した

super.dispatchTouchEvent(ev)、イベントは下向きに配布されます。

onInterceptTouchEvent ViewGroupによって提供されるメソッドであり、デフォルトでfalseを返し、インターセプトに対してtrueを返します。

onTouchEvent ビューで提供されるメソッドであり、ViewGroupにもこのメソッドがあり、onInterceptTouchEventはビューで提供されません。ビューはデフォルトでtrueを返し、このイベントが消費されたことを示します。

ビューには、2つのコールバック関数があります。

[java] プレーンビュー コピー コード 画像
  1. 公衆ブールdispatchTouchEvent(MotionEvent ev);
  2. 公衆ブールonTouchEvent(MotionEvent ev)

ViewGroupには、次の3つのコールバック関数があります。

[java] プレーンビュー コピー コード 画像
  1. 公衆ブールdispatchTouchEvent(MotionEvent ev);
  2. 公衆ブールonInterceptTouchEvent(MotionEvent ev)
  3. 公衆ブールonTouchEvent(MotionEvent ev)

アクティビティには、2つのコールバック関数があります。

[java] プレーンビュー コピー コード 画像
  1. 公衆ブールdispatchTouchEvent(MotionEvent ev);
  2. 公衆ブールonTouchEvent(MotionEvent ev)



デフォルトでは、Androidでのイベント配信は最終ビューで受信されます。転送プロセスは、親レイアウトから子レイアウトへ、つまり、アクティビティからビューグループ、ビューへと行われます。デフォルトでは、ViewGroupは透過的な役割を果たします。 Androidでのイベント配信プロセス(矢印の方向)は次のとおりです。画像は次のとおりです。 [qiushuiqifei] 、ありがとうございました [qiushuiqifei] 整理する。

タッチイベントは、一連のACTION_DOWN、ACTION_MOVE..MOVE ... MOVE、最後のACTION_UP、タッチイベント、およびACTION_CANCELイベントです。イベントはACTION_DOWNから始まり、アクティビティのdispatchTouchEvent()は最初にACTION_DOWNを受け取り、それを実行します。super.dispatchTouchEvent(ev)、イベントは下向きに配布されます。

dispatchTouchEvent()はtrueを返し、後続のイベント(ACTION_MOVE、ACTION_UP)が再度渡されます。 falseが返された場合、dispatchTouchEvent()はACTION_UPまたはACTION_MOVEを受け取りません。

次の図は [EOE]

図1.ACTION_DOWNは消費されません

図2-1。 ACTION_DOWNはViewによって消費されます

図2-2。後続のACTION_MOVEとUPは、傍受されることなくVIEWに移動します。

図3.その後の傍受

図4ACTION_DOWNは最初から傍受されました

AndroidのタッチイベントはACTION_DOWNから始まります。

単指操作:ACTION_DOWN --- ACTION_MOVE ---- ACTION_UP

マルチフィンガー操作:ACTION_DOWN --- ACTION_POINTER_DOWN --- ACTION_MOVE--ACTION_POINTER_UP --- ACTION_UP。

【順番】 http://blog.csdn.net/stzy00/article/details/40378533

レイアウトファイルでは、3つのレイヤーがあり、1つはボタン、テキストビュー、その他の一般的なコンポーネント、2番目のレイヤーはネストされたRelativeLayout、3番目のレイヤーはLinearLayout、タッチスクリーンイベントは単なるものであると想定されています。 ACTION_DOWN、ACTION_MOVE、ACTION_UP。を押して画面を解放します。実際、イベントの配信はこれらの3つのレイヤーを通過しています。ここでは、その処理、それはまた、メモリの統合です。

まず、3つのメソッドdispatchHandEvent()、onInterceptTouchEvent()、およびonTouchEvent()は、ボタン、textview、LinearLayoutに関係なく、すべてのビューで使用できます。RelativeLayoutは最終的にView、ViewGroupから継承されるため、これら3つのメソッドにはそれぞれ独自のThereがあります。です。タッチダウンイベント(下-移動-上)の配信を担当するdispatchTouchEvent()、イベントのインターセプトを担当するonInterceptTouchEvent()、およびイベントの処理を担当するonTouchEvent()。

次に、これら3つのレイヤーのそれぞれの3つのメソッドがこのプロセスにどのように参加するかについて説明しましょう。

アクティビティから、指が画面を押すイベント、つまりACTION_DOWNが受信され、最初にLinearLayoutに到達し、LinearLayoutはdispatchTouchEvent()を呼び出し、dispatchTouchEvent()は通常、書き換えには使用されず、onInterceptTouchEvent()に自動的に配布されます。 、onInterceptTouchEvent(ACTION_DOWNがこのイベントを処理しないことを意味するfasleを返すが、代わりにそれを処理するために次のイベントに渡す場合、このイベントをRelativeLayoutの次のレイヤーに配布し続けます。同様に、onInterceptTouchEvent()のACTION_DOWNの場合それでもRelativeLayoutでfalseを返し、ここでTextViewに到達します。TextViewのonInterceptTouchEvent())がtrueを返す場合、イベントがそれ自体で処理されることを意味します。これは、イベントをインターセプトすることと同じです。処理時にtrueを返すと、イベント結果が逆に送信されます。アクティビティで、自分で処理するようにアクティビティに指示します。次に、次の2つのイベント、ACTION_MOVEとACTION_UPは、引き続きTextViewに渡され、処理されます。

最初のACTION_DOWNがRelativeLayoutで処理される場合(つまり、RelativeLayoutのonInterceptTouchEvent()がtrueを返し、それ自体のonTouchEvent()によって処理される場合、基になるTextViewはタッチイベントの配信に参加できず、その後にACTION_MOVEが続きます。およびACTION_UP、TextViewを渡すことはできません)。したがって、TOUCHアクションをインターセプトする場合は、onInterceptTouchEvent()で実行できます(いくつかのことを理解しましょう)。ACTION_DOWNがインターセプトされている限り、次のMOVEイベントとUPイベントは渡されず、MOVEのみをインターセプトします。イベントの場合、UPイベントは渡されません。ただし、どのビューがこのタッチイベントを処理するかに関係なく、最終処理の結果は逆にアクティビティに送信する必要があります。このようにして、画面上でのユーザーのアクションは、対応するフィードバックを取得します。

転載:https://www.cnblogs.com/clong2010/p/4541217.html