我正在尝试为片段之间的过渡设置动画。我从以下 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时。我错过了什么? 有没有其他方法可以动画片段之间的过渡?谢谢
translate
您需要使用新的android.animation框架(对象动画师)FragmentTransaction.setCustomAnimations以及FragmentTransaction.setTransition.
android.animation
FragmentTransaction.setCustomAnimations
FragmentTransaction.setTransition
这是一个使用setCustomAnimationsApiDemos 的 FragmentHideShow.java 的示例:
setCustomAnimations
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>,就像使用旧动画框架一样。
<set>
编辑 :由于人们在询问滑入/滑出,我将在这里对此发表评论。
您当然可以为、、 和属性设置动画translationX,但通常幻灯片涉及在屏幕外设置动画内容。据我所知,没有任何使用相对值的转换属性。但是,这并不妨碍您自己编写它们。请记住,属性动画只需要您正在制作动画的对象(在本例中为视图)上的 getter 和 setter 方法,因此您可以在视图子类上 创建自己的* 和方法,如下所示:translationY``x``y *getXFraction``setXFraction
translationX
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" />
请注意,如果您在其中制作动画的对象与其父对象的宽度不同,那么事情看起来就不太正确,因此您可能需要调整您的属性实现以适合您的用例。