Android各种bar的适配(包括刘海屏)

it2022-05-05  143

Android各种bar历史变迁:

1.关于 TitleBar、ActionBar、ToolBar、StatusBar

Android 3.0 以前

android3.0-android5.0 actionbar

android5.0以后 ToolBar

2.状态栏的历史以及更正错误叫法

沉浸式的适配更多是状态栏的适配,希望各种bar能够跟状态栏颜色差不多。事实上,多数的app可能在基类设定的时候,并未采用actionbar、toolbar,可能就是一个没有title的activity里面增加一个横条的view来起bar的作用。

修改状态栏颜色: 在 Android 4.4 之前状态栏一直就是黑色的 Android 5.0 (API 21) 后支持直接修改状态栏的颜色,在 Android 4.4(API 19)之前是不允许操作状态栏的,也就是说在 Android 4.4 之前,我们是没法对状态栏进行任何操作的。

Android4.4修改状态栏颜色

// 将状态栏设置为透明(需要 API 19) 设置成这种模式后,状态栏会变成透明,我们的内容布局(只是我们 Activity 对应的布局,不包含 Window 中的 ActionBar)会占据系统栏。类似于 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | LAYOUT_STABLE); getWindow().setStatusBarColor(Color.TRANSPARENT); // 首先设置状态栏为透明 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // 这个时候,我们的布局内容中占据系统栏了,这个时候,我们只需要自己来创建一个系统栏背景就可以了。 View mStatusBarView = new View(context); int screenWidth = 屏幕宽度; int statusBarHeight = 状态栏高度(是可以获取的); ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(screenWidth,statusBarHeight); mStatusBarView.setLayoutParams(params); mStatusBarView.requestLayout(); // 获取系统默认的根布局 ViewGroup systemContent = findViewById(android.R.id.content); // 这个就是我们自己的布局文件 ViewGroup userContent = systemContent.getChildAt(0); // 添加到我们的布局中 userContent.addView(mStatusBarView,0);

其实这样并没有修改颜色,只是把状态栏改成了透明

Android 5.0 修改状态栏颜色

// 方法一 getWindow().setStatusBarColor(int color ); // 方法二 样式中: <item name="colorPrimaryDark">@color/colorAccent</item> 对应状态栏颜色

全屏 vs 沉浸式?

全屏:隐藏状态栏 沉浸式:显示状态栏,让状态栏看着跟内容更融合一些,比如让状态栏透明等 他们是不一样的

沉浸式适配,如下

沉浸式的适配更多是状态栏的适配,希望各种bar能够跟状态栏颜色差不多。事实上,多数的app可能在基类设定的时候,并未采用actionbar、toolbar,可能就是一个没有title的activity里面增加一个横条的view来起bar的作用。

修改状态栏颜色: 在 Android 4.4 之前状态栏一直就是黑色的 Android 5.0 (API 21) 后支持直接修改状态栏的颜色,在 Android 4.4(API 19)之前是不允许操作状态栏的,也就是说在 Android 4.4 之前,我们是没法对状态栏进行任何操作的。

Android4.4修改状态栏颜色

// 将状态栏设置为透明(需要 API 19) 设置成这种模式后,状态栏会变成透明,我们的内容布局(只是我们 Activity 对应的布局,不包含 Window 中的 ActionBar)会占据系统栏。类似于 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | LAYOUT_STABLE); getWindow().setStatusBarColor(Color.TRANSPARENT); // 首先设置状态栏为透明 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // 这个时候,我们的布局内容中占据系统栏了,这个时候,我们只需要自己来创建一个系统栏背景就可以了。 View mStatusBarView = new View(context); int screenWidth = 屏幕宽度; int statusBarHeight = 状态栏高度(是可以获取的); ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(screenWidth,statusBarHeight); mStatusBarView.setLayoutParams(params); mStatusBarView.requestLayout(); // 获取系统默认的根布局 ViewGroup systemContent = findViewById(android.R.id.content); // 这个就是我们自己的布局文件 ViewGroup userContent = systemContent.getChildAt(0); // 添加到我们的布局中 userContent.addView(mStatusBarView,0);

其实这样并没有修改颜色,只是把状态栏改成了透明

Android 5.0 修改状态栏颜色

// 方法一 getWindow().setStatusBarColor(int color ); // 方法二 样式中: <item name="colorPrimaryDark">@color/colorAccent</item> 对应状态栏颜色

完成了沉浸式的适配,刘海屏下基本不存在什么问题

全屏适配

全屏只会在刘海屏下会有一些问题,因为刘海屏下,如果不适配,刘海屏位置会是黑色的或者白色的,比较丑 需要解决两个问题: 1.内容充满屏幕,包含刘海部分(针对Android P 有专门的api,当然Android O的小米、华为、ov等手机需要专门判断) 2.内容顶部可交互部分下移一下(下移状态栏的高度就可以,因为google规定了刘海高度不能比状态栏高度高),防止刘海盖住

最终的适配方案: 1.android9.0及以后,google提供了官方的刘海屏适配api,但是在通过api判断是否有刘海屏时,结果不及时且不准确,会有UI上的显示问题,参考别的短视频app,采用沉浸式方案 2.Android8.0-Android8.1 在google未发布官方api的时候,国内厂商率先推出刘海屏,为了简单适配,采用沉浸式方案 3.Android8.0之前FullScreen不需要适配

升级compileSdkVersion

在全屏展示下适配刘海屏的时候,需要用到Android P的api,就需要升级compileSdkVersion,中间会遇到一些报错。原因是google在新的sdk里删掉了一些api方法。 例如: layoutInDisplayCutoutMode,连Build.VERSION_CODES.P都报错?还提示cannot resolve symbol xxx,why?

答:请打开app的build.gradle文件,检查一下配置

android { // 编译版本,android SDK版本 compileSdkVersion 28

https://blog.csdn.net/a_long_/article/details/77094237 https://blog.csdn.net/caobin_study/article/details/89023554

参考资料

Android P 刘海屏适配全攻略 https://juejin.im/post/5b1930835188257d7541ba33 关于 Android 中的各种 Bar 和“透明状态栏”的一些知识 https://juejin.im/post/5cd84f23f265da036f4e9ef6 开源适配方案 https://github.com/zhangzhun132/NotchTools


最新回复(0)