Ответ 1
Забудьте о дополнительном переводе, установите android:pivotX
, android:pivotY
на половину ширины и высоты и масштабируйте его от центра изображения.
У меня есть ImageView, и я делаю ему просто масштабную анимацию. Очень стандартный код.
My 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);
Проблема:
Когда изображение масштабируется, оно не масштабируется от центра, а в верхнем левом углу. Другими словами, масштабированный вариант изображения не имеет той же точки, что и центр, но имеет ту же самую верхнюю левую точку. Здесь ссылка, которая объясняет, что я имею в виду. Первое изображение - это то, как анимация масштабируется, а второе изображение - как я хочу, чтобы он масштабировался. Он должен сохранять центральную точку одинаковой. Я попытался настроить гравитацию на изображении, на контейнере, выравнивая влево или вправо, он всегда масштабируется одинаково. Я использую 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>