web-dev-qa-db-ja.com

Android中心点に対する画像スケールアニメーション

ImageViewがあり、単純なスケールアニメーションを実行します。非常に標準的なコード。

私のscale_up.xml:

<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <scale Android:fromXScale="1"
           Android:fromYScale="1"
           Android:toXScale="1.2"
           Android:toYScale="1.2"
           Android:duration="175"/>
</set>

私のアニメーションコード:

Animation a = AnimationUtils.loadAnimation(this, R.anim.scale_up);
((ImageView) findViewById(R.id.circle_image)).startAnimation(a);

問題:

画像を拡大縮小するとき、中央からではなく、左上隅から拡大縮小します。言い換えると、画像のスケーリングされたバージョンは、中心と同じポイントを持ちませんが、同じ左上のポイントを持ちます。 ここに私が意味することを説明するリンクがあります。 最初の画像はアニメーションのスケーリング方法であり、2番目の画像はアニメーションのスケーリング方法です。中心点を同じに保つ必要があります。私は、画像上、コンテナ上で重力を設定し、左または右に揃えてみましたが、常に同じスケールになります。メイン画面にRelativeLayoutを使用しており、ImageViewは別のRelativeLayoutに配置されていますが、他のレイアウトを試してみましたが、変更はありません。

79

追加の翻訳を忘れて、Android:pivotXAndroid:pivotYを幅と高さの半分にし、画像の中心から拡大縮小します。

71
Steven Veltema

50%はアニメーション表示の中心です。

50%pは親の中心です

<scale
    Android:fromXScale="1.0"
    Android:toXScale="1.2"
    Android:fromYScale="1.0"
    Android:toYScale="1.2"
    Android:pivotX="50%p"
    Android:pivotY="50%p"
    Android:duration="175"/>
149
Jiang Qi

@stevanveltemaと@JiangQiが提供する答えは完璧ですが、コードを使用してスケーリングしたい場合は、私の答えを使用できます。

// first 0f, 1f mean scaling from X-axis to X-axis, meaning scaling from 0-100%
// first 0f, 1f mean scaling from Y-axis to Y-axis, meaning scaling from 0-100%
// The two 0.5f mean animation will start from 50% of X-axis & 50% of Y-axis, i.e. from center

ScaleAnimation fade_in =  new ScaleAnimation(0f, 1f, 0f, 1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
fade_in.setDuration(1000);     // animation duration in milliseconds
fade_in.setFillAfter(true);    // If fillAfter is true, the transformation that this animation performed will persist when it is finished.
view.startAnimation(fade_in);
103
Rohan Kandwal

セット内の移動アニメーションを使用して、それを相殺できます。おそらくtoXDeltaとtoYDeltaの値を微調整して、画像を中央に保持するように調整する必要があります。

<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <scale Android:fromXScale="1"
        Android:fromYScale="1"
        Android:toXScale="1.2"
        Android:toYScale="1.2"
        Android:duration="175"/>
    <translate
        Android:fromXDelta="0"
        Android:fromYDelta="0"
        Android:toXDelta="-20%"
        Android:toYDelta="-20%"
        Android:duration="175"/>
</set>
6
Aldryd