Mam ImageView i wykonuję na nim prostą animację skali. Bardzo standardowy kod.
Moje 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:
Kiedy obraz jest skalowany, nie jest skalowany od środka, ale od lewego górnego rogu. Innymi słowy, przeskalowana 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 to sposób skalowania animacji, a drugi obraz to sposób skalowania. Powinien utrzymać ten sam punkt środkowy. Próbowałem ustawić grawitację na obrazie, na pojemniku, ustawiając w lewo lub w prawo, zawsze skaluje się tak samo. Używam RelativeLayout na ekranie głównym, a ImageView znajduje się w innym RelativeLayout, ale próbowałem innych układów, bez zmian.
źródło
pivotX
ipivotY
powinien być ustawiony na połowęviewportWidth
iviewportHeight
być dokładnym.50%
jest środkiem 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%" android:pivotY="50%" android:duration="175"/>
źródło
50%p
w plikach Java zamiast XML?Odpowiedź udzielona przez @stevanveltema i @JiangQi jest idealna, 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);
źródło
Możesz użyć animacji translacji w swoim zestawie, aby to zrównoważyć. Prawdopodobnie będziesz musiał dostosować wartości toXDelta i toYDelta, aby uzyskać poprawne ustawienie, tak aby obraz był 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>
źródło