1. ホーム
  2. アンドロイド

[解決済み】フラグメント間の遷移をアニメーション化する

2022-03-30 15:28:10

質問

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

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)

何か思い当たることはありますか?ハニカムのAPIリファレンスを確認したところ translate があります。何を見落としたのでしょうか?

他にフラグメント間の遷移をアニメーション化する方法はないのでしょうか? ありがとうございます。

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

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

以下は setCustomAnimations をApiDemosの フラグメントハイドショー(FragmentHideShow.java) :

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

そして以下は、関連するアニメーター XML です。 res/animator/fade_in.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> 古いアニメーションフレームワークでできたのと同じように。


EDIT : スライドイン/スライドアウトについて質問されているので、ここでコメントします。

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

をアニメーション化することはもちろん可能です。 translationX , translationY , x および y プロパティがありますが、一般的にスライドは画面外との間でコンテンツをアニメーションさせることを含みます。私の知る限り、相対値を使用するトランジション・プロパティは存在しません。しかし、これは自分で記述することを妨げるものではありません。プロパティのアニメーションは、アニメーションさせるオブジェクト(この場合はビュー)のゲッターとセッターのメソッドを必要とするだけであることを忘れないでください。 自分で 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" />

アニメートするオブジェクトの幅が親と同じでない場合、見た目が悪くなるので、使用するケースに合わせてプロパティの実装を調整する必要があるかもしれません。