当前位置: 首页 > news >正文

AR 眼镜之-充电动画定制-实现方案

目录

📂 前言

AR 眼镜系统版本

充电动画

1. 🔱 技术方案

1.1 方案介绍

1.2 实现方案

关机充电动画

亮屏/锁屏充电动画

2. 💠 关机充电动画

2.1 关机充电动画核心处理类与路径

2.2 实现细节

步骤一:1)定制 ui.c 文件,适配分辨率

步骤一:2)定制 ui.c 文件,定制动画 UI

步骤二:新增定制的动画 UI 相关png图片

3. ⚛️ 亮屏/锁屏充电动画

3.1 亮屏/锁屏充电动画时序图

3.2 实现细节

步骤一:注册广播 Action 监听充电接通/断开/充满电等状态

步骤二:开发充电接通/断开/充满电的系统弹窗,显示对应动画

4. ✅ 小结


📂 前言

AR 眼镜系统版本

        W517 Android9。

充电动画

        Android 充电动画分为:关机充电动画 与 亮屏/锁屏充电动画,而且据了解 Android 原生系统只提供了关机充电动画,并未提供亮屏/锁屏充电动画,所以对于关机情况下需要定制,亮屏/锁屏情况下需要增加。

1. 🔱 技术方案

1.1 方案介绍

        技术方案概述:对于关机充电动画,是通过 minui 开发的,主要定制 ui.c 文件以及 /images/*.png 图片;对于亮屏/锁屏充电动画,主要通过监听系统充电连接、断开和充满电的广播去实现。

1.2 实现方案

关机充电动画
  1. 定制 ui.c 文件,适配分辨率,定制动画 UI;

  2. 新增定制的动画 UI 相关png图片。

亮屏/锁屏充电动画
  1. 注册 ACTION_POWER_CONNECTED、ACTION_POWER_DISCONNECTED、ACTION_BATTERY_OKAY 等广播 Action 监听充电接通/断开/充满电等状态;

  2. 开发充电接通/断开/充满电的系统弹窗,显示对应动画。

2. 💠 关机充电动画

2.1 关机充电动画核心处理类与路径

  1. 关机充电动画 UI 处理类:w517\vendor\sprd\proprietories-source\charge\ui.c

  2. 关机充电动画图片存放路径:w517\vendor\sprd\proprietories-source\charge\images\

  3. AR 眼镜上的充电动画图片存放路径:/vendor/etc/res/images/

2.2 实现细节

步骤一:1)定制 ui.c 文件,适配分辨率

步骤一:2)定制 ui.c 文件,定制动画 UI

步骤二:新增定制的动画 UI 相关png图片

3. ⚛️ 亮屏/锁屏充电动画

3.1 亮屏/锁屏充电动画时序图

3.2 实现细节

步骤一:注册广播 Action 监听充电接通/断开/充满电等状态
class BatteryListener(context: Context) {private val TAG = BatteryListener::class.java.simpleNameprivate val mContext: Contextprivate val mReceiver: BatteryBroadcastReceiverprivate val mBatteryChargeWindow: BatteryChargeWindowinit {mContext = contextmReceiver = BatteryBroadcastReceiver()mBatteryChargeWindow = BatteryChargeWindow()}fun register() {Log.e(TAG, "register: ")val filter = IntentFilter()
//        filter.addAction(Intent.ACTION_BATTERY_CHANGED) // 电量发生改变filter.addAction(Intent.ACTION_BATTERY_LOW) // 电量低filter.addAction(Intent.ACTION_BATTERY_OKAY) // 电量充满filter.addAction(Intent.ACTION_POWER_CONNECTED) // 接通电源filter.addAction(Intent.ACTION_POWER_DISCONNECTED) // 拔出电源mContext.registerReceiver(mReceiver, filter)mBatteryChargeWindow.init(mContext)}fun unregister() {Log.e(TAG, "unregister: ")mContext.unregisterReceiver(mReceiver)}private inner class BatteryBroadcastReceiver : BroadcastReceiver() {override fun onReceive(context: Context, intent: Intent) {Log.e(TAG, "onReceive: ${intent.action}")when (intent.action) {
//                Intent.ACTION_BATTERY_CHANGED -> {
//
//                }Intent.ACTION_BATTERY_LOW -> {}Intent.ACTION_BATTERY_OKAY -> {mBatteryChargeWindow.finishCharge()}Intent.ACTION_POWER_CONNECTED -> {SoundPoolTools.play(context, SoundPoolTools.MUSIC, R.raw.notification_power_connected)mBatteryChargeWindow.startCharge()}Intent.ACTION_POWER_DISCONNECTED -> {}}}}}
步骤二:开发充电接通/断开/充满电的系统弹窗,显示对应动画
class BatteryChargeWindow {private lateinit var mContext: Contextprivate lateinit var mWindowManager: WindowManagerprivate lateinit var mBatteryChargeView: Viewprivate lateinit var mChargingAnimation: LottieAnimationViewprivate lateinit var mFinishedChargingAnimation: LottieAnimationViewprivate lateinit var mBattery: AGGTextViewprivate var mLayoutParams: WindowManager.LayoutParams? = nullprivate var mIsBarWindowAdded = falseprivate val mUiHandler = Handler(Looper.getMainLooper())fun init(context: Context) {mContext = context.applicationContextmWindowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManagerinitLayoutParams()initView()}fun startCharge() {initLayoutParams()addBarWindow()mChargingAnimation.visibility = View.VISIBLEmChargingAnimation.playAnimation()mBattery.text = getBatteryLevel()mUiHandler.postDelayed({mChargingAnimation.cancelAnimation()mChargingAnimation.visibility = View.GONEremoveBarWindow()}, BATTERY_CHARGE_TIME_OUT)}@SuppressLint("SetTextI18n")fun finishCharge() {initLayoutParams()addBarWindow()mFinishedChargingAnimation.visibility = View.VISIBLEmFinishedChargingAnimation.playAnimation()mBattery.text = "100%"mUiHandler.postDelayed({mFinishedChargingAnimation.cancelAnimation()mFinishedChargingAnimation.visibility = View.GONEremoveBarWindow()}, BATTERY_CHARGE_TIME_OUT)}private fun initLayoutParams() {mLayoutParams = WindowManager.LayoutParams().apply {type = WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANELval density = mContext.resources.displayMetrics.densitywidth = (640 * density).toInt()height = (640 * density).toInt()flags =WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN or WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR or WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH or WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITSformat = PixelFormat.RGBA_8888 // 去除默认时有的黑色背景,设置为全透明gravity = Gravity.CENTERtitle = Constants.AGG_SYSUI_BATTERY_CHARGEx = 0y = 0dofIndex = 1 //  默认为1。 为0,则表示窗口为0DOF模式;为1,则表示窗口为3DOF模式;为2,则表示窗口为6DOF模式。setTranslationZ(Constants.TRANSLATION_Z_150CM)setRotationXAroundOrigin(-XrEnvironment.getInstance().headPose.roll)setRotationYAroundOrigin(-XrEnvironment.getInstance().headPose.yaw)setRotationZAroundOrigin(-XrEnvironment.getInstance().headPose.pitch)}}private fun initView() {mBatteryChargeView =LayoutInflater.from(mContext).inflate(R.layout.battery_charge_layout, null, false)mChargingAnimation = mBatteryChargeView.findViewById(R.id.charging)mFinishedChargingAnimation = mBatteryChargeView.findViewById(R.id.finishedCharging)mBattery = mBatteryChargeView.findViewById(R.id.battery)}private fun addBarWindow() {mUiHandler.post {synchronized(this) {if (!mIsBarWindowAdded) {try {mWindowManager.addView(mBatteryChargeView, mLayoutParams)} catch (e: Exception) {e.printStackTrace()}mIsBarWindowAdded = true}}}}private fun removeBarWindow() {mUiHandler.post {synchronized(this) {if (mIsBarWindowAdded) {try {mWindowManager.removeViewImmediate(mBatteryChargeView)} catch (e: Exception) {e.printStackTrace()}mIsBarWindowAdded = false}}}}/*** 获取剩余电池容量占总容量的整数百分比*/private fun getBatteryLevel(): String {val batteryManager = mContext.getSystemService(BATTERY_SERVICE) as BatteryManagerreturn batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY).toString() + "%"}}

