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

【HarmonyOS学习日志(9)】一次开发,多端部署之界面级一多开发

关于一次开发,多端部署

一次开发多端部署就是指一套代码工程,一次开发上架,多端按需部署(一多),用于支撑开发者快速高效地开发多终端设备上的应用,以节省开发成本。

HarmonyOS系统面向多终端,提供了一次开发多端部署的相关能力,让开发者基于一种设计高效构建多端可运行的应用。

最明显的表现就是实现不同比例屏幕的组件布局情况。

如图所示,同一套组件在不同比例屏幕上所呈现的布局不同。

除去由屏幕不同形成的布局适配问题之外,还有因不同设备系统形成的功能兼容问题。并且还要考虑在代码层面的组织实现。

在学习过程中,有如下解决思路

界面级一多开发

布局能力
自适应布局(Adaptive Layout)

元素可以根据相对关系自动变化以适应外部容器变化的布局能力。当前开发框架提炼了七种自适应布局能力,这些布局可以独立使用,也可多种布局叠加使用。

七种自适应布局能力:

  • 拉伸能力:容器组件尺寸发生变化时,增加或减小的空间全部分配给容器组件内指定区域。

  • 实现方式:Flex布局的flexGrow和flexShrink属性。

  • 均分能力:容器组件尺寸发生变化时,增加或减小的空间均匀分配给容器组件内所有空白区域。

  • 实现方式:Row组件,Column组件或Flex组件的justifyContent属性设置为FlexAlign.SpaceEvenly。

  • 占比能力:子组件的宽或高按照预设的比例,随容器组件发生变化。

  • 实现方式:将子组件的宽高比设置为父组件宽高的百分比或者layoutWeight属性。

  • 缩放能力:子组件的宽高按照预设的比例,随容器组件发生变化,且变化过程中子组件的宽高比不变。

  • 实现方式:布局约束的aspectRatio属性。

  • 延伸能力:容器组件内的子组件,按照其在列表中的先后顺序,随容器组件尺寸变化显示或隐藏。

    实现方式:基于容器组件的两种实现方式:

    • 通过List组件实现

    • 通过Scroll组件配合Row组件或Column组件实现

  • 隐藏能力:容器组件内的子组件,按照其预设的显示优先级,随容器组件尺寸变化显示或隐藏。相同显示优先级的子组件同时显示或隐藏。

  • 实现方式:布局约束的displayPriority属性。

  • 拆行能力:容器组件尺寸发生变化时,如果布局方向尺寸不足以显示完整内容,自动换行。

  • 实现方式:Flex组件的wrap属性设置为FlexWrap.Wrap。

响应式布局(Responsive Layout)

元素可以根据特定的特征(如窗口宽度、屏幕方向等)出发变化以适应外部容器变化的布局能力。响应式布局基于断点、媒体查询、栅格等能力实现。

断点和媒体查询

断点:将窗口宽度划分为不同的范围(即断点),监听窗口尺寸变化,当断点改变时同步调整页面布局。注意,断点支持自定义,取值范围可修改扩展,下表是常用的4个断点范围。

媒体查询:媒体查询提供了丰富的媒体特征监听能力,可以监听应用显示区域变化,横竖屏,深浅色,设备类型等等。

栅格布局

根据设备的水平宽度,将不同的屏幕尺寸划分为不同数量的栅格,来实现屏幕的自适应。且栅格和栅格之间可以设置一个间距。

  • 可以调节布局占栅格的数量(设置参数span)、偏移量(设置参数offset),来实现栅格的适配。

  • 可以修改断点的取值范围,支持启用最多6个断点(设置breakpoints的value参数)。

栅格组件应用场景

  • 缩进布局:

    • 通过设置GridCol的span属性分配组件所占栅格列数

    • 通过设置GridCol的offset、GridRow的gutter等属性改变间距,实现最佳效果。

  • 挪移布局:通过设置GridCol的span属性分配组件所占栅格列数。

  • 重复布局:通过设置GridCol的span属性分配组件所占栅格列数。

视觉风格

分层参数

为了保证各组件有相同风格的默认样式,或者为了保证HarmonyOS系统应用有统一的风格。UX定义了一套系统资源,预置在系统中,开发者可以直接使用,称为分层参数。

