如何在Android中无动画地切换活动?

184

在AndroidManifest文件中如何正确使用Intent标志FLAG_ACTIVITY_NO_ANIMATION? 我想我的问题很简单,但我找不到好的示例或解决方法。

    <intent-filter>
        <data android:name="android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION" />
    </intent-filter>

然而编译器没有报错,但是data并不正确。我只想在活动之间切换时禁用动画。我可以在onCreate或onResume中使用getWindow().setWindowAnimations(0);,但使用标志位是否更好呢?

我也可以在代码中使用:

    Intent intent = new Intent(v.getContext(), newactivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    getContext().startActivity(intent);

但我想在Android清单中使用此标志。即使从第二个活动返回到第一个活动,也要禁用动画。


我发现了使用主题的建议 - 通过定义活动或整个应用程序的进入,退出动画。有人能给我更多信息吗? - woyaru
9个回答

297

你可以创建一个样式,

 <style name="noAnimTheme" parent="android:Theme">
   <item name="android:windowAnimationStyle">@null</item>
</style>

然后在清单文件中将其设置为活动的主题:

   <activity android:name=".ui.ArticlesActivity" android:theme="@style/noAnimTheme">
    </activity>

您还可以定义一个样式来指定自定义的进入和退出动画。 http://developer.android.com/reference/android/R.attr.html#windowEnterAnimation


谢谢,这个非常好用,特别是对于具有不同任务亲和性的透明/对话框主题活动被排除在最近活动之外。如果没有它,当打开对话框时,动画会持续显示,结果非常奇怪! - 3c71
1
这似乎不再适用于棒棒糖/Android 5.0了? - kenyee
我使用的是Android 5,它对我来说很好用。我的应用程序样式如下:<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="android:windowAnimationStyle">@null</item> </style> - eatyourgreens
在6.0中也完美运行。一个很好的提示。正如我下面所问的,我想知道如何禁用应用程序首次启动时发生的动画...有办法吗?! - Fattie
5
如果扩展AppCompatActivity,应用程序将崩溃。 - Mike6679

220
如果您的上下文是一个活动,您可以调用 overridePendingTransition

在调用 startActivity(Intent) 或 finish 的其中一种后立即调用,以指定要执行的明确转换动画。

因此,在程序中:

this.startActivity(new Intent(v.getContext(), newactivity.class));
this.overridePendingTransition(0, 0);

通过adb也可以做到吗? - android developer
@TalAngel overridePendingTransition 函数是在 API level 5 中添加的。因此,它并不适用于“每个” Android 版本,但我猜你的目标 API 级别比 5 更高。 - Bruno Bieri

58

试试这段代码:

this.startActivity(new Intent(v.getContext(), newactivity.class).addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION));

3
当从服务中启动活动时,这真的很有帮助。 - DearDhruv
在 Android 12 上尝试过了:启动 NewActivity 后它能正常工作。但如果你在 NewActivity 中调用 finish(),就会出现一个动画。 - Lipsyor

29

你也可以在所有不想从中进行转换的活动中执行此操作:

@Override
public void onPause() {
    super.onPause();
    overridePendingTransition(0, 0);
}

我喜欢这种方法,因为你不必去处理你的活动的样式。


一个好的提示。我想知道如何禁用应用程序首次启动时发生的动画...有什么办法吗?! - Fattie
@Fattie 覆盖启动活动的onStart()方法,并将相同的代码放在其中。 - user8095299

11

主题样式中的代码行效果良好,但会用白屏替换动画,特别是在较慢的手机上非常令人恼火。所以,如果您想要立即过渡,请在主题样式中使用以下代码:

<item name="android:windowAnimationStyle">@null</item>
<item name="android:windowDisablePreview">true</item>

7

以下是一行代码的解决方案,适用于最低只有minSdkVersion 14的情况,您需要将其插入到 res/styles.xml 中:

<item name="android:windowAnimationStyle">@null</item>

就像这样:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        ...
        <item name="android:windowAnimationStyle">@null</item>
    </style>
    ...
</resources>

干杯!


6

在启动意图之后,您可以使用以下代码:

Intent intent = new Intent(Activity1.this, Activity2.class);
overridePendingTransition(0, 0);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);

如果启用,意图将在没有动画或转换的情况下工作。

overridePendingTransition 看起来在函数被调用时没有任何转场情况,因此似乎不会有任何效果。我在代码中添加了无动画的标志,并且它按预期工作(而不需要重写)。 - David Rector

5

2

创建自己的样式覆盖android:Theme

<style name="noAnimationStyle" parent="android:Theme">
    <item name="android:windowAnimationStyle">@null</item>
</style>

然后在清单文件中像这样使用:

<activity android:name=".MainActivity"
    android:theme="@style/noAnimationStyle">
</activity>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接