IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 基于CarSystemUI实现左侧导航栏NavigationBar及下拉面板定制开发1——Android10智能座舱 -> 正文阅读

[移动开发]基于CarSystemUI实现左侧导航栏NavigationBar及下拉面板定制开发1——Android10智能座舱


前言

随着车载智能座舱的不断发展,各种新能源车引领了大屏化趋势,Android系统自8.0以后也专门为车载开发做了设计和分支CarOS,CarOS相对传统的手机OS做了很多改变,例如音频控制CarOS使用CarAudioManager直接控制的硬件音量俗称硬音量,传统手机系统使用AudioManager软件控制音量俗称软音量,还有其它汽车周边硬件控制引入了hal开发等等,后续抽时间我会再写一篇文章介绍CarOS音频控制流程和其在车载中的具体应用设计,本篇我们还是按照标题介绍CarSystemUI相关内容。

一、需求说明

公司有智能座舱的开发需求选取的平台是当红的芯驰系列x9m芯片,芯驰芯片主打一芯多屏,一颗芯片同时实现MP5和仪表,具体UI实现参照别克gl8
别克gl8网图
需求:系列图网上查阅可以看到,左边控制栏是在所有界面都要显示包括第三方地图界面(除了倒车界面),倒车的图层等级最高会处理显示到所有图层上面故不考虑倒车的状态

二、修改方案

1.基于需求的两种设计构想

1.按照以前项目经验可以在framework-PhoneWindowManager中将屏幕左侧裁剪出需要的宽度,再在裁剪的区域贴悬浮窗,这种方式我在6.0系统有实现过的案例。

2.用安卓SystemUI自带的导航栏来实现,先要将底部导航栏调到左侧竖直显示。

后有看到CarSystemUI的官网介绍决定选取第二种方式,按照惯例先到网上搜索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里面

 <dimen name="status_bar_height_landscape">64dp</dimen>

是有效的,但是修改导航栏的高度

<dimen name="navigation_bar_height">48dp</dimen>
<dimen name="navigation_bar_height_landscape">48dp</dimen>

两个参数修改不起作用,这里脑海就会浮现那句经典语句:编程是一种思想!!!
用Android studio把机器里面的界面截取出来,用画图工具量一下上面那个截图里面导航栏的高度97px,那么这时我的编程思想就想到肯定系统哪里把navigation_bar_height设置了这个高度,所以又用到

 find ./ -name "*.xml" | xargs grep "navigation_bar_height*"

在这里插入图片描述
然后就看到两个对应的96dp,把96dp的全部改成130,执行:

  1. 编译目录 frameworks/base/core/res
  2. 编译命令 mm,,编译完成后会在out/target/product/mek_8q/system/framework目录下生成framework-res.apk
  3. 验证 将生成的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里面改有效果,当然我再次去里面改了一下状态栏高度验证有效,那么我把

<dimen name="navigation_bar_width">48dp</dimen>

这个拷贝到这个目录里面试试android/packages/services/Car/car_product/overlay/frameworks/base/core/res/res/values/dimens.xml

    <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效果如下
在这里插入图片描述
用画图工具量了这次宽度是130px 。

会当水击三千里,自信人生二百年。

状态栏及导航栏高度改好以后就是用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实现的状态栏和下拉面板,使用特别流畅丝滑,具体实现有些复杂,后面文章再展开讲。

最后放一张我们公司现在的智能座舱产品图
在这里插入图片描述


总结

这篇文章讲了SystemUI实现左侧导航栏NavigationBar的前期准备工作,后续有时间我再介绍状态栏及导航如用CarSystemUI何实现定制需求

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-11-05 00:39:30  更:2022-11-05 00:42:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 22:55:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码