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.animation
和 android.view.animation
(是的,这很混淆)。
您的 XML 动画是两者的混合体。您可以设置 android.animation.ObjectAnimator
或 android.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),这样在不同的设备上看起来会有所不同。但也许对于快速翻译这不是真正的问题。
我正在尝试为两个片段制作一个简单的翻译动画。一个从右边进来,一个从左边出去。我的最小 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.animation
和 android.view.animation
(是的,这很混淆)。
您的 XML 动画是两者的混合体。您可以设置 android.animation.ObjectAnimator
或 android.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),这样在不同的设备上看起来会有所不同。但也许对于快速翻译这不是真正的问题。