首先,我的状态栏背景设置为深棕色,导航栏背景默认为黑色.我使用的是material 光主题.

我用ActivityOptions.makeSceneTransitionAnimation开始了一个新的活动,它带有默认的过渡,我注意到状态栏和导航栏都会短暂地变为白色,然后恢复到正确的 colored颜色 .

根据documentation人的说法:

要获得转换的全部效果,必须在调用和被调用活动上启用窗口内容转换.否则,调用活动将启动退出转换,但随后您将看到窗口转换(如zoom 或淡入淡出)

我在通话和被叫活动中都使用了getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);.

类似地,如果我将enter转换更改为幻灯片,状态栏和导航栏都会有一个带有白色背景的幻灯片转换.

如何在活动场景动画过渡期间防止状态栏和导航栏产生动画效果?

推荐答案

据我所知,有两种方法可以用来防止导航/状态栏在过渡期间设置动画:

方法1:从窗口的默认退出/进入淡入淡出过渡中排除状态栏和导航栏

导航/状态栏在转换期间淡入淡出的原因是,默认情况下,一旦转换开始,调用/调用活动中的所有非共享视图(包括导航/状态栏背景)将分别淡出/淡出.但是,您可以通过将导航/状态栏背景从窗口的默认退出/输入Fade转换中排除,轻松解决这个问题.只需将以下代码添加到Activitys的onCreate()方法中:

Transition fade = new Fade();
fade.excludeTarget(android.R.id.statusBarBackground, true);
fade.excludeTarget(android.R.id.navigationBarBackground, true);
getWindow().setExitTransition(fade);
getWindow().setEnterTransition(fade);

此转换也可以使用XML在活动主题中声明(即在您自己的res/transition/window_fade.xml文件中):

<?xml version="1.0" encoding="utf-8"?>
<fade xmlns:android="http://schemas.android.com/apk/res/android">
    <targets>
        <target android:excludeId="@android:id/statusBarBackground"/>
        <target android:excludeId="@android:id/navigationBarBackground"/>
    </targets>
</fade>

方法#2:将状态栏和导航栏添加为共享元素

这种方法基于klmprt的答案,这almost个答案对我有用...尽管我仍然需要做一些修改.

在我的呼叫活动中,我使用以下代码启动活动:

View statusBar = findViewById(android.R.id.statusBarBackground);
View navigationBar = findViewById(android.R.id.navigationBarBackground);

List<Pair<View, String>> pairs = new ArrayList<>();
if (statusBar != null) {
  pairs.add(Pair.create(statusBar, Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
}
if (navigationBar != null) {
  pairs.add(Pair.create(navigationBar, Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));
}
pairs.add(Pair.create(mSharedElement, mSharedElement.getTransitionName()));

Bundle options = ActivityOptions.makeSceneTransitionAnimation(activity, 
        pairs.toArray(new Pair[pairs.size()])).toBundle();
startActivity(new Intent(context, NextActivity.class), options);

到目前为止,这基本上与KLMPRT在他的回答中提出的建议相同.但是,我还需要在我调用的Activity onCreate()方法中添加以下代码,以防止状态栏和导航栏在转换期间"闪烁":

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_next);

    // Postpone the transition until the window's decor view has
    // finished its layout.
    postponeEnterTransition();

    final View decor = getWindow().getDecorView();
    decor.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            decor.getViewTreeObserver().removeOnPreDrawListener(this);
            startPostponedEnterTransition();
            return true;
        }
    });
}

将状态栏和导航栏背景添加为共享元素将强制将它们绘制在窗口默认的退出/进入淡入淡入淡出过渡的顶部,这意味着它们在过渡期间不会淡入淡出.关于这种方法的更多讨论,请参见this Google+ post页.

Android相关问答推荐

KMM项目生成错误-';在项目';中找不到测试类:共享';

为什么Ionic-checkbox不总是刷新Android上的视图?

strings.xml中字符串数组中的占位符

Jetpack Compose 使用 SavedStateHandle 发送返回结果不适用于 ViewModel 中注入的 SavedStateHandle

Jetpack Compose 中的用户在线指示器

如何使用滑行加载媒体的专辑封面?

如何删除 Jetpack Compose 中按钮的左边框?

Jetpack Compose:在屏幕外制作长水平图像的动画

如何在Android中使用嵌套的Recyclerview

为什么我要使用 $version 而不是2.7.0?

Electric Eel 后 Gradle 项目同步失败 | 2022.1.1更新

如果 auth 失败,如何显示 toast jetpack compose firebase if else @Composable 调用只能在 @Composable 函数的上下文中发生

在移动设备上看到时如何增加 PasswordField 文本?

LazyColumn 单选中的状态提升. Jetpack compose

删除项目时延迟列不更新

在 Kotlin 中打开新片段时如何对当前片段应用更改?

为 AlertDialog 的消息文本设置自定义字体

如何在 Android 上移动 EditText 上的图标?

现代Android中的后台处理

如何使在库范围之外无法访问的接口的具体实现.?