Анимация масштаба изображения Android относительно центральной точки - PullRequest
79 голосов
/ 07 декабря 2011

У меня есть 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);

Проблема:

Когда изображение масштабируетсяэто не масштабируется от центра, но от верхнего левого угла.Другими словами, масштабированное изображение не имеет той же точки, что и центр, но имеет ту же самую верхнюю левую точку. Вот ссылка, объясняющая, что я имею в виду. Первое изображение показывает, как масштабируется анимация, а второе - как я хочу, чтобы оно масштабировалось.Он должен держать центральную точку одинаковой.Я попытался установить гравитацию на изображении, на контейнере, выравнивая влево или вправо, оно всегда масштабируется одинаково.Я использую RelativeLayout для основного экрана, и ImageView находится в другом RelativeLayout, но я пробовал другие макеты, без изменений.

Ответы [ 4 ]

147 голосов
/ 16 марта 2013

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

101 голосов
/ 03 марта 2015

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

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

6 голосов
/ 07 декабря 2011

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