web-dev-qa-db-ja.com

プログラムによるレイアウトのサイズ変更(アニメーションとして)

アクティビティのレイアウトのサイズを変更したい。

メイン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>

ご覧のとおり、上部と下部のレイアウトの高さは0で、中央のレイアウトはすべての場所をカバーしています。

すべてのレイアウトの高さが同じになるまで、中央のレイアウトサイズをプログラムで小さくし、上部と下部の両方のレイアウトサイズを大きくしたいと思います。

アニメーションのように見せたいです。

どうすればいいですか?

ありがとう

44
dor506

同様の目的でResizeAnimationを作成しました。簡単ですが、費用がかかります。

/**
 * 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();
    }
}
96
faylon

Honeycomb(Android 3.0)には、スムーズなアニメーションのためのAnimatorおよびObjectAnimatorクラスがあります。

読んでください こちら

バウンス補間を使用してビューグループ(LinearLayout)の動きをアニメーション化する方法の例。

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

これにより、バウンス効果のある滑らかなアニメーションがトリガーされ、ハニカムの前のアニメーションとは異なるビューが実際に移動します。ドキュメントから:

以前のアニメーションは、ターゲットオブジェクトの外観を変更しました...しかし、実際にはオブジェクト自体は変更しませんでした。

4
Decoy

また、Googleの新しいSpringアニメーションでサイズを変更できます。

SpringAnimationの作成方法:

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
}

使用法(元のビューサイズの80%にサイズ変更します。)

 getSpringAnimation(view, SpringAnimation.SCALE_X, 0.8f).start()
 getSpringAnimation(view, SpringAnimation.SCALE_Y, 0.8f).start()
1
Mete