web-dev-qa-db-ja.com

親がonTouchイベントをキャッチして処理し、子供に渡す

Androidタッチイベントを処理して少し混乱しました。理解したところから、タッチイベントはルートビューに送信され、子に渡されます。FrameLayoutFragmentのコンテナです。最初のフラグメントビューはScrollView、2番目のビューはGallery(Horizo​​ntalListView)の一種で、最後のビューもFrameLayout。レイアウト内のフラグメントは毎回1つだけです。アプリで使用するために、画面上でユーザーのスワイプを識別することを目的としています。スワイプをカウントし、何回かスワイプした後で何かを実行したいのです。

OnTouchListenerFrameLayoutの上に配置しようとしましたが、子がScrollViewまたはGalleryのときに呼び出されません。 falsetrueの最後にonTouchを返そうとしましたが、同じ結果が得られました-呼び出されることはありません。

どうすればできますか?タッチイベントを「透過的に」処理し、タッチしなかったようにそれらを渡したいだけです。

20
Elad92

私の理解では、それは実際には別の方向に進んでいます。子ビューは最初に(一種の)イベントをトリガーします。ルートビューは、dispatchTouchEvent()を呼び出してイベントを子のonTouchEvent()に伝えます。次に、子がtrueまたはfalseを返すかどうかに応じて、親のonTouchEvent()が呼び出されます。 。

このようなものをインターセプトするための通常の解決策は、次のようなアクティビティでdispatchTouchEvent(MotionEvent ev)をオーバーライドすることです。

@Override
public boolean dispatchTouchEvent (MotionEvent ev) {
  // Do your calcluations
  return super.dispatchTouchEvent(ev);
}

このドキュメントは here です。 ViewGroupFrameLayoutなど)でそのメソッドをオーバーライドすることもできます。

26
JRaymond