【问题标题】:Android: override pending Transition for Activity Theme Dialog not workingAndroid:覆盖挂起的活动主题对话框的转换不起作用
【发布时间】:2014-02-15 19:04:28
【问题描述】:

我一直在开发一个需要为我的活动制作动画的 Android 应用程序。我使用了 overridePendingTransition(entr,exit) 并在 res\anim 文件夹中创建了 3 个 xml 文件。其中 r 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) and finish()我的活动时,动画在这两种情况下都完美无缺。 但是,当我将活动主题从 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>

但我希望我的活动看起来像一个对话框。

【问题讨论】:

  • 能解决这个问题吗?我也面临同样的问题。

标签: android animation dialog themes transition


【解决方案1】:

我在 Android 4.4.2 中遇到了同样的问题。 Theme.Dialog 定义了一个默认的非常短的退出动画,它可以快速缩小对话框并将其淡化为透明。在对话框上调用 overridePendingTransition(entr,exit) 会运行您与 Theme.Dialog 动画同时指定的退出动画,而不是替换它。此外,当 Theme.Dialog 动画完成时,您指定的动画会意外终止,即使您的动画更长。如果您仔细观察,您可能会注意到您的退出动画实际上开始运行,但在 50-100 毫秒后终止。

这似乎是一个 Android 错误,但我找到了解决方法。您需要用定义为 XML 样式的虚拟动画替换 Theme.Dialog 退出动画。例如,在 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>

然后将此行添加到清单文件中的活动中:

android:theme="@style/MyDialogStyle"

选项 2. 将以下行添加到您的活动的 onCreate():

getWindow().getAttributes().windowAnimations = R.style.NoDialogAnimation;

您在 overridePendingTransition(entr,exit) 中指定的退出动画现在应该运行 500 毫秒,因为这是 NoDialogAnimation 的持续时间。您可能想知道为什么不将所需的动画指定为样式而不是调用 overridePendingTransition。好吧,如果您这样做,默认的 Theme.Dialog 动画将神奇地首先运行,即使您替换了它,那么您的动画将在中途继续并完成。就像我之前说的,这看起来像是一个 Android 错误。

最后说明: 我建议指定一个 noDialogAnimation 持续时间,该持续时间比您在实际退出动画中指定的持续时间短约 50 毫秒。原因是动画似乎没有同步。如果您的动画首先完成,则对话框将在消失之前弹回其原始位置几毫秒。减去 50 毫秒似乎可以避免这个问题。

【讨论】:

  • 感谢 Dan 的回答。无论你在这个答案中说什么确实有很强的意义,但对我来说没有运气。我尝试了这两种方法,也尝试了一些方法,但无法使 EXIT 转换工作。 NoAnimation 所做的是,它在默认转换之后运行(正如您所说,它在 100 毫秒内淡出)然后我的活动返回剩余的 miliSeconds 但在 EXIT 上没有转换工作。同样如您所说,我们不能将过渡添加为样式,因为它将在默认过渡之后运行,是的,它确实如此。至少我可以看到我的动画,但在默认情况下和剩余的毫秒数。
  • 到目前为止,我的观察结果是,无论您做什么,Android 都会先播放默认退出动画,然后再播放您的自定义退出动画
【解决方案2】:

这是一个老问题,但这对我有用。正如 Dan 所建议的,我在 v4.2.2 设备上遇到了这个问题,它是由 Theme.Dialog 中的默认窗口动画样式引起的。您需要做的就是通过自定义主题来摆脱它:

<style name="CustomTheme" parent="@android:style/Theme.Dialog">
    <item name="android:windowAnimationStyle">@null</item>
    <item name="android:windowEnterAnimation">@null</item>
    <item name="android:windowExitAnimation">@null</item>
    <!-- other customizations -->
</style>

我也将 android:windowEnterAnimation 和 android:windowExitAnimation 设置为 null,以防万一。现在您必须在清单中使用您的自定义主题,然后您就完成了:

<activity
    android:name=".MyActivity"
    android:label="My Activity"
    android:theme="@style/CustomTheme">
</activity>

【讨论】:

    猜你喜欢
    • 2018-01-15
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    相关资源
    最近更新 更多