0

ScaleGestureDetectorを使用してビューsetScaleXとメソッドをスケーリングしようとしています。setScaleYビューを5〜7倍に拡大縮小したい場合は、問題なく機能します。しかし、元のビューよりも20〜30大きいビューが必要になるという大きな問題があります。ScaleGestureDetectorはビューの現在のスケールを考慮しないため、無限にスケーリングすることはできません。onScaleBeginは起動されません。

ScaleGestureDetectorソースコードの次の行が原因であると確信しています。

if (!mInProgress && span >= mMinSpan &&
       (wasInProgress || Math.abs(span - mInitialSpan) > mSpanSlop)) {
        ...
        mInProgress = mListener.onScaleBegin(this);
}

ScaleGestureDetectorを使用してビューを20〜30倍にスケーリングする簡単な方法はありますか、それともAndroid用のカスタムスケール検出器がありますか?

4

2 に答える 2

1

あなたが何を望んでいるのかわかりません。ScaleGestureDetectorユーザーのタッチイベントを単にスケールファクターに変換します。

倍率の使い方はあなた次第です。制限に直面している場合、制限はスケール値の使用方法にあります。つまり、コードはビューをスケーリングしているのであって、ではありませんScaleGestureDetector

上でコピーしたコードは、タッチイベントにタッチスロップを適用するだけなので、スケーリング用ではないタッチは検出されません。

于 2013-01-25T15:19:40.697 に答える
1

これは、スケーリングの実装を使用するのに非常に便利です。1 回のピンチ ズーム ジェスチャでビューを最大 20 倍に拡大するために使用します。

private final Matrix mMatrix = new Matrix();

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getPointerCount() == 2) {
        float scale = (float) Math.sqrt(getScaleX());
        float focalX = (event.getX(0) + event.getX(1)) / 2;
        float focalY = (event.getY(0) + event.getY(1)) / 2;
        mMatrix.setScale(scale, scale, focalX, focalY);
        event.transform(mMatrix);
        return mScaleGestureDetector.onTouchEvent(event);
    } 
    return false;
}

この場合、x と y の両方のスケールは等しくなります。異なるスケールを使用するには、setScale メソッドの 2 番目の引数を y 軸のスケールに変更するだけです。

于 2013-01-26T00:52:04.560 に答える