没有动画的切换活动

时间:2011-08-07 10:47:06

标签: android animation android-activity android-intent

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

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

但是,compliator没有报告错误,但data不正确。 我只想在活动之间切换时禁用动画。我可以在onCreate或onResume中使用getWindow().setWindowAnimations(0);,但是使用flag是更好的方法,不是吗?

我也可以在代码中使用:

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

但是我想在Android Manifest中使用这个标志。如果从第二个活动返回到第一个活动,也要禁用动画。

9 个答案:

答案 0 :(得分:241)

您可以创建样式

 <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

答案 1 :(得分:168)

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

  

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

所以,以编程方式:

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

答案 2 :(得分:33)

试试这段代码,

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

答案 3 :(得分:20)

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

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

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

答案 4 :(得分:5)

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

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

答案 5 :(得分:2)

这是一个单行解决方案,适用于您应该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>
像这样:

if (!HTMLCanvasElement.prototype.toBlob) {
  Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {
    value: function (callback, type, quality) {
      var canvas = this;
      setTimeout(function() {

        var binStr = atob( canvas.toDataURL(type, quality).split(',')[1] ),
            len = binStr.length,
            arr = new Uint8Array(len);

        for (var i = 0; i < len; i++ ) {
          arr[i] = binStr.charCodeAt(i);
        }

        callback( new Blob( [arr], {type: type || 'image/png'} ) );

      });
    }
  });
}

干杯!

答案 6 :(得分:1)

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

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

然后在清单中使用它:

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

答案 7 :(得分:1)

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

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

如果使用,则intent将不具有动画或过渡效果

答案 8 :(得分:0)

主题样式中的行工作正常,但用白色屏幕替换了动画。尤其是在手机速度较慢的情况下-真令人讨厌。 因此,如果您想要即时转换-您可以在主题样式中使用它:

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