フラグメント間の遷移をアニメーション化しようとしています。次の回答から得られました
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.setCustomAnimations
FragmentTransaction.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
次のように、ビュー サブクラスに独自のおよびメソッドを作成できます。x
y
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" />
アニメーション化するオブジェクトの幅が親と同じでない場合は、見た目がおかしくなるので、使用ケースに合わせてプロパティの実装を微調整する必要がある場合があります。