鸿蒙OS开发问题:【尺寸适配算法】

news2024/11/26 20:41:51

背景

如何在HarmonyOS 系统上出设计稿?

问题1: 为什么要计算虚拟高度,即 virtualHeight

static adaptDimension(value: number): number {
  let deviceDisplay: display.Display = GlobalContext.getContext().getObject('display') as display.Display;
  let widthScale = deviceDisplay.width / DESIGN_WIDTH;
  let virtualHeight = widthScale * DESIGN_HEIGHT;
  let designDim = Math.sqrt(DESIGN_WIDTH * DESIGN_WIDTH + DESIGN_HEIGHT * DESIGN_HEIGHT);
  let virtualDim = Math.sqrt(deviceDisplay.width * deviceDisplay.width + virtualHeight * virtualHeight);
  return virtualDim * value / designDim;
}

问题2: 输出值为什么采用 virtualDim * value / designDim 这个公式

答案核心

这是一个以宽为基准的等比例缩放算法

因此,才会出现adaptDimension中的所有代码逻辑

解析

假设设计稿的屏幕是60 x 120, 设计稿中的蓝色图标是 30 x 60, 那么我们想象一下,如果要等比例放大到真实屏幕(240 x 340),那么设计稿的60x120,应该变为多少?

有两种基准:1. 以屏幕宽度为基准 2. 以屏幕高度为基准

我们可以尝试推演一下两种基准

以屏幕宽度为基准

真实屏幕的分辨率为 240 x 340

那么设计稿以同等宽高比放大之后的高度应该为: (120 * 240) / 60 = 480

注意,这个高度比屏幕实际高度大

那么图标以宽占比放大之后的宽度应该为: (30 * 240) / 60 = 120

以屏幕高度为基准

真实屏幕的分辨率为 240 x 340

那么设计稿以同等宽高比放大之后的宽度应该为: (60 * 340) / 120 = 170

注意,这个高度比实际屏幕宽度小

那么图标以高占比放大之后的高度应该为: (60 * 340) / 120 = 170

两种基准的效果图

图中第一行示意图是采用“以屏幕宽为基准”的算法,第二行示意图是采用“以屏幕高度为基准”

基准算法实现

回看“问题1”中的算法实现,其采用的是”以屏幕宽为基准“的算法

const DESIGN_WIDTH = 360;
const DESIGN_HEIGHT = 780;
...

static adaptDimension(value: number): number {
   //获取分辨率,具体的获取代码是在下段代码中
  let deviceDisplay: display.Display = GlobalContext.getContext().getObject('display') as display.Display;
  
  //计算设计稿与设备的宽度缩放比例
  let widthScale = deviceDisplay.width / DESIGN_WIDTH;
  
  //通过宽度的缩放比例计算出,deviceDisplay.width宽度应该对应的高度
  let virtualHeight = widthScale * DESIGN_HEIGHT;
  
  //计算设计稿对角线长度
  let designDim = Math.sqrt(DESIGN_WIDTH * DESIGN_WIDTH + DESIGN_HEIGHT * DESIGN_HEIGHT);
  
  //计算设计稿对应的理想屏幕对角线长度
  let virtualDim = Math.sqrt(deviceDisplay.width * deviceDisplay.width + virtualHeight * virtualHeight);
  
  // 由于是采用宽高比,以宽为基准的计算方法,所以对于输入值来讲,输出值的计算公式为
  // virtualDim / 理想值 = designDim / value
  // 即:virtualDim*value / designDim
  
  return virtualDim * value / designDim;
}

...

   

async onWindowStageCreate(windowStage: window.WindowStage) {
  //获取分辨率, 将获取到的分辨率存放在GlobalContext这个文件中的Map变量中
  GlobalContext.getContext().setObject('display', await display.getDefaultDisplaySync());
 ......
}

接下来,再用“以屏幕高度为基准”来实现一遍

adaptDimension2(value: number): number {
  let deviceDisplay: display.Display = GlobalContext.getContext().getObject('display') as display.Display;

  let deviceHeight = deviceDisplay.height
  console.log('display:' + deviceDisplay.width + 'x' + deviceDisplay.height)

  let heightScale = deviceHeight / DESIGN_HEIGHT;
  let virtualWidth = heightScale * DESIGN_WIDTH;
  let designDim = Math.sqrt(DESIGN_WIDTH * DESIGN_WIDTH + DESIGN_HEIGHT * DESIGN_HEIGHT);
  let virtualDim = Math.sqrt(deviceHeight * deviceHeight + virtualWidth * virtualWidth);
  return virtualDim * value / designDim;
}

质疑

“以屏幕宽度为基准” 这个通过对角线方式实现的等比例缩放算法是不是有点复杂了?

图标.宽 / 设计稿.宽 = 目标图标.宽 / 真实屏幕.宽

目标图标.宽 = 图标.宽 * 真实屏幕.宽 / 设计稿.宽

假设:设计稿宽 360,高780, 图标.宽 30

