Animacja skalowania obrazu Androida względem punktu środkowego

Mam ImageView i wykonuję do niego prostą animację w skali. Bardzo standardowy kod.

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>

Mój kod animacji:

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

Problem:

Gdy obraz skaluje się nie od środka, ale od lewego górnego rogu. Innymi słowy, skalowana wersja obrazu nie ma tego samego punktu co środek, ale ma ten sam lewy górny punkt. Oto link, który wyjaśnia, co mam na myśli. pierwszy obraz jest jak animacja skaluje, a drugi obraz jest taki, jak chcę, aby skalował. Powinien zachować punkt środkowy taki sam. Próbowałem ustawić grawitację na obrazie, na pojemniku, wyrównując w lewo lub w prawo, zawsze skaluje się tak samo. Używam RelativeLayout dla głównego ekranu i ImageView znajduje się w innym RelativeLayout, ale próbowałem innych układów, bez zmian.

Author: Onik, 2011-12-07

4 answers

Zapomnij o dodatkowym tłumaczeniu, Ustaw android:pivotX, android:pivotY do połowy szerokości i wysokości i będzie skalować się od środka obrazu.

 65
Author: Steven Veltema,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-03 22:07:08

50% Jest Centrum animowanego widoku.

50%p Jest Centrum rodzica

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

 133
Author: Jiang Qi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-07 10:18:51

Odpowiedź udzielona przez @ stevanveltema i @ JiangQi są idealne, ale jeśli chcesz skalować za pomocą kodu, możesz użyć mojej odpowiedzi.

// 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);
 86
Author: Rohan Kandwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-03 11:21:55

Możesz użyć animacji translate w swoim zestawie, aby to zrównoważyć. Prawdopodobnie będziesz musiał dostosować wartości toXDelta i toYDelta, aby uzyskać je dobrze, aby utrzymywały obraz wyśrodkowany.

<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>
 5
Author: Aldryd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-07 02:09:58