302

フラグメント間の遷移をアニメーション化しようとしています。私は次のAndroidフラグメントとアニメーションから答えを得ました

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);

DetailsFragment newFragment = DetailsFragment.newInstance();

ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");

// Start the animated transition.
ft.commit();

そして私のR.anim.slide_in_left

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate android:fromXDelta="50%p" android:toXDelta="0"
            android:duration="@android:integer/config_mediumAnimTime"/>
       <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
            android:duration="@android:integer/config_mediumAnimTime" />
</set>

しかし、私がこれを試したとき、それは示しました

02-08 16:27:37.961: ERROR/AndroidRuntime(1717): FATAL EXCEPTION: main
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): java.lang.RuntimeException: Unknown animator name: translate
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:129)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:126)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:93)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.animation.AnimatorInflater.loadAnimator(AnimatorInflater.java:72)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.FragmentManagerImpl.loadAnimator(FragmentManager.java:621)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:733)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:919)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.BackStackRecord.run(BackStackRecord.java:578)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1217)

何か案は?Honeycomb APIリファレンスを確認したところtranslate、そこにあります。私は何を取りこぼしたか?
フラグメント間の遷移をアニメーション化する他の方法はありますか?ありがとうございました

4

9 に答える 9

359

と同様に新しいandroid.animationフレームワーク(オブジェクトアニメーター)を使用する必要があります。FragmentTransaction.setCustomAnimationsFragmentTransaction.setTransition

setCustomAnimationsこれは、ApiDemosのFragmentHideShow.javaからの使用例です。

ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);

これがres/animator/fade_in.xmlの関連するアニメーターXMLです。

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:interpolator/accelerate_quad"
    android:valueFrom="0"
    android:valueTo="1"
    android:propertyName="alpha"
    android:duration="@android:integer/config_mediumAnimTime" />

<set>古いアニメーションフレームワークと同じように、を使用して複数のアニメーターを組み合わせることができることに注意してください。


編集:人々はスライドイン/スライドアウトについて尋ねているので、ここでそれについてコメントします。

スライドインとスライドアウト

もちろん、、、、およびプロパティをアニメーション化することもできますが、通常translationX、スライドには画面外との間でコンテンツをアニメーション化することが含まれます。私の知る限り、相対値を使用する遷移プロパティはありません。しかし、これはあなたがそれらを自分で書くことを妨げるものではありません。プロパティアニメーションでは、アニメーション化するオブジェクト(この場合はビュー)にgetterメソッドとsetterメソッドが必要なだけなので、次のように、ビューサブクラスに独自のメソッドとメソッドを作成できます。translationYxy getXFractionsetXFraction

public class MyFrameLayout extends FrameLayout {
    ...
    public float getXFraction() {
        return getX() / getWidth(); // TODO: guard divide-by-zero
    }

    public void setXFraction(float xFraction) {
        // TODO: cache width
        final int width = getWidth();
        setX((width > 0) ? (xFraction * width) : -9999);
    }
    ...
}

これで、次のように「xFraction」プロパティをアニメーション化できます。

res / animator / slide_in.xml

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator"
    android:valueFrom="-1.0"
    android:valueTo="0"
    android:propertyName="xFraction"
    android:duration="@android:integer/config_mediumAnimTime" />

アニメーション化するオブジェクトがその親と同じ幅でない場合、物事は完全に正しく見えないため、ユースケースに合わせてプロパティの実装を微調整する必要がある場合があることに注意してください。

于 2011-02-08T17:22:15.100 に答える
205

私はこのようにしました:

このメソッドを追加して、フラグメントアニメーションに置き換えます。

public void replaceFragmentWithAnimation(android.support.v4.app.Fragment fragment, String tag){
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_left);
    transaction.replace(R.id.fragment_container, fragment);
    transaction.addToBackStack(tag);
    transaction.commit();
}

リソースに関連付けられているanimフォルダーに4つのアニメーション追加 する必要があります。

