Андроидальная анимация изображения по отношению к центральной точке

У меня есть 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, но я пробовал другие макеты, без изменений.

Ответ 1

Забудьте о дополнительном переводе, установите android:pivotX, android:pivotY на половину ширины и высоты и масштабируйте его от центра изображения.

Ответ 2

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"/>

Ответ 3

Ответ, предоставленный @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);

Ответ 4

Вы можете использовать анимацию перевода в своем наборе, чтобы компенсировать это. Вероятно, вам нужно будет настроить значения 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>