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に配置されていますが、他のレイアウトを試してみましたが、変更はありません。
追加の翻訳を忘れて、Android:pivotX
、Android:pivotY
を幅と高さの半分にし、画像の中心から拡大縮小します。
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"/>
@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);
セット内の移動アニメーションを使用して、それを相殺できます。おそらく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>