@Entry
@Component
struck Index {build() {Row() {Column() {Text('分层参数').fontColor($r('sys.color.ohos_id_color_primary')).fontSize($r('sys.float.ohos_id_text_size_headline3'))}}.backgroundColor($r('sys.color.ohos_id_color_background'))}
}

 使用了分层参数后,当系统切换深色模式时,字体和背景也可以自适应。

自定义资源

开发者可以在resource目录中通过限定词目录来定义不同设备状态的资源,资源可以按照"key-value"的形式自定义。应用在运行态选择使用某资源时,系统会根据设备状态优先从相匹配的目录中寻找资源。

交互归一

对于不同类型的智能设备,用户可能有不同的交互方式,如通过触摸屏、鼠标、触控板等。针对不同来自不同输入设备的相同输入,通过交互归一提供给开发者统一的API。交互归一后开发者无需关注当前设备和输入设备类型,只需在交互归一事件接口中做逻辑响应即可。

缩放

以缩放交互为例,通过多指触控的张合来完成缩放动作,在多设备场景下,缩放交互会出现多种不同的操作输入方式,如表所示。在开发接口上,这些缩放操作都统一为PinchGesture的API事件

Image()
.scale({ x: this.scaleValue, y: this.scaleValue, z: 1 })
.gesture(//双指捏合触发该手势事件PinchGesture({ fingers: 2 }).onActionStart((event?: GestureEvent)=>{}).onActionUpdate((event?: GestureEvent)=>{this.scaleValue = this.pinchValue * event.scale}).onActionEnd(()=>{this.pinchValue = this.scaleValue})
)

组件归一响应

当应用部署在不同设备上供用户使用时,需要支持多种I/O设备,界面呈现出相应的状态为用户提供正确的视觉引导。例如触摸时显示按压状态,鼠标特有的悬停状态,键盘走焦状态。

相关文章:

【HarmonyOS学习日志(9)】一次开发,多端部署之界面级一多开发

关于一次开发,多端部署 一次开发多端部署就是指一套代码工程,一次开发上架,多端按需部署(一多),用于支撑开发者快速高效地开发多终端设备上的应用,以节省开发成本。 HarmonyOS系统面向多终端&…...

基于Java+SSM+JSP+MYSQL实现的宠物领养收养管理系统功能设计与实现六

一、前言介绍: 免费学习:猿来入此 1.1 项目摘要 随着人们生活水平的提高,宠物已经成为越来越多家庭的重要成员。然而,宠物的数量增长也带来了一系列问题,如流浪宠物数量的增加、宠物健康管理的缺失以及宠物领养收养…...

