7

私のAndroidアプリではImageView、ユーザーが左/右/上/下に動かして画像(静的マップ)を隣接するものに変更できるようにしたい場所があります。さらに、ピンチズーム機能とマップ自体も欲しいです。

フリンジまたはピンチズームのいずれかを機能させることができますが、一緒にはできません。私はフリンジのためにGestureDetector(と一緒にSimpleOnGestureListener)を使用しています。そして、スケーリングにScaleGestureDetectorMaking Sense of Multitouchから)を使用しています。

難点は、タッチ操作でどのジェスチャ リスナーを呼び出すかを決定することです。これはコーディングの問題ではなく、ロジックの問題です。1 本の指のタッチ操作で、それは羽ばたきですか、それともスケールですか? ピンチズームを使用する場合でも、イニシャルMotionEventは ACTION_DOWN です。私は決定点として画像サイズ(本質的またはスケーリングされた?)を使用しようとしています。しかし、 ACTION_DOWN を使用した最初のスケーリング操作(画像サイズが固有であり、ズームしたい場合)は私を逃れているようです。

以前にこれに成功した人はいますか?

4

3 に答える 3

3

Ratatat の答えのアイデアは問題ありませんが、スクロールしたくない場合でもイベントをgestureDetectorに渡す必要があります。そうしないと、めちゃくちゃになります。

私はこのようなものになりました:

scaleDetector = new ScaleGestureDetector( ... );

gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        if (scaleDetector.isInProgress()) {
            // don't allow scrolling while scaling
            return false;
        }

        // handle scrolling

        return true;
    }
}

そして、の実装はaijの答えのonTouchEventようになるはずです:

boolean result = scaleDetector.onTouchEvent(event);
result = gestureDetector.onTouchEvent(event) || result;
return result || super.onTouchEvent(event);
于 2017-11-07T22:28:10.380 に答える
2

最後にリンクで答えを見つけました: http://code.google.com/p/android/issues/detail?id=42591

@Override
public boolean onTouchEvent(MotionEvent event) {
    boolean result = mScaleGestureDetector.onTouchEvent(event);

    // result is always true here, so I need another way to check for a detected scaling gesture
    boolean isScaling = result = mScaleGestureDetector.isInProgress();
    if (!isScaling) {
        // if no scaling is performed check for other gestures (fling, long tab, etc.)
        result = mCommonGestureDetector.onTouchEvent(event);
    }

    // some irrelevant checks...

    return result ? result : super.onTouchEvent(event);
}
于 2013-06-02T19:05:16.450 に答える