我试图为两个片段做一个简单的翻译动画。一个从右侧进入,另一个向左侧进入。我的最小SDK是14.会发生转换,但没有实际的动画。在动画xml中指定的时间之后,片段才会交换。所以动画时间正在受到尊重,但没有实际的翻译。
我的片段动画代码是:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(R.animator.enter_from_right, R.animator.exit_to_left);
fragmentTransaction.replace(android.R.id.content, termsFragment);
fragmentTransaction.commit();
fragmentManager.executePendingTransactions();
我的动画xml文件是(enter_from_right):
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXDelta="100%"
android:toXDelta="0%"
android:duration="1000" />
</set>
和exit_to_left:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXDelta="0%"
android:toXDelta="-100%"
android:duration="1000"/>
</set>
答案 0 :(得分:8)
看起来你混淆了两个动画框架,android.animation
和android.view.animation
(是的,令人困惑)。
你的XML动画是两者之间的混合体。您可以设置android.animation.ObjectAnimator
或android.view.animation.Animation
:请参阅here和here以供参考。在这个特殊情况下,我认为你正在寻找一个简单的翻译动画,它属于后者,更老,更简单的类(和链接)。
所以:
<objectAnimator>
标记更改为<translate>
; animator
文件夹移至anim
资源文件夹,并使用R.anim
进行调用。我建议阅读链接的官方文档,该主题非常明确。基本上,对于简单的平移/旋转/ alpha动画,最好在res / anim文件夹中使用视图动画(<translate>, <rotate>, <scale>, <alpha>
)。
属性动画(如res / animator中的<objectAnimator>
)是一个更强大的工具,您宁愿用于复杂情况。
通过一些研究,我发现setCustomAnimations()
的行为更加令人困惑。
如果您使用的是支持库,setCustomAnimations()
只接受简单的动画对象(例如<translate>
)。在这种情况下,一切都应该有效,您只需将getFragmentManager()
更改为getSupportFragmentManager()
。
如果您不使用支持库,setCustomAnimations()
只接受属性动画(例如<objectAnimator>
)。
在第二种情况下,您的简单动画变得非常困难(请参阅here和here以供参考)。
你可以:
使用其中一个默认过渡:
FragmentTransaction t = getFragmentManager().beginTransaction();
t.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); or
t.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); or
t.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); or
尝试在<objectAnimator>
资源文件夹中使用非常糟糕的res/animator
:
<objectAnimator
android:propertyName="translationX"
android:duration="1000"
android:valueFrom="1000"
android:valueTo="0"
android:valueType="floatType"/>
这很糟糕,因为你需要在像素中指定一个值(这里我放1000),这样在不同的设备上看起来会有所不同。但也许对于快速翻译而言,这不是一个真正的问题。