Android-Bildskalierungsanimation relativ zum Mittelpunkt

Lesezeit: 3 Minuten

Benutzer-Avatar
Tomislav Markowski

Ich habe eine ImageView und mache eine einfache Skalierungsanimation dazu. Sehr Standardcode.

Meine 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>

Mein Animationscode:

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

Das Problem:

Wenn das Bild skaliert wird, wird es nicht von der Mitte aus skaliert, sondern von der oberen linken Ecke. Mit anderen Worten, die skalierte Version des Bildes hat nicht denselben Punkt wie die Mitte, aber sie hat denselben oberen linken Punkt. Hier ist ein Bild, das erklärt, was ich meine:

Wie die Animation skaliert
Wie ich es will

Das erste Bild zeigt, wie die Animation skaliert wird, und das zweite Bild, wie ich sie skalieren möchte. Der Mittelpunkt sollte gleich bleiben. Ich habe versucht, die Schwerkraft auf dem Bild einzurichten, auf dem Container, links oder rechts auszurichten, es skaliert immer gleich.

Ich verwende RelativeLayout für den Hauptbildschirm und ImageView befindet sich in einem anderen RelativeLayout, aber ich habe andere Layouts ausprobiert, keine Änderung.

Benutzer-Avatar
Jiang Qi

50% ist das Zentrum der animierten Ansicht.

50%p ist das Zentrum der Eltern

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

  • für mich haben 50% den Job gemacht (ohne p)

    – aganov

    10. März 2014 um 11:59 Uhr

  • es sollte ohne p sein, wenn es relativ zur Komponentenbreite oder -höhe ist, auf die Sie die Animation anwenden. p bezieht sich auf das übergeordnete Element der Komponente, auf die Sie die Animation anwenden.

    – Alan Tief

    3. Januar 2015 um 15:52 Uhr

  • Wie benutzt man 50%p in Java-Dateien statt in XML?

    – Nikola K.

    13. Juli 2015 um 17:51 Uhr

  • new ScaleAnimation(1.0f,1.2f,1.0f,1.2f,Animation.RELATIVE_TO_PARENT,0.5f, Animation.RELATIVE_TO_PARENT,0.5f);

    – Jiang Qi

    14. Juli 2015 um 1:31 Uhr

  • Es gibt auch “a” – Animation.ABSOLUTE in px zu setzen.

    – Zon

    10. Juli 2018 um 12:23 Uhr

Die Antwort von @stevanveltema und @JiangQi ist perfekt, aber wenn Sie mithilfe von Code skalieren möchten, können Sie meine Antwort verwenden.

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

  • @T.Todua Welche Fehler? Bitte stellen Sie eine neue Frage und verlinken Sie zurück zu dieser Antwort.

    – Rohan Kandwal

    12. Januar 2017 um 10:36 Uhr

  • Was ist, wenn ich unendliche Wiederholungen für die Animation wie “` android:repeatCount=”infinite” android:repeatMode=”reverse” “` möchte

    – Ali Tamoor

    8. Februar 2021 um 11:19 Uhr


Benutzer-Avatar
Stefan Veltema

Vergiss die zusätzliche Übersetzung, set android:pivotX, android:pivotY auf die halbe Breite und Höhe und wird von der Mitte des Bildes aus skaliert.

  • pivotX und pivotY sollte auf die Hälfte eingestellt werden viewportWidth und viewportHeight um genau zu sein.

    – Etienne Lawlor

    20. September 2018 um 7:58 Uhr

Sie können die Übersetzungsanimation in Ihrem Set verwenden, um dies auszugleichen. Sie müssen wahrscheinlich die toXDelta- und toYDelta-Werte optimieren, um es richtig zu machen, damit das Bild zentriert bleibt.

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

1313800cookie-checkAndroid-Bildskalierungsanimation relativ zum Mittelpunkt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy