我一直在开发一个 Android 应用程序,我需要为我的 Activity 制作动画。我使用了 overridePendingTransition(entr,exit) 并在 res\anim 文件夹中创建了 3 个 xml 文件。其中 push_up_in.xml、push_down_out.xml、hold.xml 使用
<set>
<translate>
duration, fromYDelta, toYDelta, zAdjustment
</set>
我为push_.xmls保留了zAdjustment=top,为hold.xml保留了bottom。一切正常,当我 startactivity(myIntent) 和 finish()
我的 Activity 时,动画在这两种情况下都完美地工作。
但是,当我将 Activity 主题从 AndroidManifest.xml 文件更改为“Theme.Dialog”时,overridePendingAnimation on MyActivity.this.finish();
永远不会起作用。这意味着我的动画在我开始 Activity 时起作用,但在我完成 Activity 时不起作用。
AndroidManifest.xml
<activity
android:name=".MyActivity"
android:label="My Activity"
android:theme="@android:style/Theme.Dialog">
</activity>
如果我简单地删除“主题”语句,一切都会再次开始像魅力一样工作。
<activity
android:name=".MyActivity"
android:label="My Activity">
</activity>
但我希望我的 Activity 看起来像一个对话框。
最佳答案
我在 Android 4.4.2 中遇到了同样的问题。 Theme.Dialog 定义了一个默认的非常短的退出动画,可以快速缩小对话框并将其淡入透明。在对话框上调用 overridePendingTransition(entr,exit) 会与 Theme.Dialog 动画同时运行您指定的退出动画,而不是替换它。此外,当 Theme.Dialog 动画完成时,您指定的动画会意外终止,即使您的动画更长。如果仔细观察,您可能会注意到退出动画实际上开始运行,但在 50-100 毫秒后终止。
这似乎是一个 Android 错误,但我找到了解决方法。您需要将 Theme.Dialog 退出动画替换为在 XML 中定义为样式的虚拟动画。例如,在 res/anim 文件夹中创建一个名为 no_animation.xml 的文件,其中包含以下内容:
<?xml version="1.0" encoding="utf-8"?>
<alpha
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="1.0"
android:toAlpha="1.0"
android:duration="500" />
然后将以下内容添加到您的 res/style 文件中:
<style name="NoDialogAnimation">
<item name="android:windowEnterAnimation">@anim/no_animation</item>
<item name="android:windowExitAnimation">@anim/no_animation</item>
</style>
现在您可以通过以下任一方式将默认的 Theme.Dialog 动画替换为 NoDialogAnimation:
选项 1. 创建名为 MyDialogStyle 的新样式,如下所示:
<style name="MyDialogStyle" parent="@android:style/Theme.Dialog">
<item name="android:windowAnimationStyle">@style/NoDialogAnimation</item>
</style>
然后将此行添加到 list 文件中的 Activity 中:
android:theme="@style/MyDialogStyle"
选项 2.将以下行添加到 Activity 的 onCreate() 中:
getWindow().getAttributes().windowAnimations = R.style.NoDialogAnimation;
您在 overridePendingTransition(entr,exit) 中指定的退出动画现在应该运行 500 毫秒,因为这是 NoDialogAnimation 的持续时间。您可能想知道为什么不直接将所需的动画指定为样式,而不是调用 overridePendingTransition。好吧,如果你这样做,默认的 Theme.Dialog 动画将神奇地首先运行,即使你替换了它,那么你的动画将在中途开始并完成。正如我之前所说,这看起来像是一个 Android 错误。
最后说明: 我建议指定 noDialogAnimation 持续时间,该持续时间比您在实际退出动画中指定的持续时间短大约 50 毫秒。原因是动画似乎不同步。如果您的动画首先完成,对话框将在消失之前弹回其原始位置几毫秒。减去 50 毫秒似乎可以避免这个问题。
关于Android:覆盖 Activity 主题对话框的挂起转换不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21802216/