Android:覆盖 Activity 主题对话框的挂起转换不起作用

标签 android animation dialog themes transition

我一直在开发一个 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/

相关文章:

javascript - `display: none` 在 css 动画中不起作用?

javascript - 我怎样才能正确关闭这个 JQuery 对话框?

flutter - 在 flutter 中按下按钮弹出对话框

android - 为什么我应该在 Android 中使用匿名类而不是类重定义?

android - 为什么 Material 设计中 Activity 图标和非 Activity 图标的透明度不同?

java - 通过 Post Android 发送数据到 PHP

jquery - 滚动时创建 "underline to circle"动画

javascript - 如何等待一个 jquery 动画在下一个动画开始之前完成?

android - 将数据从线程传递到 Activity

css - 如何更改 Aurelia 对话框中的边框颜色?