Android fragment 翻译动画不工作

标签 android android-fragments android-animation

我正在尝试为两个 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.animationandroid.view.animation (是的,这很困惑)。

您的 XML 动画是两者的混合体。要么你设置一个 android.animation.ObjectAnimatorandroid.view.animation.Animation :见herehere以供引用。在这种特殊情况下,我认为您正在寻找一个简单的翻译动画,它属于后者,更早,更简单的类(和链接)。

所以:

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

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

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


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

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

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

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

您可以:

  • 切换到支持库,如果您的开发不处于早期阶段,这可能会很无聊,并使用支持 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/

相关文章:

java - 在 RecyclerView 中运行由框架制作的动画

android - 如何将回调从 Activity 传递到 fragment

javascript - 如何在 Android 中为 WebView 中的 Javascript 转义 MathML 字符串

java - Android:在父 fragment 和子 fragment 之间传递更新数据

android - 按下后退按钮后重新选择正确的 NavigationView 菜单项

Android xml 包格式无法识别 aapt 属性

Android观察者模式和数据绑定(bind), bool 属性改变时启动 Activity

android - 对象可见性

android - API 22 x_86级API上的ClassDefNoFound

android - 如何旋转图像并最终使用动画更改图像