Android 隐藏状态栏和导航栏(全屏)的方法

前言

       在日常开发过程中我们有时会遇到全屏的情况,尤其是做视频类相关的App项目,这个观看视频的功能我们就需要在观看视频的时候进行全屏操作了,来获得更好的观影体验,这个时候作为开发者我们就要去适配这个功能,也就是设置应用进入全屏/退出全屏,以下是常用的几种方式:

方法1: 通过系统类来显示和隐藏

WindowInsetsControllerCompat 类 前提 SDK>= 30,才可以使用,因为我个人是做车载开发的,我用这个方式去全屏,在全屏的时候语音切换主题状态栏会出来,一般开发用这个方式就行

public class showBarUtils {
    // 1.获取WindowInsetsControllerCompat实例
    WindowInsetsControllerCompat controllerCompat = ViewCompat.getWindowInsetsController(getWindow().getDecorView());
    // 2. 设置系统栏行为
    controllerCompat.setSystemBarsBehavior(WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_SWIPE);.

    // 3.调用对应方法
    public void showBar() {
        // 显示状态栏、docker栏显示
        controllerCompat.show(WindowInsetsCompat.Type.systemBars());
    }

    public void hideBar() {
        // 隐藏状态栏、docker栏的显示
        controllerCompat.hide(WindowInsetsCompat.Type.systemBars());
    }
}

setSystemBarsBehavior参数的作用:

WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_TOUCH 可在相应显示屏上执行任何用户互动时显示隐藏的系统栏
WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_SWIPE 可在执行任何系统手势(例如从隐藏系统栏的屏幕边缘滑动)时显示隐藏的系统栏
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE 通过系统手势(例如从隐藏系统栏的屏幕边缘滑动)暂时显示隐藏的系统栏

方法2:通过DecorView来动态设置

任何版本都适用

public class BarUtils {
    // 在Activity通过getWindow().getDecorView()来传递参数 View
    // 参数View = getWindow().getDecorView()
    public static void hideBar(View v) {
        if (v == null) {
            Log.w(TAG, "hideBar: v == null!");
            return;
        }
        int flags = 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      // 隐藏状态栏
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; // 沉浸式模式

        v.setSystemUiVisibility(flags);
    }

    public static void showBar(View v) {
        if (v == null) {
            Log.w(TAG, "showBar: v == null!");
            return;
        }
        // 关键:退出全屏时,我们只移除隐藏导航栏和状态栏的标志,
        // 但保留 LAYOUT_STABLE / LAYOUT_FULLSCREEN 等标志,防止视图位移
        // 从而保持布局的稳定性,避免画面跳动。
        int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;

        v.setSystemUiVisibility(flags);
    }
}

文章借鉴:

https://developer.android.com/develop/ui/views/layout/immersive

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值