enter_from_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:fromXDelta="-100%" android:toXDelta="0%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700"/>
</set>

exit_to_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:fromXDelta="0%" android:toXDelta="100%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700" />
</set>

enter_from_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:fromXDelta="100%" android:toXDelta="0%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700" />
</set>

exit_to_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:fromXDelta="0%" android:toXDelta="-100%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700"/>
</set>

出力:

ここに画像の説明を入力してください

その完了

于 2015-11-30T06:25:05.257 に答える
65

あなたがロリポップとそれ以降だけに自分自身を結びつける余裕があるなら、これはトリックをするようです:

import android.transition.Slide;
import android.util.Log;
import android.view.Gravity;
.
.
.
f = new MyFragment();
f.setEnterTransition(new Slide(Gravity.END));
f.setExitTransition(new Slide(Gravity.START));
getFragmentManager()
    .beginTransaction()
    .replace(R.id.content, f, FRAG_TAG)  // FRAG_TAG is the tag for your fragment
    .commit();

Kotlinバージョン:

f = MyFragment().apply {
    enterTransition = Slide(Gravity.END)
    exitTransition = Slide(Gravity.START)
}
fragmentManager
    .beginTransaction()
    .replace(R.id.content, f, FRAG_TAG)  // FRAG_TAG is the tag for your fragment
    .commit();

お役に立てれば。

于 2015-01-23T20:19:24.493 に答える
46

Nurikの答えは非常に役に立ちましたが、これを見つけるまで機能させることができませんでした。つまり、互換性ライブラリ(FragmentManagerの代わりにSupportFragmentManagerなど)を使用している場合、XMLアニメーションファイルの構文は異なります。

于 2013-03-07T18:30:01.127 に答える
28

フラグメント間のスライドイン/アウトアニメーションは次のとおりです。

FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.setCustomAnimations(R.animator.enter_anim, R.animator.exit_anim);
transaction.replace(R.id.listFragment, new YourFragment());
transaction.commit();

objectAnimatorを使用しています。

これがアニメーターサブフォルダー内の2つのxmlファイルです。

enter_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set>
     <objectAnimator
         xmlns:android="http://schemas.android.com/apk/res/android"
         android:duration="1000"
         android:propertyName="x"
         android:valueFrom="2000"
         android:valueTo="0"
         android:valueType="floatType" />
</set>

exit_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set>
    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="1000"
        android:propertyName="x"
        android:valueFrom="0"
        android:valueTo="-2000"
        android:valueType="floatType" />
</set>

それが誰かを助けることを願っています。

于 2014-10-29T09:08:13.420 に答える
25

他の人が捕まった場合は、トランザクションを構築するときに、replace/addを呼び出す前にsetCustomAnimationsが呼び出されるようにしてください。

于 2017-02-12T22:14:55.833 に答える
14

このシンプルで断食したソリューションを使用してみてください。Androidにはいくつかanimationのデフォルトがあります。

fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
fragmentManager.addOnBackStackChangedListener(this);
fragmentTransaction.replace(R.id.frame, firstFragment, "h");
fragmentTransaction.addToBackStack("h");
fragmentTransaction.commit();

出力:

ここに画像の説明を入力してください

于 2018-02-27T09:35:56.750 に答える
12

FragmentTransactionのAndroidSDK実装には、Animatorしばらくの間サポートライブラリが必要Animationです。理由は聞かないでください。ただし、strangelukのコメントの後、Android4.0.3コードとサポートライブラリを調べました。AndroidSDKの使用loadAnimator()とサポートライブラリの使用loadAnimation()

于 2013-04-20T03:17:26.487 に答える
0

この古い質問に最新の回答を追加するために、マテリアルデザインに移行した場合は、提供されているモーションライブラリを使用して簡単に行うことができます。詳細についてはhttps://material.io/develop/android/をご覧ください。テーマ/モーション

于 2021-07-08T17:52:07.507 に答える