我正在尝试为两个 fragment 制作一个简单的翻译动画。一个从右边进来,一个从左边出去。我的最小 SDK 是 14。发生的是过渡,但没有实际的动画。在动画 xml 中指定的时间之后, fragment 就会交换。所以尊重动画时间,但没有实际翻译。
我的 fragment 动画代码是:
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>
最佳答案
看起来您混淆了两个动画框架,android.animation
和 android.view.animation
(是的,这很困惑)。
您的 XML 动画是两者的混合体。要么你设置一个 android.animation.ObjectAnimator
或 android.view.animation.Animation
:见here和 here以供引用。在这种特殊情况下,我认为您正在寻找一个简单的翻译动画,它属于后者,更早,更简单的类(和链接)。
所以:
- 更改
<objectAnimator>
标记为<translate>
; - 将您的文件从
animator
文件夹到anim
资源文件夹,并使用R.anim
调用它.
我建议阅读链接的官方文档,其中对这个主题非常清楚。基本上,对于简单的平移/旋转/alpha 动画,最好使用 res/anim 文件夹中的 View 动画 ( <translate>, <rotate>, <scale>, <alpha>
)。
属性动画(如 res/animator 中的 <objectAnimator>
)是一种更强大的工具,您更愿意将其用于复杂情况。
通过一些研究,我发现 setCustomAnimations()
有一个更令人困惑的行为。
如果您使用支持库,setCustomAnimations()
只接受简单的动画对象(比如你的 <translate>
)。在那种情况下,一切都应该有效,您只需要更改 getFragmentManager()
至 getSupportFragmentManager()
.
如果您不使用支持库,setCustomAnimations()
只接受属性动画(如 <objectAnimator>
)。
在第二种情况下,您的简单动画变得非常难以实现(请参阅 here 和 here 以供引用)。
您可以:
- 切换到支持库,如果您的开发不处于早期阶段,这可能会很无聊,并使用支持 fragment 管理器;
- 做一些关于 objectAnimators 和翻译的工作——有很多问题,我只是在上面链接了一个;
使用其中一种默认转换:
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),这样在不同的设备上看起来会有所不同。但也许对于快速翻译来说这不是真正的问题。
关于Android fragment 翻译动画不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28388466/