40

フラグメントの削除をアニメーション化したい。

私は試した:

getSupportFragmentManager().beginTransaction()
    .setCustomAnimations(R.anim.push_down_in, R.anim.push_up_out)
    .remove(myFragment)
    .commit();

しかし、フラグメントは消えるだけです。

out アニメーションは「replace」でしか再生されないことに気付いたので、フラグメントを次のように空のフラグメントに置き換えようとしました。

getSupportFragmentManager()
    .beginTransaction()
    .setCustomAnimations(R.anim.push_down_in, R.anim.push_up_out)
    .replace(viewId, new Fragment())
.commit();

しかし、それはまだ消えるだけです。

では、フラグメントの削除をアニメーション化するにはどうすればよいですか?

4

12 に答える 12

19

私はそれを考え出した。

終了ビューは開始ビューのキャンバスでアニメーション化されるため、開始キャンバスがない場合、アニメーション用のキャンバスはありません。

アニメーションを表示するには、常に置換を使用し、同じサイズの入力フラグメントを出力フラグメントと同じサイズで使用する必要がありました。アニメーションが終了したら、新しいフラグメントのビューを非表示に設定します。

于 2012-12-22T01:09:36.360 に答える
13

このカスタム アニメーションを fragmentTransaction に設定することで、削除をアニメーション化できます。

        fragmentTransaction.setCustomAnimations(R.anim.right_in, R.anim.defff,R.anim.defff,R.anim.right_out);

3 番目と 4 番目のパラメーターは、フラグメントを削除するためのものです。

于 2015-09-07T09:52:30.413 に答える
2

次のフラグメントの挿入ポイントの前に空のフラグメントに置き換え、次のフラグメントの挿入を (200 ミリ秒) 遅らせて、空のフラグメントの終了アニメーションを再生できるようにすることで、問題が解決しました。

これは、終了アニメーションで空のフラグメントを挿入するコードです。

getSupportFragmentManager()
                        .beginTransaction()
                        .setCustomAnimations(R.anim.exit, R.anim.pop_exit)
                        .replace(R.id.fragmentLayout, new Fragment())
                        .commit();

終了.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="0"
               android:toXDelta="-100%"
               android:interpolator="@android:anim/accelerate_interpolator"
               android:duration="200"/>

</set>

pop_exit.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="0"
               android:toXDelta="100%"
               android:interpolator="@android:anim/accelerate_interpolator"
               android:duration="200"/>

</set>
于 2016-02-14T08:59:09.807 に答える
2

Zoltish answer からインスピレーションを得ました。これが私の実装です:

1.このメソッドをフラグメント内に追加すると、フラグメントが画面から左にアニメーション化されます。

public void animateOut()
{
    TranslateAnimation trans=new TranslateAnimation(0,-300*Utils.getDensity(getActivity()), 0,0);
    trans.setDuration(150);
    trans.setAnimationListener(new Animation.AnimationListener() {

        @Override
        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            // TODO Auto-generated method stub
            ((BetsActivty)getActivity()).removeFrontFragmentAndSetControllToBetting();
        }
    });
    getView().startAnimation(trans);
}

onAnimationEnd() 内のメソッドは、次のようにフラグメントを削除します。

getSupportFragmentManager().beginTransaction().
        remove(getSupportFragmentManager().findFragmentById(R.id.fragment_container)).commit();

2.アクティビティの onBack() からフラグメントの animateOut を呼び出します。

乾杯

ところで、私の getDensity() は次のとおりです。

public static int getDensity(Context context)
{
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    return (int)metrics.density;
}

それを使用して、現在実行中のデバイスの DP 値を計算します。

于 2015-01-12T06:48:04.643 に答える
1

@hugocが言った理由

終了ビューは開始ビューのキャンバスでアニメーション化されるため、開始キャンバスがない場合、アニメーション用のキャンバスはありません。

アニメーションを表示するには、常に置換を使用し、同じサイズの入力フラグメントを出力フラグメントと同じサイズで使用する必要がありました。アニメーションが終了したら、新しいフラグメントのビューを非表示に設定します。

以下は実際のコードです:

FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.setCustomAnimations(R.anim.slide_in_bottom, R.anim.slide_out_top);
    transaction.hide(removeFragment).add(R.id.fragment_container,addFragment).commit();
    transaction = manager.beginTransaction();
    transaction.remove(removeFragment).commit();
于 2016-01-31T17:07:50.997 に答える
0

何を入力しますか:
表示する必要があるのは新しいフラグメントです

どのような出口:
非表示にする必要があるのは現在のフラグメントです

何 popEnter:
表示する必要があるのは前のフラグメントです

何 popExit:
非表示にする必要があるのは現在のフラグメントです

これらのアニメーションを使用するには、show または hide トランザクション コマンドを対象にする必要があります。終了アニメーションは、削除/置換手順では機能しません。

于 2016-11-30T05:43:35.993 に答える