Android image scale animation relative to center point

AndroidAndroid LayoutAndroid AnimationScale

Android Problem Overview


I have an ImageView and I do a simple scale animation to it. Very standard code.

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>

My animation code:

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

The problem:

When the image scales it doesn't scale from the center, but from the top left corner. In other words, the scaled version of the image doesn't have the same point as the center, but it has the same top-left point. Here's an image that explains what I mean:

How the animation scales How I want it

The first image is how the animation scales and the second image is how I want it to scale. It should keep the center point the same. I have tried setting up gravity on the image, on the container, aligning left or right, it always scales the same.

I'm using RelativeLayout for the main screen and ImageView is located into another RelativeLayout, but I tried other layouts, no change.

Android Solutions


Solution 1 - Android

50% is center of animated view.

50%p is center of parent

http://schemas.android.com/apk/res/android">

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

Solution 2 - Android

The answer provided by @stevanveltema and @JiangQi are perfect but if you want scaling using code, then you can use my answer.

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

Solution 3 - Android

Forget the additional translation, set android:pivotX, android:pivotY to half the width and height and it will scale from the center of the image.

Solution 4 - Android

You can use the translate animation in your set to offset that. You'll probably need to tweak the toXDelta and toYDelta values to get it right so it keeps the image centered.

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTomislav MarkovskiView Question on Stackoverflow
Solution 1 - AndroidJiang QiView Answer on Stackoverflow
Solution 2 - AndroidRohan KandwalView Answer on Stackoverflow
Solution 3 - AndroidSteven VeltemaView Answer on Stackoverflow
Solution 4 - AndroidAldrydView Answer on Stackoverflow