前言
在日常开发过程中我们有时会遇到全屏的情况,尤其是做视频类相关的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);
}
}
文章借鉴: