Resizing layouts programmatically (as animation)

2019-01-05 00:20发布

I want to resize some layouts in my Activity.

Here is the code of the main XML:

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/top"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:background="#3ee3e3" >
    </LinearLayout>

    <LinearLayout
        android:id="@+id/middle"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1">
    </LinearLayout>

    <LinearLayout
        android:id="@+id/bottom"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:background="#fe51e6" >
    </LinearLayout>
</LinearLayout>

As you can see, the top and bottom layouts height's is 0, and the middle layout covers all the place.

I want to programmatically decrease the middle layout size, while increase both the top and the bottom layout sizes, till all the layouts have the same height.

I want it to be look like an animation.

How should I do that?

Thanks

3条回答
【Aperson】
2楼-- · 2019-01-05 00:55

Also you can resize with Google's new Spring animations.

SpringAnimation creation method:

fun getSpringAnimation(view: View, springAnimationType: FloatPropertyCompat<View>, finalPosition: Float): SpringAnimation {
    val animation = SpringAnimation(view, springAnimationType )
    // create a spring with desired parameters
    val spring = SpringForce()
    spring.finalPosition = finalPosition
    spring.stiffness = SpringForce.STIFFNESS_VERY_LOW // optional
    spring.dampingRatio = SpringForce.DAMPING_RATIO_NO_BOUNCY // optional
    // set your animation's spring
    animation.spring = spring
    return animation
}

Usage (Resize to 80% of the original view size.)

 getSpringAnimation(view, SpringAnimation.SCALE_X, 0.8f).start()
 getSpringAnimation(view, SpringAnimation.SCALE_Y, 0.8f).start()
查看更多
forever°为你锁心
3楼-- · 2019-01-05 01:11

On Honeycomb (Android 3.0) there is the Animator and ObjectAnimator classes for smoother animations.

Read it here

Example on how to animate the move of a view group (LinearLayout) with a bounce interpolator.

BounceInterpolator bounceInterpolator = new BounceInterpolator();   
ObjectAnimator anim = ObjectAnimator.ofFloat(myViewGroup, "translationY", 0f, -200 );
anim.setInterpolator(bounceInterpolator);
anim.setDuration(1100).start();

This will trigger a smooth animation with a bounce effect and really move the views not like animation prior to Honeycomb. From the docs :

The previous animations changed the visual appearance of the target objects... but they didn't actually change the objects themselves.

查看更多
别忘想泡老子
4楼-- · 2019-01-05 01:13

I wrote a ResizeAnimation for a similar purpose. It's simple but costly.

/**
 * an animation for resizing the view.
 */
public class ResizeAnimation extends Animation {
    private View mView;
    private float mToHeight;
    private float mFromHeight;

    private float mToWidth;
    private float mFromWidth;

    public ResizeAnimation(View v, float fromWidth, float fromHeight, float toWidth, float toHeight) {
        mToHeight = toHeight;
        mToWidth = toWidth;
        mFromHeight = fromHeight;
        mFromWidth = fromWidth;
        mView = v;
        setDuration(300);
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        float height =
                (mToHeight - mFromHeight) * interpolatedTime + mFromHeight;
        float width = (mToWidth - mFromWidth) * interpolatedTime + mFromWidth;
        LayoutParams p = mView.getLayoutParams();
        p.height = (int) height;
        p.width = (int) width;
        mView.requestLayout();
    }
}
查看更多
登录 后发表回答