Android开发

优化状态栏沉浸显示

2021-12-08  本文已影响0人  卓技卓品

需求背景

应用启动页一般要全屏显示,使用全屏的引导页来增强显示效果。 今天我们研究一下如何实现全屏引导页,以及过程中遇到的问题,对应的解决方案。

实现方案

方案一

第一步,我们定义显示样式,打开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);
}

此时,改造就完成了,效果和方案一相同。 该方案优势:兼容了各类国产型号手机,无需各机型分别适配。 全屏显示效果:

最终效果

项目代码参考:睡眠助理

上一篇 下一篇

猜你喜欢

热点阅读