Android 片段翻译动画不起作用

3
我正在尝试为两个片段执行简单的翻译动画。其中一个从右侧进入,而另一个则向左侧移出。我的最小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文件是(从右边进入):
<?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中不存在简单性、逻辑性和一致性等概念。 - RunLoop
1个回答

8
看起来你把两个动画框架搞混了,即android.animationandroid.view.animation(是的,它们很容易混淆)。
你的XML动画有点混合了这两者。你可以设置一个android.animation.ObjectAnimator或一个android.view.animation.Animation:请参考这里这里。在这种情况下,我认为你正在寻找一个简单的平移动画,它属于后者,较旧、较简单的类别(并链接)。所以:
- 将<objectAnimator>标签更改为<translate>; - 将文件从animator文件夹移动到anim资源文件夹,并使用R.anim进行调用。
我建议阅读官方文档,它非常清楚地阐述了这个问题。基本上,对于简单的平移/旋转/透明度动画,最好使用位于res/anim文件夹中的视图动画(<translate>,<rotate>,<scale>,<alpha>)。
属性动画(例如res/animator中的<objectAnimator>)是一种更强大的工具,你最好在复杂情况下使用它们。
通过一些研究,我发现setCustomAnimations()有一个更加混乱的行为。
如果你正在使用支持库,setCustomAnimations()只接受简单的动画对象(如你的<translate>)。在这种情况下,它应该可以正常工作,你只需要将getFragmentManager()改为getSupportFragmentManager()
如果你没有使用支持库,setCustomAnimations()只接受属性动画(如<objectAnimator>)。在这种情况下,你的简单动画变得相当难以实现(请参考这里这里)。你可以:
  • switch to support libraries, which can be boring if your development is not at an early stage, and use the support fragment manager;
  • do some work about objectAnimators and translations - there are lots of questions about, I just linked one above;
  • use one of the default transitions:

    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 
    
  • try with a very bad <objectAnimator> in your res/animator resource folder:

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

这是不好的,因为你需要在像素中指定一个值(这里我放了1000),所以在不同的设备上将会有所不同。但是也许对于快速翻译来说这不是一个真正的问题。


将目录名称更改为anim,将objectAnimator更改为translate,现在出现崩溃:java.lang.RuntimeException:未知的动画名称:translate。 - Ken
我采用了你的方法(1),将所有内容转换为使用片段支持库,现在一切都按照预期工作。 - Ken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接