0

アニメーション化しようとしているメニューがあります。マージンを変更して新しいメニューを挿入することで、メニューを分割しています。メニューを挿入したいときのアニメーションは次のとおりです。

    level3Height = level3Frame.getHeight();

    final int newBottomMargin = (int)(origBottomMargin + level3Height/2);
    final int newTopMargin = (int)(origTopMargin + level3Height/2);

    splitUp = new Animation() {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            LinearLayout.LayoutParams params =  (LinearLayout.LayoutParams) btnShopWireless.getLayoutParams();
            params.bottomMargin = (int)(newBottomMargin * interpolatedTime);
            btnShopWireless.setLayoutParams(params);
        }
    };

    joinDown = new Animation() {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            LinearLayout.LayoutParams params =  (LinearLayout.LayoutParams) btnShopWireless.getLayoutParams();
            params.bottomMargin = (int)(origBottomMargin * interpolatedTime);
            btnShopWireless.setLayoutParams(params);
        }
    };
    splitUp.setDuration(1000);
    splitUp.setInterpolator(new BounceInterpolator());

    joinDown.setDuration(500);
    joinDown.setInterpolator(new BounceInterpolator());

挿入されたメニューの高さを取得した後、アニメーションはビューを非常にうまく上に移動します。

    btnShopWireless.startAnimation(splitUp);

すべてうまくいきます!しかし....

挿入されたレベル メニューを削除して下に移動したい場合は、以下を使用しますが、アニメーションは発生しません。ビューはスムーズな動きをせずに、元の場所に単純に戻ります。

    btnShopWireless.startAnimation(joinDown);

setVisibility を VISIBLE onAnimationStart に設定し、setVisibility を GONE onAnimationEnd に設定する AnimationListeners を設定しました。彼らは仕事をしているので、アニメーションが呼び出されているか、joinDown の AnimationListeners 内で可視性が発生しないことがわかります。しかし、アニメーション化された動きの後退は決して起こりません。最初の splitUp しかアニメートできません。

2番目のアニメーションを機能させるために何が欠けているのか、誰にも手がかりがありますか?

4

1 に答える 1

0

私の問題が何であるかを理解しました-純粋なIQアンダーフロー。

元の余白は 0 でした。3 番目のメニューに収まるように約 190 dp に増やしました。メニューをまとめて 3 番目のメニューを削除するときは、元の余白に時間の値を掛けたものを変換に使用しました。どのくらいの時間またはどのインターポレーターであっても、originalMargin*interpolatedTime は常に 0 です。

それを修正するために、次の計算を使用しました。

    joinDown = new Animation() {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            LinearLayout.LayoutParams params =  (LinearLayout.LayoutParams) btnShopWireless.getLayoutParams();
            params.bottomMargin = (int)(newBottomMargin -(level3Height/2 * interpolatedTime)); 
            btnShopWireless.setLayoutParams(params);
        }
    };  
于 2013-09-05T19:42:27.467 に答える