9

私は一般的なジェスチャーガイドの検出に従っています。android-support-v4.jarライブラリにリンクして get を取得しましたがGestureDetectorCompat、コードはガイドとまったく同じように見えますが、アクティビティではなくカスタム ビューでジェスチャを検出しています。

public class MyGlView extends GLSurfaceView {

    private GestureDetectorCompat m_gestureDetector = null;

    public MyGlView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }
    public MyGlView(Context context) {
        super(context);
        init(context);
    }
    private void init(Context context) {
        if (m_gestureDetector == null)
            m_gestureDetector = new GestureDetectorCompat(context, new MyGestureListener());

        setEGLContextClientVersion(2);
        setRenderer(new DrawSurfRenderer());
        setRenderMode(RENDERMODE_CONTINUOUSLY); 
    }

@Override
    public boolean onTouchEvent(MotionEvent event) {

        m_gestureDetector.onTouchEvent(event);      
        return super.onTouchEvent(event);
    }

public class MyGestureListener extends GestureDetector.SimpleOnGestureListener {

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
        {
            Log.e("", "OnScroll: deltaX=" + String.valueOf(e2.getX() - e1.getX()) + ", deltaY=" + String.valueOf(e2.getY() - e1.getY()));
            return true;
        }

        @Override
        public boolean onSingleTapUp(MotionEvent e)
        {
            Log.e("", "onSingleTapUp: X=" + String.valueOf(e.getX()) + ", Y=" + String.valueOf(e.getY()));
            return true;
        }

        @Override
        public void onLongPress(MotionEvent e)
        {
            Log.e("", "onLongPress: X=" + String.valueOf(e.getX()) + ", Y=" + String.valueOf(e.getY()));
        }
    }

タッチスクリーンで何をしても、onLongPress. 実際、高速タップ(画面にすばやく触れて離す)を行うと、onLongPress画面から指を離した後もわずかに表示されます(タップ検出の遅延が長いと思われます)。

キャッチは何ですか?

4

1 に答える 1

21

一般的なジェスチャーの検出に関する Android ガイドを引用します。

GestureDetector.OnGestureListener を使用するかどうかにかかわらず、true を返す onDown() メソッドを実装することをお勧めします。これは、すべてのジェスチャが onDown() メッセージで始まるためです。GestureDetector.SimpleOnGestureListener がデフォルトで行うように、onDown() から false を返すと、システムはジェスチャの残りを無視すると想定し、GestureDetector.OnGestureListener の他のメソッドは呼び出されません。これにより、アプリで予期しない問題が発生する可能性があります。onDown() から false を返す必要があるのは、ジェスチャ全体を本当に無視したい場合だけです。

メソッドを実装しなかったという事実は、onDown()副作用を引き起こしていました。

于 2014-03-21T07:36:20.690 に答える