Android片段翻译动画不起作用

时间:2015-02-07 22:56:52

标签: android android-fragments android-animation

我试图为两个片段做一个简单的翻译动画。一个从右侧进入,另一个向左侧进入。我的最小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>

1 个答案:

答案 0 :(得分:8)

看起来你混淆了两个动画框架,android.animationandroid.view.animation(是的,令人困惑)。

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

所以:

  • <objectAnimator>标记更改为<translate>;
  • 将您的文件从animator文件夹移至anim资源文件夹,并使用R.anim进行调用。

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

属性动画(如res / animator中的<objectAnimator>)是一个更强大的工具,您宁愿用于复杂情况。


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

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

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

在第二种情况下,您的简单动画变得非常困难(请参阅herehere以供参考)。

你可以:

  • 切换到支持库,如果您的开发尚未处于早期阶段,这可能会很无聊,并使用支持片段管理器;
  • 做一些关于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),这样在不同的设备上看起来会有所不同。但也许对于快速翻译而言,这不是一个真正的问题。