4. ✅ 小结

        对于充电动画定制,本文只是一个基础实现方案,更多业务细节请参考产品逻辑去实现。

        另外,由于本人能力有限,如有错误,敬请批评指正,谢谢。


相关文章:

AR 眼镜之-充电动画定制-实现方案

目录 📂 前言 AR 眼镜系统版本 充电动画 1. 🔱 技术方案 1.1 方案介绍 1.2 实现方案 关机充电动画 亮屏/锁屏充电动画 2. 💠 关机充电动画 2.1 关机充电动画核心处理类与路径 2.2 实现细节 步骤一:1)定制 …...

AJAX-XMLHttpRequest 详解

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 前言 XMLHttpRequest 概述 主要用途 工作流程 示例代码 GET 请求示例 POST 请求示例 注意事项 工作…...

内容管理系统 Contentful 与 Baklib

对于希望管理其产品和服务的在线文档或知识库以支持其客户和员工的组织来说,市场上有太多的平台和工具。 遵循的做法之一是使用无头内容管理系统 (CMS)。 如果您是这样的组织之一,正在考虑使用无头 CMS - Contentful 之一来管理您的在线知识库&#xff0…...

[Mysql-视图和存储过程]

视图 视图是从一个或者几个基本表(或视图)导出的表。它与基 本表不同,是一个虚表。 创建使用视图 # 视图 -- 视图只能用来查询,不能做增删改 -- 创建视图 -- create view 视图名【view_xxx / v_xxx】 -- as 查询语句 create view…...

