3

GestureDetector と拡張された SimpleOnGestureListener を備えた GLSurfaceView があります。サーフェス ビューで複数のアイテムをすばやくタップして選択できるようにする必要があります。onSingleTapConfirmed は遅すぎるため、タッチをすばやく検出するために onSingleTapUp をオーバーライドしました。ここでの問題は、サーフェス ビュー上の 2 つのアイテムが互いに近くにあり、ユーザーが一方をタップしてからもう一方をすばやくタップすると、最初のアイテムに対して onSingleTapUp メソッドが呼び出されますが、2 番目のアイテムに対しては呼び出されないことです。2 つ目は、オーバーライドされているかどうかに関係なく、onDoubleTap メソッドを呼び出します。

これを解決するために、単純に onDoubleTap メソッドをオーバーライドしないようにしました。また、オーバーライドされた onDoubleTap で何もせず、false を返そうとしました。どちらも問題を解決しません。2 回目のタップでは、onSingleTapUp メソッドはまだ呼び出されません。

onDoubleTap メソッドで 2 回目のタップを検出して、そこから項目を選択することにしました。問題は、onDoubleTap から返されるモーション イベントに「ダブルタップの最初のタップのダウン モーション イベント」が含まれていることです。- http://developer.android.com/reference/android/view/GestureDetector.OnDoubleTapListener.html

ダブルタップを無効にする方法、ダブルタップ時間を変更して発火しないようにする方法、ダブルタップ半径を非常に小さいものに変更する方法、または onDoubleTap メソッドで最初のタップ位置を取得する方法はありますか?

ここに私の SimpleOnGestureListener があります:

public class ViewGestureListener extends
    GestureDetector.SimpleOnGestureListener {

    private ViewRenderer renderer;
    private GLSurfaceView surfaceView;

    public ViewGestureListener(GLSurfaceView surfaceView,
        ViewRenderer renderer) {
        this.renderer = renderer;
        this.surfaceView = surfaceView;
    }

    // Pan
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
        float distanceY) {
        renderer.pan(distanceX, distanceY);
        surfaceView.requestRender();
        return true;
    }

    // Double touch and release
    @Override
    public boolean onDoubleTap(MotionEvent e) {
        // Note: e.getX() doesn't return the second tap's location!
        renderer.singleTouch(e.getX(), e.getY());
        surfaceView.requestRender();
        return true;
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        renderer.singleTouch(e.getX(), e.getY());
        surfaceView.requestRender();
        return true;
    }
}

ありがとう、マット

4

3 に答える 3

2

この投稿の作成者を助けるには遅すぎるかもしれませんが、同じ問題に直面したので、疑問に思っている他の人のための答えを次に示します.

答え:

次のメソッドをオーバーライドする必要があります。これにより、2 回目のタップの down、move、up イベントが提供されます。

onDoubleTapEvent(MotionEvent e)

2 番目のタップの UP モーションが必要な場合は、次のようにします。

onDoubleTapEvent(MotionEvent e) {
         if(e.getAction() != MotionEvent.ACTION_UP) {
                return false;  // Don't do anything for other actions
         }


         // YOUR CODE HERE

         return true;
}

幸運を!/カルロス

于 2016-09-25T18:40:27.710 に答える