Animacja skali obrazu systemu Android względem punktu środkowego


88

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.

Odpowiedzi:


76

Zapomnij o dodatkowe tłumaczenie, zestaw android:pivotX, android:pivotYdo połowy szerokości i wysokości i będzie skalować od środka obrazu.


2
pivotXi pivotYpowinien być ustawiony na połowę viewportWidthi viewportHeightbyć dokładnym.
toobsco42

162

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

30
dla mnie 50% wykonało pracę (bez p)
agamov

5
powinno być bez p, jeśli jest to odnoszące się do szerokości lub wysokości komponentu, do którego stosujesz animację. p odnosi się do elementu nadrzędnego komponentu, do którego jest stosowana animacja.
Alan Deep

Jak używać 50%pw plikach Java zamiast XML?
Nikola K.

6
nowy ScaleAnimation (1.0f, 1.2f, 1.0f, 1.2f, Animation.RELATIVE_TO_PARENT, 0.5f, Animation.RELATIVE_TO_PARENT, 0.5f);
Jiang Qi,

Jest też "a" - Animation.ABSOLUTE do ustawienia w px.
Zon

120

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);

1
@ T.Todua Jakie błędy? Zadaj nowe pytanie i podaj link do tej odpowiedzi.
Rohan Kandwal,

7

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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.