系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 系列文章目录
- 前言
- 一、需求说明
- 二、修改方案
- 1.基于需求的两种设计构想
- 2.修改正确的高度及宽度
- 三、替换CarSystemUI
- 1.CarOS框架关于CarSystemUI的介绍
- 2.替换CarSystemUI
- 总结
前言
随着车载智能座舱的不断发展,各种新能源车引领了大屏化趋势,Android系统自8.0以后也专门为车载开发做了设计和分支CarOS,CarOS相对传统的手机OS做了很多改变,例如音频控制CarOS使用CarAudioManager直接控制的硬件音量俗称硬音量,传统手机系统使用AudioManager软件控制音量俗称软音量,还有其它汽车周边硬件控制引入了hal等等,后续抽时间我会再写一篇文章介绍CarOS音频控制流程和其在车载中的具体应用设计,本篇我们还是按照标题介绍CarSystemUI相关内容。
一、需求说明
公司有智能座舱的开发需求选取的平台是当红的芯驰系列x9m芯片,芯驰芯片主打一芯多屏,一颗芯片同时实现MP5和仪表,具体UI实现参照别克gl8
需求:系列图网上查阅可以看到,左边控制栏是在所有界面都要显示包括第三方地图界面(除了倒车界面),倒车的图层是等级最高的会处理显示到所有图层上面故不考虑倒车的状态
二、修改方案
1.基于需求的两种设计构想
1.按照以前项目经验可以在framework中PhoneWindowManager中将屏幕左侧裁剪出需要的宽度,再在裁剪的区域贴悬浮窗,这种方式我在6.0系统有实现过的案例。
2.用安卓SystemUI自带的导航栏来实现,先要将底部导航栏调到左侧竖直显示,所以我们先搞定这需求,按照惯例先到网上搜索Android 10 修改导航栏的位置,很容易就查到修改的为位置在这frameworks/base/servicescore/java/com/android/server/wm/DisplayPolicy.java
我们打开这个类里面有个方法:
@NavigationBarPosition
int navigationBarPosition(int displayWidth, int displayHeight, int displayRotation) {
String isCustomSystemUI = SystemProperties.get("persist.systemui.custom");
if ("1".equals(isCustomSystemUI)) {
return NAV_BAR_LEFT;
}
if (navigationBarCanMove() && displayWidth > displayHeight) {
if (displayRotation == Surface.ROTATION_270) {
return NAV_BAR_LEFT;
} else if (displayRotation == Surface.ROTATION_90) {
return NAV_BAR_RIGHT;
}
}
return NAV_BAR_BOTTOM;
}
可以看到修改导航栏位置的方法是navigationBarPosition,这个方法里面是通过配置配置于persist.systemui.custom=1来实现左侧显示,当然我习惯性的去百度搜索配置于persist.systemui.custom字段,然后就打开了新大门有个兄弟写了这个需求,然后一看芯片用的也是芯驰的他用的是芯驰x9h我用的是x9m,当时内心就是一个大大的 卧槽……
https://blog.csdn.net/u013004758/article/details/121349325?spm=1001.2014.3001.5502
NavigationBar左侧布局方案探索一
用它写的就解决导航栏显示到左侧的问题,以前前辈说编程是一种思想此刻深有体会。
同样的到我用的平台下添加配置:
android/device/semidrive/x9m/common/DeviceCommon.mk
PRODUCT_PROPERTY_OVERRIDES += \
ro.product.first_api_level=29 \
ro.adb.secure=0 \
persist.ipv6.enable=1 \
ro.bt.bdaddr_path=/vendor/bluetooth/btmac.txt \
persist.sys.timezone=Asia/Shanghai \
persist.sys.country=CN \
persist.sys.language=zh \
qemu.hw.mainkeys=0 \
persist.systemui.custom=1
qemu.hw.mainkeys=0作用是显示导航栏
persist.systemui.custom=1导航栏显示到左侧
运行后效果如下图:
2.修改正确的高度及宽度
按照我司设计图导航栏高度是130px,状态栏是64px
find ./ -name "*.xml" |xargs grep "status_bar_height"
在android源码下搜索status_bar_height
找到对应的位置,调试发现状态栏修改android/packages/services/Car/car_product/overlay/frameworks/base/core/res/res/values/dimens.xml里面64dp是有效的,但是修改导航栏的高度 48dp和48dp两个参数修改不起作用,这里就又要提一下那句该死的语录:编程是一种思想!!!
用Android studio把机器里面的界面截取出来,用画图工具量一下上面那个截图里面导航栏的高度97px,那么这时我的编程思想就想到肯定系统哪里把navigation_bar_height设置了这个高度,所以又用到
find ./ -name "*.xml" | xargs grep "navigation_bar_height*"
然后就看到两个该死的96dp,这个时候我就觉得我是个天才,会当水击三千里,自信人生二百。把96dp的全部改成130,执行
- 编译目录 frameworks/base/core/res
- 编译命令 mm,,编译完成后会在out/target/product/mek_8q/system/framework目录下生成framework-res.apk
- 验证 将生成的apk替换掉system/framework/framework-res.apk,然后重启
发现没变化,然后仔细查看带navigation_bar_参数发现有这个
<!-- Width of the navigation bar when it is placed vertically on the screen -->
<dimen name="navigation_bar_width">48dp</dimen>
看描述绝对是这里,我再改然后替换framework-res.apk,然后重启,还是无效果,很痛苦很烦躁很迷茫。
然后分析既然status_bar_height的高度在android/packages/services/Car/car_product/overlay/frameworks/base/core/res/res/values/dimens.xml里面改有效果,当然我再次去里面改了一下状态栏高度验证有效,那么我把48dp这个拷贝到这个目录里面试试
<dimen name="status_bar_height">76dp</dimen>
<!-- x9m status bar height add by xmc -->
<dimen name="status_bar_height_landscape">64dp</dimen>
<dimen name="status_bar_height_portrait">76dp</dimen>
<dimen name="car_qs_header_system_icons_area_height">76dp</dimen>
<!-- x9m navigation bar height add by xmc -->
<dimen name="navigation_bar_height">48dp</dimen>
<dimen name="navigation_bar_height_landscape">48dp</dimen>
<!-- Width of the navigation bar when it is placed vertically on the screen -->
<dimen name="navigation_bar_width">130dp</dimen>
编译替换重启OK效果如下
用画图工具量了这次百分百OK ,会当水击三千里,自信人生二百。
状态栏高度及导航栏高度改好以后就是用CarSystemUI替换现在的SystemUI。
替换的原因:
1.原生SystemUI下拉超级丑,一卡一卡的不够流畅
2.之前研究CarOS框架的时候看到基于CarSystemUI做的状态栏和导航栏应用,下拉很流畅,而且自带导航栏浮动窗UI可以放到bottom、left、right,这样就省了很多工作量。
三、替换CarSystemUI
1.CarOS框架关于CarSystemUI的介绍
https://source.android.google.cn/docs/devices/automotive/hmi/system_ui
CarSystemUI介绍地址
需要的可以去这里做深入研究
2.替换CarSystemUI
做这个双屏之前的也是基于Android10同样是芯驰x9m平台开发过一款单屏的MP5的产品,总之下拉各种流畅丝滑,具体实现有些复杂,后面文章再展开讲
总结
这篇文章讲了CarSystemUI实现左侧导航栏NavigationBar及下拉面板的前期准备工作,后续有时间我再介绍状态栏及导航如何实现定制需求