1. ホーム
  2. android

[解決済み] View.setVisibility(GONE)のアニメーションはどのように行うのでしょうか?

2023-07-05 07:46:38

質問

私は Animation を作りたい。 View に設定されたとき GONE . ただ消えるのではなく View は「崩壊」するはずです。私はこれを ScaleAnimation で試してみましたが View は折りたたまれますが、レイアウトのスペースは Animation が停止(または開始)した後(または前)にのみスペースを変更します。

どうすれば Animation を作り、アニメーション中に下の View は、空白のスペースではなく、コンテンツの真下に留まるのでしょうか?

どのように解決するのですか?

アニメーションはビューのレンダリングマトリックスを変更するだけで、実際のサイズではないので、APIを通じてこれを行う簡単な方法はないようです。しかし、ビューが小さくなっていると LinearLayout が考えるように、負のマージンを設定することができます。

そこで、ScaleAnimationをベースにした独自のAnimationクラスを作成し、新しいマージンを設定し、レイアウトを更新するために"applyTransformation"メソッドをオーバーライドすることをお勧めします。このように...

public class Q2634073 extends Activity implements OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.q2634073);
        findViewById(R.id.item1).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        view.startAnimation(new MyScaler(1.0f, 1.0f, 1.0f, 0.0f, 500, view, true));
    }

    public class MyScaler extends ScaleAnimation {

        private View mView;

        private LayoutParams mLayoutParams;

        private int mMarginBottomFromY, mMarginBottomToY;

        private boolean mVanishAfter = false;

        public MyScaler(float fromX, float toX, float fromY, float toY, int duration, View view,
                boolean vanishAfter) {
            super(fromX, toX, fromY, toY);
            setDuration(duration);
            mView = view;
            mVanishAfter = vanishAfter;
            mLayoutParams = (LayoutParams) view.getLayoutParams();
            int height = mView.getHeight();
            mMarginBottomFromY = (int) (height * fromY) + mLayoutParams.bottomMargin - height;
            mMarginBottomToY = (int) (0 - ((height * toY) + mLayoutParams.bottomMargin)) - height;
        }

        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            super.applyTransformation(interpolatedTime, t);
            if (interpolatedTime < 1.0f) {
                int newMarginBottom = mMarginBottomFromY
                        + (int) ((mMarginBottomToY - mMarginBottomFromY) * interpolatedTime);
                mLayoutParams.setMargins(mLayoutParams.leftMargin, mLayoutParams.topMargin,
                    mLayoutParams.rightMargin, newMarginBottom);
                mView.getParent().requestLayout();
            } else if (mVanishAfter) {
                mView.setVisibility(View.GONE);
            }
        }

    }

}

いつもの注意点ですが、protectedメソッド(applyTransformation)をオーバーライドしているため、将来のAndroidのバージョンで動作することは保証されていません。