Animazione della scala dell'immagine Android rispetto al punto centrale


88

Ho un ImageView e gli faccio una semplice animazione in scala. Codice molto standard.

Il mio 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>

Il mio codice di animazione:

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

Il problema:

Quando l'immagine viene ridimensionata, non viene ridimensionata dal centro, ma dall'angolo in alto a sinistra. In altre parole, la versione in scala dell'immagine non ha lo stesso punto del centro, ma ha lo stesso punto in alto a sinistra. Ecco un collegamento che spiega cosa intendo. La prima immagine è il modo in cui l'animazione viene ridimensionata e la seconda immagine è il modo in cui voglio che venga ridimensionata. Dovrebbe mantenere lo stesso punto centrale. Ho provato a impostare la gravità sull'immagine, sul contenitore, allineandola a sinistra oa destra, si ridimensiona sempre allo stesso modo. Sto usando RelativeLayout per la schermata principale e ImageView si trova in un altro RelativeLayout, ma ho provato altri layout, nessuna modifica.

Risposte:


76

Dimenticare la traduzione supplementare, insieme android:pivotX, android:pivotYalla metà della larghezza e l'altezza e scalerà dal centro dell'immagine.


2
pivotXe pivotYdovrebbe essere impostato a metà viewportWidthe viewportHeightper essere esatti.
toobsco42

162

50% è il centro della visualizzazione animata.

50%p è il centro del genitore

<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
per me il 50% ha fatto il lavoro (senza p)
agamov

5
dovrebbe essere senza p se è relativo alla larghezza o all'altezza del componente a cui stai applicando l'animazione. p si riferisce al genitore del componente a cui stai applicando l'animazione.
Alan Deep

Come si usa 50%pnei file Java, invece che in XML?
Nikola K.

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

C'è anche una "a" - Animation.ABSOLUTE da impostare in px.
Zon

120

La risposta fornita da @stevanveltema e @JiangQi è perfetta, ma se vuoi ridimensionare usando il codice, puoi usare la mia risposta.

// 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 Quali errori? Poni una nuova domanda e ricollega a questa risposta.
Rohan Kandwal

7

Puoi usare l'animazione di traduzione nel tuo set per compensarlo. Probabilmente avrai bisogno di modificare i valori toXDelta e toYDelta per farlo bene in modo che mantenga l'immagine centrata.

<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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.