21

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

OnTouchListenerを上に配置しようとしましたが、子がまたはの場合FrameLayoutは呼び出されません。私は戻ってみましたが、最後にも同じ結果が得られました-呼び出されることはありません。ScrollViewGalleryfalsetrueonTouch

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

4

1 に答える 1

28

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

このようなものを傍受するための通常の解決策は、dispatchTouchEvent(MotionEvent ev)次のように自分のアクティビティをオーバーライドすることです。

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

これのドキュメントはここにあります。ViewGroupそのメソッドを任意の(などFrameLayout)でオーバーライドすることもできることに注意してください

于 2012-08-28T22:36:40.373 に答える