Android 片段翻译动画不工作

Android Fragment Translate Animation Not Working

我正在尝试为两个片段制作一个简单的翻译动画。一个从右边进来,一个从左边出去。我的最小 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>

看起来您混淆了两个动画框架,android.animationandroid.view.animation(是的,这很混淆)。

您的 XML 动画是两者的混合体。您可以设置 android.animation.ObjectAnimatorandroid.view.animation.Animation:请参阅 here and here 以供参考。在这种特殊情况下,我认为您正在寻找一个简单的翻译动画,它属于后者,更旧,更简单class(和link)。

所以:

  • <objectAnimator> 标签更改为 <translate>;
  • 将您的文件从 animator 文件夹移动到 anim 资源文件夹,然后使用 R.anim.
  • 调用它

我建议阅读官方文档 linked,其中对这个主题非常清楚。基本上,对于简单的平移/旋转/alpha 动画,最好使用 res/anim 文件夹中的视图动画 (<translate>, <rotate>, <scale>, <alpha>)。

属性 动画(如 res/animator 中的 <objectAnimator>)是一种更强大的工具,您更愿意在复杂情况下使用它。


通过一些研究,我发现 setCustomAnimations() 有一个更令人困惑的行为。

如果您使用支持库,setCustomAnimations() 只接受简单的动画对象(如您的 <translate>)。在那种情况下,一切都应该有效,您只需将 getFragmentManager() 更改为 getSupportFragmentManager().

如果您使用支持库,setCustomAnimations() 只接受属性 动画(如<objectAnimator>)。

在第二种情况下,您的简单动画变得非常难以制作(参见 here and here 以供参考)。

您可以:

  • 切换到支持库,如果您的开发不处于早期阶段,这可能会很无聊,并使用支持片段管理器;
  • 做一些关于 objectAnimators 和翻译的工作 - 有很多问题,我只是在上面 linked 一个;
  • 使用其中一种默认转换:

    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 
    
  • 尝试在您的 res/animator 资源文件夹中使用非常糟糕的 <objectAnimator>

    <objectAnimator
        android:propertyName="translationX"
        android:duration="1000"
        android:valueFrom="1000"
        android:valueTo="0"
        android:valueType="floatType"/>
    

这很糟糕,因为您需要指定一个以 像素为单位的值 (我在这里输入 1000),这样在不同的设备上看起来会有所不同。但也许对于快速翻译这不是真正的问题。