animation片段之间的过渡

我试图animation片段之间的过渡。 我从下面得到了答案
Android碎片和animation

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) 

有任何想法吗? 当我检查蜂窝API参考translate在那里。 我错过了什么?
有没有其他方法来animation片段之间的过渡? 谢谢

你需要用FragmentTransaction.setCustomAnimations以及FragmentTransaction.setTransition来使用新的android.animation框架(对象animation)。

以下是使用ApiDemos的FragmentHideShow.java中的 setCustomAnimations示例:

 ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out); 

以下是来自res / animator / fade_in.xml的相关animationXML:

 <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>组合多个animationdevise器,就像使用旧的animation框架一样。


编辑 :由于人们问滑入/滑出,我会在这里评论。

滑入和滑出

当然,您可以制作translationXtranslationYxy属性的animation,但通常幻灯片涉及将内容animation到屏幕外。 据我所知,没有任何使用相对值的转换属性。 但是,这并不妨碍你自己写。 请记住,属性animation只需要getter和setter方法在你animation的对象(在这种情况下是视图),所以你可以在你的视图子类上创build自己的 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'属性设置animation,如下所示:

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

请注意,如果您正在使用animation的对象的宽度与其父级的宽度不一致,那么您可能需要调整属性实现以适合您的使用情况。

我这样做了:

添加此方法以用animation replace片段

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

您必须在与资源 关联的 anim文件夹中添加 四个animation

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> 

输出:

在这里输入图像描述

完成了

努里克的回答是非常有帮助的,但是直到我发现这一点 ,我才得以运转 。 简而言之,如果您正在使用兼容性库(例如SupportFragmentManager而不是FragmentManager),则XMLanimation文件的语法将有所不同。

如果你有能力把自己和棒棒糖绑在一起,那么这似乎是个诀窍:

 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, getKey()) .commit(); 

希望这可以帮助。

以下是片段之间的幻灯片放映animation:

 FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.setCustomAnimations(R.animator.enter_anim, R.animator.exit_anim); transaction.replace(R.id.listFragment, new YourFragment()); transaction.commit(); 

我们正在使用一个objectAnimator。

这是animation子文件夹中的两个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> 

我希望能帮助别人。

FragmentTransaction的Android SDK实现需要一个Animator而支持库需要一个Animation ,不要问我为什么,但是在奇怪的评论之后我看了一下android 4.0.3的代码和支持库。 Android SDK使用loadAnimator()并且支持库使用loadAnimation()

对于任何被抓到的人,确保setCustomAnimations在构build事务时调用replace / add之前被调用。