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.
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.
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"/>
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);
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>
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