那么,目标图标.宽 = 30 * 真实屏幕.宽 / 360

真实屏幕.宽 可以通过  display.getDefaultDisplaySync()API获取到

codelabs样例库

关于HarmonyOS实践教程,有一个Demo库:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md, 在这个库中,可以找到和这个研发人员求助的所有函数使用样例代码。

搜狗高速浏览器截图20240326151547.png

  1. codelabs/AlarmClock【API 9】
  2. codelabs/AnimateRefresh【API 9】
  3. codelabs/TransitionAnimation【API 9】
  4. codelabs/HarmonyOS_NEXT/TransitionAnimation/【API 10】
  5. codelabs/HarmonyOS_NEXT/AnimateRefresh/【API 10】

结尾

关于适配,终极目标是要得到UED的还原认可,所以,应该采用哪种算法,最好了解清楚UED还原的过程。要不然容易陷入无休止的返工,甚至永远无法达到适配要求。

鸿蒙最值得程序员入行

为什么这么说?市场是决定人力需求的,数据说话最管用:

1、鸿蒙其全栈自研,头部大厂商都陆续加入合作开发鸿蒙原生应用——人才需求上涨

2、鸿蒙作为新系统、新技术,而现在市面上技术人才少——高薪招聘开启

3、鸿蒙1+8+N生态,不仅只有应用开发;还有车载、数码、智能家居、家电等——就业范围广

4、纯血鸿蒙,目前没有多少人熟悉。都处于0基础同一起跑线——无行业内卷

开发者最需要什么?岗位多、薪资高、不内卷、行业竞争低。而当下的鸿蒙恰恰符合要求。

那么这么好的鸿蒙岗位,应聘要求都很高吧?其实不然鸿蒙作为新出的独立系统,其源头上大家都处于同一水平线上,一开始的技术要求都不会很高,毕竟面试官也是刚起步学习。招聘要求示例:

从信息看出,几乎应职要求是对标有开发经验的人群。可以说鸿蒙对开发者非常友好,尽管上面没提鸿蒙要求,但是面试都会筛选具有鸿蒙开发技能的人。我们程序员都知道学习开发技术,最先是从语言学起,鸿蒙语言有TS、ArkTS等语法,那么除了这些基础知识之外,其核心技术点有那些呢?下面就用一张整理出的鸿蒙学习路线图表示:

从上面的OpenHarmony技术梳理来看,鸿蒙的学习内容也是很多的。现在全网的鸿蒙学习文档也是非常的少,下面推荐一些:完整内容可在头像页保存,或这qr23.cn/AKFP8k甲助力

内容包含:《鸿蒙NEXT星河版开发学习文档》

  • ArkTS
  • 声明式ArkUI
  • 多媒体
  • 通信问题
  • 系统移植
  • 系统裁剪
  • FW层的原理
  • 各种开发调试工具
  • 智能设备开发
  • 分布式开发等等。

这些就是对往后开发者的分享,希望大家多多点赞关注喔!

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

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

相关文章

int的最大值加1会变成int的最小值

一、概要 int是4个字节,总共是32个bit位,所以总共能表示2^32个数 int的最大值是2^31-1,也就是2147483647,大约21亿多 减的那个1表示自然数0的位置 int的最小值是-2^31,也就是-2147483648,大约负的21亿多…

[网鼎杯 2020 朱雀组]Nmap1

打开题目 在源代码中看到了提示 先随便输入127.0.0.1 那我们试试输入 127.0.0.1 | ls 可以看到 | 被转义符号\所转义 那我们输入 127.0.0.1 /| ls 得到三条反斜线 我们猜测,我们输入的东西是被escapeshellarg和escapeshellcmd处理过后的结果 我们输入的东西必须…

银行监管报送系统介绍(十六):外汇数据报送(BOP,ACC,FAL,JSH,CWD)

2023年5月初,外管局发布了《通过银行进行国际收支统计申报业务指引(2023年版)》,该报送指引主要针对的是外管局的国际收支统计(即BOP)模块的报送。 附件 1 通过银行进行国际收支统计申报业务指引 &#x…

基于PHP后台微信网上购物商城小程序系统设计与实现(安装部署+源码+文档)

博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

ArcGIS操作(四)

任务: 根据江苏省夜间灯光影像完成数据处理与分析查阅统计年鉴数据以提取建成区空间分布位置完成建成区重心转移轨迹 步骤: 这里选取江苏省2000年、2004年、2008年夜光数据进行分析 加载影像 掩膜提取 投影 栅格转面 融合 栅格转面数据时分冗余&…

Echarts实现高亮某一个点

背景 接口会返回所有点的数据,以及最优点的数据。产品要求在绘制图形后,高亮最优点,添加一个红色的样式,如图。点击select选择器时,可选择不同指标和花费对应的关系。 以下介绍实现思路 1、自定义配置选择器的数据源…

MS SQL Server STUFF 函数实战 统计记录行转为列显示

