フラグメント間の遷移をアニメーション化する 質問する

フラグメント間の遷移をアニメーション化する 質問する

フラグメント間の遷移をアニメーション化しようとしています。次の回答から得られました
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そこにありました。何を見逃したのでしょうか?
フラグメント間の遷移をアニメーション化する他の方法はありますか?ありがとうございます

ベストアンサー1

だけでなく、新しい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 メソッドだけが必要であることに注意してください。そのため、translationY次のように、ビュー サブクラスに独自のおよびメソッドを作成できます。xy 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" />

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

おすすめ記事