Androidタッチイベントを処理して少し混乱しました。理解したところから、タッチイベントはルートビューに送信され、子に渡されます。FrameLayout
はFragment
のコンテナです。最初のフラグメントビューはScrollView
、2番目のビューはGallery
(HorizontalListView)の一種で、最後のビューもFrameLayout
。レイアウト内のフラグメントは毎回1つだけです。アプリで使用するために、画面上でユーザーのスワイプを識別することを目的としています。スワイプをカウントし、何回かスワイプした後で何かを実行したいのです。
OnTouchListener
をFrameLayout
の上に配置しようとしましたが、子がScrollView
またはGallery
のときに呼び出されません。 false
とtrue
の最後にonTouch
を返そうとしましたが、同じ結果が得られました-呼び出されることはありません。
どうすればできますか?タッチイベントを「透過的に」処理し、タッチしなかったようにそれらを渡したいだけです。
私の理解では、それは実際には別の方向に進んでいます。子ビューは最初に(一種の)イベントをトリガーします。ルートビューは、dispatchTouchEvent()
を呼び出してイベントを子のonTouchEvent()
に伝えます。次に、子がtrueまたはfalseを返すかどうかに応じて、親のonTouchEvent()
が呼び出されます。 。
このようなものをインターセプトするための通常の解決策は、次のようなアクティビティでdispatchTouchEvent(MotionEvent ev)
をオーバーライドすることです。
@Override
public boolean dispatchTouchEvent (MotionEvent ev) {
// Do your calcluations
return super.dispatchTouchEvent(ev);
}
このドキュメントは here です。 ViewGroup
(FrameLayout
など)でそのメソッドをオーバーライドすることもできます。