You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android共享元素Activity过渡时工具栏标题栏短暂淡入问题咨询

问题根因

你遇到的状态栏/标题栏短暂淡入问题,核心原因是Activity过渡动画的执行优先级高于你在onWindowFocusChanged中配置的沉浸式规则,系统默认的窗口过渡动画会先渲染带系统栏的初始窗口状态,等沉浸式配置生效后才会隐藏,就会出现短暂闪烁。


解决方案

1. 补充主题配置,从根源屏蔽系统栏相关的过渡效果

修改你的res/values/style.xml中的AppTheme,新增以下属性:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- 原有配置保留 -->
    <item name="android:windowContentTransitions">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>

    <!-- 新增配置 -->
    <!-- 兼容AppCompat库的ActionBar隐藏规则 -->
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <!-- 状态栏、导航栏设为透明,避免出现色块 -->
    <item name="android:statusBarColor">@android:color/transparent</item>
    <item name="android:navigationBarColor">@android:color/transparent</item>
    <!-- 禁用系统默认的Activity淡入淡出过渡,仅保留你自定义的共享元素过渡 -->
    <item name="android:windowEnterTransition">@null</item>
    <item name="android:windowExitTransition">@null</item>
    <item name="android:windowReenterTransition">@null</item>
    <item name="android:windowReturnTransition">@null</item>
</style>

2. 提前沉浸式配置的执行时机,避免晚于动画启动

不要只在onWindowFocusChanged中设置沉浸式属性,在onCreate的setContentView之前就先执行一次配置,代码如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
    // 新增:setContentView之前先设置沉浸式flag
    getWindow().getDecorView().setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN);
    // 主动隐藏ActionBar,兜底兼容
    if (getSupportActionBar() != null) {
        getSupportActionBar().hide();
    }
    setContentView(R.id.your_layout);
}

原有的onWindowFocusChanged配置可以保留,用来处理窗口失去焦点后重新获得焦点时的沉浸式恢复。

3. 启动Activity时仅保留共享元素过渡

跳转Activity时,明确指定共享元素,避免触发其他默认过渡效果,示例代码:

// 替换为你实际的两个共享元素控件和对应的transitionName
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,
    Pair.create(findViewById(R.id.left_bg_image), "transitionLeft"),
    Pair.create(findViewById(R.id.right_bg_image), "transitionRight")
);
startActivity(yourIntent, options.toBundle());

4. 检查布局根节点配置

确保所有Activity布局的根节点没有设置android:fitsSystemWindows="true",该属性会为系统栏预留顶部/底部空间,可能导致过渡时出现空白区域闪烁。


内容的提问来源于stack exchange,提问作者Adrien Jouve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:27:04