Android片段翻译动画不起作用

Ken*_*Ken 3 android android-animation android-fragments

我正在尝试为两个片段做一个简单的翻译动画.一个从右侧进入,另一个向左侧进入.我的最小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();
Run Code Online (Sandbox Code Playgroud)

我的动画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>
Run Code Online (Sandbox Code Playgroud)

和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>
Run Code Online (Sandbox Code Playgroud)

nat*_*rio 8

看起来你是混淆了两个动画框架,android.animationandroid.view.animation(是的,它混淆).

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

所以:

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

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

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


通过一些研究,我发现它setCustomAnimations()的行为更加混乱.

如果您使用支持库,setCustomAnimations()则只接受简单的动画对象(如您的<translate>).在这种情况下,它都应该工作,你只需要改变getFragmentManager()getSupportFragmentManager().

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

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

您可以:

  • 切换到支持库,如果您的开发尚未处于早期阶段,这可能会很无聊,并使用支持片段管理器;
  • 做一些关于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 
    
    Run Code Online (Sandbox Code Playgroud)
  • <objectAnimator>res/animator资源文件夹中尝试非常糟糕:

    <objectAnimator
        android:propertyName="translationX"
        android:duration="1000"
        android:valueFrom="1000"
        android:valueTo="0"
        android:valueType="floatType"/>
    
    Run Code Online (Sandbox Code Playgroud)

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