如何在Android中切换没有动画的活动?

Posted

技术标签:

【中文标题】如何在Android中切换没有动画的活动?【英文标题】:How to switch activity without animation in Android? 【发布时间】:2011-10-21 18:51:52 【问题描述】:

如何在 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 Manifest 中使用这个标志。在从第二个活动返回到第一个活动的情况下也禁用动画。

【问题讨论】:

我找到了使用主题的建议——通过为活动或整个应用程序定义进入、退出动画。谁能给我更多关于它的信息? 【参考方案1】:

你可以创建一个样式,

 <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

【讨论】:

谢谢,这非常适用于透明/对话主题的活动,这些活动被排除在具有不同任务亲和力的近期活动之外。如果没有这个,动画会一直显示为正在打开的对话框创建非常奇怪的结果! 这似乎不再适用于 Lollipop/Android 5.0? 我有 Android 5,它适用于我。我的应用样式如下所示: 在 6.0 中也能完美运行。一个很好的提示。正如我在下面问的那样,我想知道如何禁用 *首次启动应用程序时发生的动画......有没有办法?! 如果你扩展 AppCompatActivity 会崩溃【参考方案2】:

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

在 startActivity(Intent) 或其中一种风格之后立即调用 finish 指定下一个要执行的显式过渡动画。

所以,以编程方式:

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

【讨论】:

也可以通过 adb 来实现吗? @TalAngel overridePendingTransition 是在 API 级别 5 中添加的。所以不,它不适用于“每个”Android 版本,但我猜你的目标 API 级别高于 5。【参考方案3】:

试试这个代码,

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

【讨论】:

这在从服务启动活动时真的很有帮助。【参考方案4】:

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

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

我喜欢这种方法,因为您不必弄乱活动的风格。

【讨论】:

一个很好的提示。我想知道如何禁用 *首次启动应用程序时发生的动画 ...有没有办法?! @Fattie 覆盖启动活动的 onStart() 方法并在其中放置相同的代码。【参考方案5】:

主题样式中的线条效果很好,但是用白屏替换了动画。特别是在速度较慢的手机上 - 这真的很烦人。 因此,如果您想要即时过渡 - 您可以在主题样式中使用它:

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

【讨论】:

【参考方案6】:

这是一个单行解决方案,适用于低至 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>

干杯!

【讨论】:

【参考方案7】:

这不是使用示例或说明如何使用FLAG_ACTIVITY_NO_ANIMATION,但它确实回答了如何禁用Activity 切换动画,如问题标题中所述:

Android, how to disable the 'wipe' effect when starting a new activity?

【讨论】:

【参考方案8】:

启动意图后,您可以使用此代码:

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

如果使用,意图将在没有动画或过渡的情况下工作

【讨论】:

【参考方案9】:

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

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

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

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

【讨论】:

以上是关于如何在Android中切换没有动画的活动?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中制作“忙碌”动画?

在Android中调用另一个活动时如何提供动画?

使用Material Design在Android Lollipop中的ListView中的活动过渡动画

一个活动和另一个活动之间的动画过渡[关闭]

如何在 Android SDK for Chromecast 中切换活动

在Android中使用导航组件时如何删除默认动画过渡?