フラグメント間の遷移をアニメートしようとしています。私は以下から答えを得ました
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
をチェックしたときにそこにあります。私は何を取りこぼしたか?
フラグメント間の遷移をアニメートする方法は他にありますか?ありがとうございました
Android.animation
とFragmentTransaction.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:人々がスライドイン/スライドアウトについて質問しているので、ここでコメントします。
translationX
、translationY
、x
、および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" />
アニメートしているオブジェクトがその親と同じ幅でない場合、物事があまり良く見えないので、ユースケースに合わせてプロパティの実装を微調整する必要があるかもしれません。
私はこのようにしました:
このmethodをfragmentにAnimationsに追加する:
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>
出力:
完了しました。
あなたがロリポップとそれ以降のものに自分自身を結びつける余裕があるならば、これはトリックをするようです:
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();
お役に立てれば。
Nurik の答えはとても役に立ちましたが、 これを見つけるまでうまくいきませんでした つまり、互換性ライブラリ(FragmentManagerの代わりにSupportFragmentManagerなど)を使用している場合、XMLアニメーションファイルの構文は異なります。
これがフラグメント間のスライドイン/アウトアニメーションです。
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>
それが誰かに役立つことを願っています。
他の誰かに遭遇した場合は、トランザクションの構築時にreplace/addを呼び出す前にsetCustomAnimationsが呼び出されるようにしてください。
FragmentTransactionのAndroid SDK実装はAnimator
を必要としていますが、サポートライブラリはAnimation
を必要としています。 Android SDKはloadAnimator()
を使用し、サポートライブラリはloadAnimation()
を使用します
このシンプルで断食の解決策を使ってみてください。 Androidはいくつかのデフォルトのanimation
sを提供しています。
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();
出力: