8

Android 4.0.4 を搭載した Samsung Galaxy Note 10.1 では、画面に 2 本の指を置いても は起動しGestureDetectorません(1 本の指では起動します)。OnGestureListener#onScrollこれは他のデバイスでもうまく機能します。私のアプリケーションでは、少なくとも 2 本の指が関係している場合にのみスクロールを有効にしたいと考えています。

これは、現象を再現するビューの実装です。

public class MyView extends View {

    GestureDetector scrollGestureDetector;

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);

        scrollGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onScroll(final MotionEvent e1, final MotionEvent e2, final float distanceX, final float distanceY) {
                System.out.println("SCROLL " + distanceX + ", " + distanceY);
                return true;
            }
        });
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        scrollGestureDetector.onTouchEvent(event);
        return true;
    }
}

この動作は既知/文書化/要求されていますか? 既知の回避策はありますか?

4

1 に答える 1

20

次のように、にもう 1 つのメソッドを実装する必要がありonDownます。GestureDetector.SimpleOnGestureListener

scrollGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onScroll(final MotionEvent e1, final MotionEvent e2, final float distanceX, final float distanceY) {
            System.out.println("SCROLL " + distanceX + ", " + distanceY);
            return true;
        }

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

    });

このドキュメントこのガイドによると:

タップが発生すると、それをトリガーした down MotionEvent で通知されます。これは、ダウン イベントごとにすぐにトリガーされます。他のすべてのイベントは、これによって先行される必要があります。

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

である必要があるreturn trueためonDown、それonScrollがトリガーされます。

于 2014-08-20T10:24:45.530 に答える