需求背景
应用启动页一般要全屏显示,使用全屏的引导页来增强显示效果。 今天我们研究一下如何实现全屏引导页,以及过程中遇到的问题,对应的解决方案。
实现方案
方案一
第一步,我们定义显示样式,打开styles.xml文件,定义AppTheme.NoActionBar与AppTheme.Launcher:
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme.Launcher" parent="AppTheme.NoActionBar">
<item name="android:windowBackground">@color/colorPrimaryDark</item>
</style>
样式中,windowBackground设置整个窗口背景,可以设置color色值或者drawable资源。 第二步,Activity配置该主题样式:
<activity
android:exported="true"
android:name=".activity.GuideActivity"
android:theme="@style/AppTheme.Launcher">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
···
第三步,打开启动页GuideActivity代码,在onCreate中设置全屏显示:
···
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(R.style.AppTheme_Launcher);
getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN , WindowManager.LayoutParams. FLAG_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
setContentView(R.layout.activity_guide);
}
此时我们安装、运行应用,看到应用确实全屏展示了。 但是同时也会有一些问题,在手机最上部状态栏显示全黑,如下如所示:

我们希望全屏显示,当然状态栏也要包含在内,否则状态栏很突兀。 仔细研发,发现出现该问题原因是因为刘海屏,所以我们兼容一下刘海屏:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(R.style.AppTheme_Launcher);
fitsNotchScreen();
getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN , WindowManager.LayoutParams. FLAG_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
setContentView(R.layout.activity_guide);
}
/**
* 适配刘海屏
*/
private void fitsNotchScreen() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
getWindow().setAttributes(lp);
}
}
此时再次打开应用,发现状态栏全黑的背景消失了。效果如下:

该方案优势:无需引入三方资源,减少方法数量和代码冗余,规范代码结构。
方案二
下面再说一个简单的方式,我们可以直接使用开源兼容库Immersionbar,它是一个第三方的类库,用于 android 4.4以上沉浸式实现。具体项目介绍和复杂的使用可以参考Github项目说明文档和使用文档。 我下面就简单介绍实现引导页全屏的沉浸式方案。使用方案二实现,不用进行方案一相关的调整、改造。可以直接按照下面方式实现: 第一步,在build.gradle添加项目依赖:
implementation 'com.gyf.immersionbar:immersionbar:2.3.3' //沉浸式桌面
第二步,找到应用引导页GuideActivity,修改onCreate方法,添加ImmersionBar实现:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(R.style.AppTheme_Launcher);
ImmersionBar.with(this).transparentBar().init();
getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN , WindowManager.LayoutParams. FLAG_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
setContentView(R.layout.activity_guide);
}
此时,改造就完成了,效果和方案一相同。 该方案优势:兼容了各类国产型号手机,无需各机型分别适配。 全屏显示效果:

项目代码参考:睡眠助理
网友评论