我一直在开发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保留底部。一切正常,当我startactivity(myIntent) and finish()
我的活动时,动画在这两种情况下都能完美无瑕。
但是当我将活动主题从 AndroidManifest.xml 文件更改为“Theme.Dialog”时,overridePendingAnimation on MyActivity.this.finish();
永远不会有效。这意味着我的动画在我开始活动时起作用,但在完成活动时不起作用。
的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>
但我希望我的活动看起来像一个对话框。
答案 0 :(得分:2)
我在Android 4.4.2中遇到了同样的问题。 Theme.Dialog 定义了一个默认的非常短的退出动画,可快速缩小对话框并将其淡化为透明。在对话框上调用overridePendingTransition(entr,exit)会运行您与 Theme.Dialog 动画同时指定的退出动画,而不是替换它。此外,当 Theme.Dialog 动画完成时,您指定的动画会意外终止,即使您的动画要长得多。如果仔细观察,您可能会注意到您的退出动画实际上已开始运行但在50-100ms后终止。
这似乎是一个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>
现在,您可以通过以下任一方式使用NoDialogAnimation替换默认的 Theme.Dialog 动画:
选项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 bug。
最后说明: 我建议指定noDialogAnimation持续时间比您在实际退出动画中指定的持续时间少约50ms。原因是动画似乎没有同步。如果您的动画首先完成,对话框将在它消失之前反弹回其原始位置几毫秒。减去50ms似乎可以避免这个问题。
答案 1 :(得分:2)
这是一个老问题,但这对我有用。我在v4.2.2设备上遇到了这个问题,它是由Theme.Dialog中的默认窗口动画样式引起的,正如Dan建议的那样。您需要做的就是通过自定义主题来简单地摆脱它:
<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>