web-dev-qa-db-ja.com

フラグメント間の遷移をアニメートする

フラグメント間の遷移をアニメートしようとしています。私は以下から答えを得ました
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をチェックしたときにそこにあります。私は何を取りこぼしたか?
フラグメント間の遷移をアニメートする方法は他にありますか?ありがとうございました

266

Android.animationFragmentTransaction.setCustomAnimationsで新しいFragmentTransaction.setTransitionフレームワーク(オブジェクトアニメータ)を使う必要があります。

これはApiDemosのsetCustomAnimationsを使う例です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>を使用して複数のアニメーターを組み合わせることができます。


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

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

translationXtranslationYx、およびyの各プロパティはもちろんアニメーション化できますが、一般的にスライドをスライドさせると、オフスクリーンとの間でコンテンツをアニメーション化できます。私の知る限りでは、相対値を使用する遷移プロパティはありません。しかし、これはあなたがそれらを自分で書くことを妨げるものではありません。プロパティアニメーションは、アニメーション化しているオブジェクト(この場合はビュー)に対して単にgetterメソッドとsetterメソッドを必要とするので、自分で作成することができますgetXFractionこのようにあなたのビューサブクラスのsetXFractionメソッド:

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" />

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

336
Roman Nurik

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

このmethodfragmentAnimationsに追加する:

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();
}

あなたは追加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>

出力:

enter image description here

完了しました

157
Hiren Patel

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

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

お役に立てれば。

49
scorpiodawg

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

47
strangeluck

これがフラグメント間のスライドイン/アウトアニメーションです。

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>

それが誰かに役立つことを願っています。

26
kirilv

他の誰かに遭遇した場合は、トランザクションの構築時にreplace/addを呼び出す前にsetCustomAnimationsが呼び出されるようにしてください。

20
Charlie

FragmentTransactionのAndroid SDK実装はAnimatorを必要としていますが、サポートライブラリはAnimationを必要としています。 Android SDKはloadAnimator()を使用し、サポートライブラリはloadAnimation()を使用します

12
sherpya

このシンプルで断食の解決策を使ってみてください。 Androidはいくつかのデフォルトのanimationsを提供しています。

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();

出力:

enter image description here

5
Gowthaman M