Linux下C++静态链接库的生成以及使用

目录 一.前言二.生成静态链接库三.使用静态链接库 一.前言 这篇文章简单讨论一下Linux下如何使用gcc/g生成和使用C静态链接库&#xff08;.a文件&#xff09;。 二.生成静态链接库 先看下目录结构 然后看下代码 //demo.h#ifndef DEMO_H #define DEMO_H#include<string&g…...

【8月EI会议推荐】第四届区块链技术与信息安全国际会议

一、会议信息 大会官网&#xff1a;http://www.bctis.nhttp://www.icbdsme.org/ 官方邮箱&#xff1a;icbctis126.com 组委会联系人&#xff1a;杨老师 19911536763 支持单位&#xff1a;中原工学院、西安工程大学、齐鲁工业大学&#xff08;山东省科学院&#xff09;、澳门…...

2024年【甘肃省安全员B证】考试资料及甘肃省安全员B证模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年甘肃省安全员B证考试资料为正在备考甘肃省安全员B证操作证的学员准备的理论考试专题&#xff0c;每个月更新的甘肃省安全员B证模拟试题祝您顺利通过甘肃省安全员B证考试。 1、【多选题】5kW以上电动机开关箱中电…...

结合el-upload上传组件,验证文件格式及大小

结合el-upload上传组件&#xff0c;验证文件格式及大小 效果如下&#xff1a; 代码如下&#xff1a; upgradeFirmwareInfo.vue页面 <template><div><el-dialog title"新增固件升级包" :visible.sync"dialogFormVisible"top"7vh&qu…...

配置php-fpm服务

