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
相关产品推荐
相关产品推荐

