3

カスタムビュー内に次のコードがあります。これはScaleGestureDetectorであり、これでやりたいことは、画面をピンチしたときにビューの幅と高さを変更することですが、常にScaleFactorは1になる傾向があります。それを説明する方法を知っていますが、数秒間、ScaleFactor は 1 より低く/高くなり、その後再び 1 になります。私が言っていることは、logCat の出力で確認できます。

コード:

public class simpleOnScaleGestureListener extends SimpleOnScaleGestureListener {
    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        float ScaleFactor = 1.0f;
        ScaleFactor *= detector.getScaleFactor();

        // Don't let the object get too small or too large.
          ScaleFactor = Math.max(0.1f, Math.min(ScaleFactor, 5.0f));


        Log.d("ScaleFactor", "The ScaleFactor is "+ScaleFactor);

    return true;
    }
    @Override
    public void onScaleEnd(ScaleGestureDetector detector) {

    }
}

LogCat 出力:

05-29 19:37:48.019: D/ScaleFactor(7279): The ScaleFactor is 1.0247091
05-29 19:37:48.059: D/ScaleFactor(7279): The ScaleFactor is 1.0090069
05-29 19:37:48.069: D/ScaleFactor(7279): The ScaleFactor is 1.0268435
05-29 19:37:48.109: D/ScaleFactor(7279): The ScaleFactor is 1.0389019
05-29 19:37:48.119: D/ScaleFactor(7279): The ScaleFactor is 1.0236202
05-29 19:37:48.159: D/ScaleFactor(7279): The ScaleFactor is 1.0267988
05-29 19:37:48.169: D/ScaleFactor(7279): The ScaleFactor is 1.0133468
05-29 19:37:48.199: D/ScaleFactor(7279): The ScaleFactor is 1.0230283
05-29 19:37:48.219: D/ScaleFactor(7279): The ScaleFactor is 1.003792
05-29 19:37:48.599: D/ScaleFactor(7279): The ScaleFactor is 1.0
05-29 19:37:48.629: D/ScaleFactor(7279): The ScaleFactor is 1.2110677
05-29 19:37:48.639: D/ScaleFactor(7279): The ScaleFactor is 1.2486423
05-29 19:37:48.679: D/ScaleFactor(7279): The ScaleFactor is 1.0709958
05-29 19:37:48.689: D/ScaleFactor(7279): The ScaleFactor is 1.094618
05-29 19:37:49.229: D/ScaleFactor(7279): The ScaleFactor is 1.0
05-29 19:37:49.259: D/ScaleFactor(7279): The ScaleFactor is 1.2032005
05-29 19:37:49.269: D/ScaleFactor(7279): The ScaleFactor is 1.1687788
05-29 19:37:49.309: D/ScaleFactor(7279): The ScaleFactor is 1.0600644
05-29 19:37:49.319: D/ScaleFactor(7279): The ScaleFactor is 1.0608224
05-29 19:37:50.049: D/ScaleFactor(7279): The ScaleFactor is 1.0
05-29 19:37:50.079: D/ScaleFactor(7279): The ScaleFactor is 1.3738323
05-29 19:37:50.089: D/ScaleFactor(7279): The ScaleFactor is 1.1507335
05-29 19:37:50.129: D/ScaleFactor(7279): The ScaleFactor is 1.2026775
05-29 19:37:50.899: D/ScaleFactor(7279): The ScaleFactor is 1.0
05-29 19:37:50.929: D/ScaleFactor(7279): The ScaleFactor is 1.5862415
05-29 19:37:50.939: D/ScaleFactor(7279): The ScaleFactor is 1.1621073
05-29 19:37:52.559: D/ScaleFactor(7279): The ScaleFactor is 1.0
05-29 19:37:52.599: D/ScaleFactor(7279): The ScaleFactor is 1.0097717
05-29 19:37:52.599: D/ScaleFactor(7279): The ScaleFactor is 1.0186267
4

2 に答える 2

3

float ScaleFactor = 1.0f;

すべてのピンチの開始時にスケールをリセットしています。グローバル変数を試してください。

于 2016-05-16T13:13:31.227 に答える
2

このコードは Android Tutorial on Dragging and Scalingからのものですが、重要な違いが 1 つあります。「ScaleFactor」ローカル変数 (補足 - 変数名を小文字で始める慣例) は、インスタンス/メンバー変数mScaleFactorとして宣言されています。元のコードのクラス全体 (「m」は Android のメンバーを表します)。

意図した結果は、次の行です。

ScaleFactor *= detector.getScaleFactor();

ジェスチャの過程で個々のイベント スケール係数を意味のある値に累積しますが、あなたのバージョンでは onScale() を呼び出すたびにリセットされるため、個々のスケーリング イベントによって作成された瞬間的な値のみが表示されます。

それでも少し不可解な場合は、さまざまなタイプの変数とそのスコープの説明について、基本的な Java テキストを調べてください。

于 2013-07-23T19:29:38.397 に答える