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

news2025/2/25 1:13:52

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 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
别克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,执行

  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里面改有效果,当然我再次去里面改了一下状态栏高度验证有效,那么我把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及下拉面板的前期准备工作,后续有时间我再介绍状态栏及导航如何实现定制需求

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用多阶段和多尺度联合通道协调注意融合网络进行单图去雨[2022论文]

这是篇2022年来自一区的International Journal of Intelligent Systems的贵州大学的去雨论文 论文链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;zdje ✍介绍 作者提出的问题&#xff1a; 1、目前去雨方法不能对不同密度和方向的雨条纹信息进行有效的编码 2、…

ThreadLocal类详解

ThreadLocal类注释翻译 打开JDK中ThreadLocal类源码&#xff0c;翻译类上注释如下(提取重点部分): 每个访问ThreadLocal实例对象的线程都有其自己的关于ThreadLocal对象的变量副本(通过get和set方法)&#xff0c;只要线程存活而且ThreadLocal对象也存活&#xff0c;则线程都保…

嵌入式和单片机开发模式的区别

一、 开发模式 单片机开发多为裸机&#xff0c;程序规模小&#xff0c;多为单个程序员独立开发。有些复杂产品也会使用高端单片机如STM32之类&#xff0c;并使用RTOS(uCOS、freeRTOS等)。嵌入式开发几乎全部基于嵌入式操作系统&#xff0c;目前使用最多的是 linux 和Android。…

公众号搜题接口系统使用方法

公众号搜题接口系统使用方法 本平台优点&#xff1a;免费查题接口搭建 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a;题库后台http://daili.jueguangzhe.c…

html实现飞机小游戏(源码)

文章目录1.思路讲解1.1 游戏设计1.2 主界面1.3 倒计时进入游戏1.4 游戏效果1.3 游戏结束2.实现源码2.1 游戏动态效果2.2 游戏主代码2.3 源码目录源码下载作者&#xff1a;xcLeigh 文章说明 html实现飞机大战源码&#xff0c;酷炫的界面效果&#xff0c;有四款飞机大战背景&…

Elasticsearch:通过热、温、冷和冻结层管理数据自动化 — 无需编码!

如果你想完全按照本文标题的建议去做&#xff0c;那就别无所求。 这篇文章旨在指导如何使用 Kibana Dashboard 的 “堆栈管理&#xff08;Stack Management&#xff09;” 功能集通过热、温、冷和冻结层自动移动数据&#xff0c;而无需进行任何编码或执行命令行动作。 在下面的…

Cookie 和 Session

本文主要讲解一下 Cookie 和 Session 的关系和区别&#xff0c;大家都知道 Session 比 Cookie 安全&#xff0c;Session 是存储在服务器端的&#xff0c;Cookie 是存储在客户端的&#xff0c;然而更详细的说&#xff0c;恐怕就不太清楚了 文章目录1. 什么是 HTTP2. Cookie2.1 图…

​目标检测算法——YOLOv5/YOLOv7改进之结合Criss-Cross Attention

关注”PandaCVer“公众号 深度学习Tricks&#xff0c;第一时间送达 &#xff08;一&#xff09;前沿介绍 论文题目&#xff1a;CCNet: Criss-Cross Attention for Semantic Segmentation 论文地址&#xff1a;https://arxiv.org/pdf/1811.11721.pdf 代码地址&#xff1a;ht…

B树和B+树(平衡多路查找树)

文章目录为什么需要B树B 树的特点B树的查找B树的引入B树的删除链接&#xff1a;https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 可以点击 Indexing 下的 B Trees 和 B Trees 去学习。 为什么需要B树 对 B 树的需求随着访问物理存储介质&#xff08;如硬盘&…

【Java】反射, 枚举,Lambda表达式

