24

4つのボタンがあるレイアウトを想像してみてください

 _______________________________
|              |                |
|      A       |       B        |
|______________|________________|
|              |                |
|      C       |       D        |
|______________|________________|

レイアウト全体でフリングジェスチャを検出したいのですが、フリングが開始されたときにボタンが検出されません。

私が使用しているもの:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    gesturedetector= new GestureDetector(this, this);

    findViewById(R.id.touchContainer).setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.e("","TouchEvent");
            return gesturedetector.onTouchEvent(event);
        }
    });
}

クリック可能なアイテムがない場合は失敗しますが、クリック可能なアイテムからフリングを開始すると失敗します。

どうすればそれを解決できますか?完全な実用的な答えのために50ポイントの報奨金を提供する

4

1 に答える 1

27

これを実現する1つの方法は、次のメソッドをオーバーライドすることです。

public boolean onInterceptTouchEvent(MotionEvent event){
    super.onInterceptTouchEvent(event);
    ...

レイアウトコンテナ(たとえば、ViewGroup、またはボタンを保持しているもの)でこのメソッドをオーバーライドし、子(つまり、ボタン)falseによって消費されているタッチイベントを「インターセプト」するために、このメソッドから戻り続けることができます。Viewそのオーバーライドされたメソッド内で、sを使用してジェスチャ検出器オブジェクトを呼び出すことができますMotionEvent。このメソッドは、それ自体をターゲットとするイベントも「認識」します。つまりViewGroup、私が正しく覚えていれば、そのメソッド内からジェスチャ検出器を呼び出すだけで済み、そうすることで、ジェスチャ検出器は「すべてを参照」します。ボタンの上にあるかどうかに関係なく、イベント。したがって、ボタンの上から指をドラッグして、レイアウトの背景のあるポイントで終了すると、ジェスチャ検出器はスワイプ全体を認識します。ジェスチャ検出器にレイアウト自体のイベントをフィードする必要はありませんonTouchEvent()。これは、すでにイベントが表示されているためです。

2番目の方法:

これを使用したプロジェクトを見て、別の方法に切り替えたことに気づきました。私が実際に行ったことはView、親Activity(または含むViewGroup)が同じジェスチャ検出オブジェクトをそれらのすべての子に登録できるように、すべての子を設計したことですView(私の特別なそれぞれにViewと呼ばれるメソッドがありますregisterGestureDetector())。次に、子のオーバーライドされた「onTouchEvent()」で、に登録されているジェスチャ検出器にsViewを渡します。つまり、親のレイアウトとすべての子は、同じジェスチャ検出器を共有するだけです。MotionEventViewViewGroupView

これは少し面倒に聞こえるかもしれませんが、を使用して実行できることを考えると必要ありませんonInterceptTouchEvent()が、私のアプリケーションは、Viewタッチイベントやジェスチャに応答する必要があるという非常に複雑なルールを処理し、いくつかを適用することができましたアプリケーションに固有に必要な追加のロジック。ただし、私が使用したこれらの方法はどちらも、ここで同じ基本的な目的を達成します。MotionEventつまり、さまざまなをターゲットViewにしたを同じジェスチャ検出器オブジェクトに向けることです。

于 2012-02-07T19:00:02.207 に答える