目录 范例运行环境 视图样本设计 数据统计要求 STUFF函数实现 小结 范例运行环境 操作系统: Windows Server 2019 DataCenter 数据库:Microsoft SQL Server 2016 视图样本设计 假设某一视图 [v_pj_rep1_lname_score] 可查询对某一被评价人的绩效…

【解决方案】荣耀系统Android8.0 system目录Read-only file system

本来以为直接把Charles证书改成系统证书格式,然后通过mt管理器root之后移动到系统证书目录就行了,结果访问baidu仍然显示网络错误,折腾一晚上。安装为用户证书,又与系统证书冲突。 手机型号:荣耀v10 EMUI&#xff1a…

ardupilot开发 --- 远程标识 篇

1. wifi协议 https://zhuanlan.zhihu.com/p/660568077 AP 无线接入点 路由器STA 站点 接入路由器的终端SSID 标识符 无线网络的名称信标祯 Beacon AP通过广播Beacon祯来告诉想要接入者(STA)无线网络的信息,如SSIDWLAN数据帧 Wi-Fi网络中传输数据时所使用的数据帧格…

Oracle客户端如何连接远程数据库?

Oracle是一种常用的数据库管理系统,它具有高效、稳定的特性,广泛应用于各行各业。为了实现远程数据库的连接,我们可以使用Oracle客户端工具。本文将介绍如何使用Oracle客户端连接远程数据库,并讨论其使用场景。 Oracle客户端工具 …

parallel linux虚拟机没有root权限

前言 今天刚在parallel上装上linux虚拟机,安装的是Debian发行版。用终端输入命令时,无意间发现当前用户竟然不是root用户,岂有此理!众所周知,Linux系统一般安装之后都是默认root用户的,但是可能parallel先…

简单几分钟将GPT部署到移动磁盘,从此不需要网络带着跑

Chat GPT 发布已经一年多,目前也有很多平替产品出现,为什么我们还是需要一个本地可以跑在电脑上的 GPT 模型呢? 隐私:使用某个公司提供的服务,避免不了你的个人数据安全无法得到保障,特别如果你要咨询关于…

软件工程知识体系 Chapter3 软件构造

介绍 软件构造一词指的是通过编码、验证、单元测试、集成测试和调试等组合详细创建工作软件的过程。 软件构建知识领域(KA)与所有其他KA都有关联,但它与软件设计和软件测试的关联最为紧密,因为软件构建过程涉及重要的软件设计和…

Jupyter Notebook启动及其常用快捷键

添加图片注释,不超过 140 字(可选) 1.JupyterNotebook 第一种启动方式 点击 windows 电脑左下角开始 > 搜索 Anaconda > 点击 Anaconda Prompt 添加图片注释,不超过 140 字(可选) 在命令行窗口输入&…

操作系统:浅谈文件系统

目录 1.理解文件系统 1.1.从磁盘开始的抽象存储结构 ​编辑 1.2.操作系统下的文件管理 1.2.1.知识储备 1.2.2.存储文件的属性 1.2.3.存储文件的内容 1.2.4.如何新建文件 1.2.5.如何理解目录 1.2.6.如何找到某一个文件 1.3.操作系统如何打开文件 2.软硬链接 我们知…

智慧开发平台免!费!申请试用

原创 F学社 F学社 2024-04-01 17:13 江苏 扫描二维码即可申请试用 01 智慧开发平台简介 F1 WIFI智慧教育平台是可支持线上线下联动的基于FPGA的口袋式数字系统学习平台。其采用了AMD、Altera、安路、高云等国外国内主流公司的FPGA进行数字系统方向的教学实验设计&#xff0c…

《云原生安全攻防》-- K8s集群安全风险分析

在这个数字化快速发展的年代,云原生安全变得越来越重要。我明白对于很多朋友来说,这是一个既新奇又复杂的领域。因此,我整合了以往的专业积累,精心打造了一个专门讲解云原生安全的系列课程,目的是能给大家带来有价值的…

9Proxy,跨境电商一站式解决方案

文章目录 跨境电商什么是跨境电商跨境电商的机遇跨境电商技术支撑 海外代理IP什么是海外代理IP海外代理IP的作用如何选择海外代理IP 9Proxy9Proxy的优势9Proxy的解决方案价格汇总搜索引擎优化市场调查多重核算数据抓取广告技术 价格上手体验注册登录下载安装数据采集 总结福利 …

【数据结构】——二叉树堆的实现

大佬们点点关注,点点赞?! 前言 在上篇博客中我们已经介绍了树和二叉树的相关概念,相信大家都已经清楚了树和二叉树的基本思想,下面我们就来着重看看二叉树堆的实现。 在看堆的实现,我们先看看二叉树的顺…

Linux 安装部署高性能缓存服务redis

Linux 系统安装Redis 5 注意事项: 下载Redis 文件包,并上传至linux服务上解压 tar -zxvf redis.tar安装: 编译 make PREFIX/usr/local/redis install配置: redis.conf daemonize yes bind 127.0.0.1 192.168.1.221 supervised…