✨博客主页: 心荣~ ✨系列专栏:【Java SE】 ✨一句短话: 难在坚持,贵在坚持,成在坚持! 文章目录一. 反射1. 反射的概述2. 反射的使用2.1 反射常用的类2.2 通过反射获取Class对象2.3 获得Class类相关的方法2.4 使用反射创建实例对象2.5 使用反射获取实例对象中的构造方法2.6 通过…

Spring学习第1篇:学习spring必备的概念知识

大家家好&#xff0c;我是一名网络怪咖&#xff0c;北漂五年。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深Java选手&#xff0c;深知Spring重要性&#xff0c;现在普遍都使用SpringBoot来开发&#xff0c;面试的时候SpringBoot原理也是经常会问到&…

纸牌博弈问题

纸牌博弈问题 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;纸牌博弈问题 CSDN&#xff1a;纸牌博弈问题 题目描述 有一个整型数组 A&#xff0c;代表数值不同的纸牌排成一条线。玩家 a 和玩家 b 依次拿走每张纸牌&#xff0c; 规定玩家 a 先拿&#xff…

win11开机音效设置的方法

微软为win11重做了开机音效&#xff0c;与我们一直以来使用的开机音效不太一样&#xff0c;听起来很不舒服&#xff0c;因此我们可以通过设置开机音效的方法来修改它&#xff0c;只要在个性化设置中就可以找到了&#xff0c;下面一起来试试看吧。 win11开机音效怎么设置&#…

wordpress图片压缩插件-免费批量wordpress图片压缩

wordpress图片压缩插件&#xff0c;相信每个人都知道图片的太大会影响到网站的加载速度。过多的图像会对服务器产生相应的压力。导致网站打开会越来越慢。而图片也是会被搜索引擎收录的&#xff0c;可以在百度图片里面能搜索的到&#xff0c;也算是增加了网站的宣传力度。今天给…

(附源码)计算机毕业设计SSM基于微信平台的匿名电子投票系统

&#xff08;附源码&#xff09;计算机毕业设计SSM基于微信平台的匿名电子投票系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

【微信小程序支付功能】uniapp实现微信小程序支付功能

支付实现流程 首先前端写一个页面&#xff0c;简单说就是有一个输入支付金额的 然后有一个按钮&#xff0c;点击可以支付。 点击按钮后触发支付方法&#xff0c;就是我下面写的这些代码&#xff0c;复制就可以了。 然后先请求后端的一个方法&#xff0c;把你的价格还有openid之…

在Vue中使用Swiper轮播图、同时解决点击轮播图左右切换按钮不生效的问题、同时将轮播图抽离出为一个公共组件

轮播图左右的切换按钮、如果点击没有反应&#xff0c;控制台也没有报错。很大可能是版本问题。如果不指定版本信息、默认安装的是最新的版本。版本过高或者过低都有可能导致无效。目前兼容性和稳定性比较好的是&#xff1a;5.4.5。 官网地址&#xff1a;https://www.swiper.com…

【隧道应用-1】netsh端口映射内网

1、端口映射 是指将一台主机的内网&#xff08;LAN&#xff09;IP 地址映射成一个公网&#xff08;WAN&#xff09;IP 地址&#xff0c;当用户访问提供映射端口主机的某个端口时&#xff0c;服务器将请求转移到本地局域内部提供这种特定服务的主机&#xff1b;利用端口映射功能…

猿创征文|程序员的浪漫(代码猜诗词)

✅作者简介&#xff1a; 全栈领域新星创作者&#xff0c;阿里云专家博主&#xff0c;华为云云享专家博主&#xff0c;掘金后端评审团成员&#xff0c; &#x1f495;前言&#xff1a;在大众的认知里&#xff0c;程序员只是一群坐在电脑前熬夜敲代码的…

webrtc 笔记

webrtc主要步骤 navigator.mediaDevices.getUserMedia({audio:true,redio:true}) 获取用户的摄像头状态,返回媒体流,把媒体流赋给video的srcObject属性,就能在页面上展示自己的音视频 let peer new RTCPeerConnection(servers) 创建peer实例,通过这个实例的一系列方法实现p2p…