nginx(unix domain socket方式) server {listen 80;#root /test/php/publiclocation / {#URL重写 例如隐藏index.phpif (!-f $request_filename) {rewrite ^(.*)$ /index.php?s/$1 last;break;}}location ~ [^/]\.php(/|$) {#try_files $uri 404;fastcgi_index index.php;…...

科普文:Linux系统安全加固指南

本指南仅关注安全性和隐私性&#xff0c;而不关注性能&#xff0c;可用性或其他内容。 列出的所有命令都将需要root特权。以“$”符号开头的单词表示一个变量&#xff0c;不同终端之间可能会有所不同。 选择正确的Linux发行版 选择一个好的Linux发行版有很多因素。 避免分发…...

MFC开发,自定义消息

在MFC开发中&#xff0c;主要核心机制就是消息机制。QT与之类似的机制就是信号与槽。QT中的信号与槽是非常容易自定义的&#xff0c;MFC也是如此&#xff0c;自定义也是比较方便&#xff0c;况且自定义消息或者控件在整个GUI图形化界面开发中也是非常重要的部分&#xff0c;上篇…...

如何在 SpringBoot 中优雅的做参数校验?

一、故事背景 关于参数合法性验证的重要性就不多说了&#xff0c;即使前端对参数做了基本验证&#xff0c;后端依然也需要进行验证&#xff0c;以防不合规的数据直接进入服务器&#xff0c;如果不对其进行拦截&#xff0c;严重的甚至会造成系统直接崩溃&#xff01; 本文结合…...

Godot入门 03世界构建1.0版

在game场景&#xff0c;删除StaticBody2D节点&#xff0c;添加TileMap节点 添加TileSet图块集 添加TileSet源 拖动图片到图块&#xff0c;自动创建图块 使用橡皮擦擦除。取消橡皮擦后按住Shift创建大型图块。 进入选择模式&#xff0c;TileMap选择绘制&#xff0c;选中图块后在…...

GitHub每日最火火火项目(7.26)

1. 项目名称&#xff1a;meta - llama / llama3 项目介绍&#xff1a;这是 Meta Llama 3 的官方 GitHub 站点。目前尚不清楚该项目的具体功能和特点&#xff0c;但从名称推测&#xff0c;它可能与 Llama 3 模型相关&#xff0c;或许涉及到该模型的开发、训练或应用等方面。 项…...

微服务实践和总结

H5原生组件web Component Web Component 是一种用于构建可复用用户界面组件的技术&#xff0c;开发者可以创建自定义的 HTML 标签&#xff0c;并将其封装为包含逻辑和样式的独立组件&#xff0c;从而在任何 Web 应用中重复使用。 <!DOCTYPE html> <html><head…...

Spring Boot中的策略模式:优雅地处理不同商品类型的订单

引言 在开发复杂的业务系统时&#xff0c;我们经常会遇到需要根据不同条件执行不同逻辑的情况。例如&#xff0c;在电商平台中&#xff0c;可能需要根据商品的不同类型&#xff08;如电子产品、服装、食品等&#xff09;来执行不同的业务逻辑&#xff0c;比如不同的库存管理、…...

django_创建菜单(实现整个项目的框架,调包)

文章目录 前言代码仓库地址在线演示网址启动网站的时候出现错误渲染路径的一些说明文件结构网页显示一条错误路由顺序js打包出现问题的代码函数没有起作用关于进度开发细节显示不了图片梳理一下函数调用的流程修改一些宽度参数classjs 里面的一些细节让三个按钮可以点击设置按钮…...

最新全新UI异次元荔枝V4.4自动发卡系统源码

简介&#xff1a; 最新全新UI异次元荔枝V4.4自动发卡系统源码 更新日志&#xff1a; 1增加主站货源系统 2支持分站自定义支付接口 3目前插件大部分免费 4UI页面全面更新 5分站可支持对接其他分站产品 6分站客服可自定义 7支持限定优惠 图片&#xff1a; 会员中心截图&…...

PyTorch安装CUDA标准流程(可解决大部分GPU无法使用问题)

最近一段时间在研究PyTorch中的GPU的使用方法&#xff0c;之前曾经安装过CUDA&#xff0c;不过在PyTorch中调用CUDA时无法使用。考虑到是版本不兼容问题&#xff0c;卸载后尝试了其他的版本&#xff0c;依旧没有能解决问题&#xff0c;指导查阅了很多资料后才找到了解决方案。 …...

C++从入门到起飞之——初始化列表类型转换static成员 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1、初始化列表 2、 类型转换 3. static成员 4、完结散花 1、初始化列表 • 之前我们实现构造函数…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...