Java项目实战II基于微信小程序的课堂助手(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在数字化教…...

解析 Android WebChromeClient:提升 WebView 用户体验的关键组件

文章目录 一、总览二、详细说明三、一些实际和有趣的应用四、最佳实践五、与其他组件的比较六、安全性考虑:防止 XSS 攻击与数据泄露6.1 介绍6.2 代码案例6.2.1 输入过滤6.2.2 Content Security Policy (CSP) 案例 六、总结 在 Android 开发中,WebChrome…...

【LeetCode热题100】字符串

本篇博客记录了关于字符串相关的几道题目&#xff0c;包括最长公共前缀、最长回文子串、二进制求和、字符串相乘。 //解法1 class Solution { public:string longestCommonPrefix(vector<string>& strs) {string ret strs[0];for(int i 1 ; i < strs.size() ; i…...

OceanBase 闪回查询

前言 在OB中&#xff0c;drop表可以通过 回收站 或者 以往的备份恢复来还原单表。当delete数据时&#xff0c;由于delete操作的对象不会进入回收站&#xff0c;此时需要通过闪回查询功能查看delete的数据&#xff0c;以便后续恢复 本次实验版本为 OceanBase 4.2.1.8&#xff0…...

C++析构函数详解

C析构函数详解&#xff1a;对象销毁与资源清理 在 C 中&#xff0c;析构函数是与构造函数相对应的特殊成员函数&#xff0c;它在对象生命周期结束时被自动调用&#xff0c;用于执行对象销毁之前的清理操作。析构函数主要用于释放对象占用的资源&#xff0c;如动态分配的内存、打…...

【网络安全 | 漏洞挖掘】未授权获取AI聊天内容

未经许可,不得转载。 文章目录 两天前,我收到了一项私人项目的邀请,内容看起来像是一个聊天机器人,类似于 Gemini 或 ChatGPT。于是我开始测试该项目的一些业务逻辑漏洞和 IDOR(不当访问控制)漏洞。尽管这个产品拥有一个强大的安全团队,网站上也部署了 WAF(Web 应用防火…...

时间序列分析——移动平均法、指数平滑法、逐步回归法、趋势外推法等(基于Python实现)

第 11章——时间序列分析和预测 【例11-1】 绘制时间序列折线图—观察成分 【代码框11-1】——绘制时间序列折线图 # 图11-2的绘制代码 import pandas as pd import matplotlib.pyplot as plt plt.rcParams[font.sans-serif]=[SimHei...

opencv(c++)----图像的读取以及显示

opencv(c)----图像的读取以及显示 imread: 作用&#xff1a;读取图像文件并将其加载到 Mat 对象中。参数&#xff1a; 第一个参数是文件路径&#xff0c;可以是相对路径或绝对路径。第二个参数是读取标志&#xff0c;比如 IMREAD_COLOR 表示以彩色模式读取图像。 返回值&#x…...

PyTorch——从入门到精通:PyTorch基础知识(张量)【PyTorch系统学习】

什么是张量&#xff08;Tensor&#xff09; ​ 张量在数学中是一个代数对象&#xff0c;描述了与矢量空间相关的代数对象集之间的多重线性映射。张量是向量和矩阵概念的推广&#xff0c;可以理解为多维数组。作为数学中的一个基本概念&#xff0c;张量有着多种类型&#xff0c;…...

(笔记)ubuntu20安装jdk7,多版本管理

前往 Oracle JDK 7 下载页面&#xff08;需要 Oracle 账户&#xff09;&#xff0c;下载 JDK 7 的压缩包文件&#xff08;.tar.gz&#xff09;。 下载完成后&#xff0c;将文件解压到 /opt 目录&#xff1a; sudo tar -xzf jdk-7u<version>-linux-x64.tar.gz -C /opt 重…...

Python系列教程

文章目录 1. Python基础2. Python基础库3. Python数据分析 1. Python基础 语句数据类型表达式输入、输出与文件读写函数模块与包类与面向对象作用域与命名空间常用技巧与操作 2. Python基础库 Typing库 3. Python数据分析...

如何恢復電腦IP地址的手動設置?

手動設置IP地址後&#xff0c;可能會遇到一些網路連接問題&#xff0c;或者需要恢復到之前的自動獲取狀態。這篇文章將詳細介紹如何恢復電腦的IP地址設置。 為什麼需要恢復IP地址設置&#xff1f; 網路連接問題&#xff1a;手動設置IP地址後&#xff0c;可能會導致與路由器或…...

Linux 下敏感文件路径总结

Linux 下敏感文件路径总结 在服务器运维和安全测试过程中&#xff0c;掌握各类服务的关键配置文件路径、日志文件位置以及重要目录的存放位置至关重要。本文整理了 Linux 系统下常见服务&#xff08;如 Apache、Nginx、MySQL 等&#xff09;的路径结构&#xff0c;以及一些敏感…...

gitlab 服务器集群配置及 存储扩展配置

配置 GitLab 服务器集群并实现存储扩展是一个复杂的任务&#xff0c;但可以通过以下步骤来实现。GitLab 本身支持高可用性和分布式部署&#xff0c;可以显著提高系统的可靠性和性能。 ### 1. 规划和准备 #### 1.1 确定服务器数量 - **1 台负载均衡器**&#xff1a;用于分发请…...

3D Gaussian Splatting 代码层理解之Part2

现在让我们来谈谈高斯分布。我们已经在Part1介绍了如何根据相机的位置获取 3D 点并将其转换为 2D。在本文中,我们将继续处理高斯泼溅的高斯部分。这里用到的是代码库 GitHub 中part2. 我们在这里要做的一个小改动是,我们将使用透视投影,它利用与上一篇文章中所示的不同内部…...

.length和.length()有什么区别?什么情况下使用哪个?

在编写程序的时候&#xff0c;我们经常发现有时候需要得到长度的时候我们使用函数.length&#xff0c;而有的时候用的却是.length()。 在对Java一知半解的时候&#xff0c;我曾产生了深深的疑惑&#xff0c;到底这两个有什么区别&#xff0c;为什么有时候要有括号&#xff0c;而…...

React Native 全栈开发实战班 - 网络与数据之 websock与服务端交互

1.4 使用 WebSocket 实现实时通信 除了 fetch 和 axios 这样的 HTTP 请求方式&#xff0c;React Native 还支持 WebSocket&#xff0c;用于实现客户端与服务器之间的实时双向通信。WebSocket 适用于需要实时数据推送的场景&#xff0c;如聊天应用、实时通知、实时数据更新等。…...

黑马智慧商城项目学习笔记

目录 智慧商城项目创建项目调整初始化目录vant组件库vant按需导入和全部导入 项目中的vw适配路由设计配置登录页静态布局图形验证码功能request模块-axios封装api模块-封装图片验证码接口 Toast轻提示&#xff08;vant组件&#xff09;短信验证倒计时功能登录功能响应拦截器统一…...

计算机网络WebSocket——针对实习面试

目录 计算机网络WebSocket什么是WebSocket&#xff1f;WebScoket和HTTP协议的区别是什么?说明WebSocket的优势和使用场景&#xff1f;说明WebSocket的建立连接的过程&#xff1f; 计算机网络WebSocket 什么是WebSocket&#xff1f; WebSocket是一个网络通信协议&#xff0c;提…...

请介绍一下Python的网络编程以及如何使用socket模块进行网络通信

1、请介绍一下Python的网络编程以及如何使用socket模块进行网络通信。 Python中的网络编程主要是通过socket模块实现的。Socket模块提供了基本的套接字接口&#xff0c;使得Python程序可以连接到网络上的其他设备或服务。下面是对Python网络编程和socket模块的基本介绍以及如何…...

【第三课】Rust变量与数据类型(二)

目录 前言 Vector HashMap 其他 前言 上一课介绍了rust的变量和常见的数据类型&#xff0c;走马观花的看了一下rust常见的变量和数据类型&#xff0c;这些都是rust的基本语法&#xff0c;整理出来只是起一个引子的效果&#xff0c;基本语法多练习才可以熟练。这一课继续介绍…...

vue使用List.reduce实现统计

需要对集合的某些元素的值进行计算时&#xff0c;可以在计算属性中使用forEach方法 1.语法&#xff1a;集合.reduce ( ( 定义阶段性累加后的结果 , 定义遍历的每一项 ) > 定义每一项求和逻辑执行后的返回结果 , 定义起始值 ) 2、简单使用场景&#xff1a;例如下面…...

Linux网络:HTTPS协议

Linux网络&#xff1a;HTTPS协议 加密方式对称加密非对称加密混合加密中间人攻击 证书数据签名CA认证 HTTPSSSL/TSLHTTPS 在HTTP协议中&#xff0c;所有的数据都采用明文的形式传输&#xff0c;这就会导致数据非常容易泄露&#xff0c;只要拿到HTTP报文&#xff0c;就可以窃取各…...

http常⻅请求头和响应头详细讲解(笔记)

http常⻅请求头状态码 简介&#xff1a;讲解http常⻅见的请求⽅方法和使⽤用 http1.0定义了了三种&#xff1a;GET: 向服务器器获取资源&#xff0c;⽐比如常⻅见的查询请求POST: 向服务器器提交数据⽽而发送的请求Head: 和get类似&#xff0c;返回的响应中没有具体的内容&am…...

【c++丨STL】list的使用

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 前言 list简介 一、list的默认成员函数 构造函数(constructor) 析构函数 赋值重载 二、list的迭代器接口 迭代器的功能分类 三、list的容量…...

系统掌握大语言模型提示词 - 从理论到实践

以下是我目前的一些主要个人标签&#xff1a; 6 年多头部大厂软件开发经验&#xff1b;1 年多 AI 业务应用经验&#xff0c;拥有丰富的业务提示词调优经验和模型微调经验。信仰 AGI&#xff0c;已经将 AI 通过自定义 Chatbot /搭建 Agent 融合到我的工作流中。头部大厂技术大学…...

cocosCreator视频web模式播放踩坑解决

/*** 对外输出接口*/ export interface VideoPlayerManageInterface {//初始化视频播放器init(list: VideoPlayerManageInitListType[],options?: VideoPlayerManageInitOptionsType): Promise<void>;//播放视频play(url: string, currentTime?: number): Promise<v…...

c++头文件中 #ifndef的作用

避免文件重复处理、变量等重定义 //c1.hpp #ifndef C1_HPP #define C1_HPP int a 0; #endif // LFU_CACHE_HPP#include"c1.hpp" #ifndef C2_HPP #define C2_HPP int b1; #endif#include"c1.hpp" #include"c2.hpp" #include<iostream> in…...