ArcTs布局入门04——相对布局 媒体查询

如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧

扫描下面的二维码关注公众号。

图片

本文将探讨相对布局与媒体查询,为啥把他们放到一起呢?主要是因为相对布局在响应式的场景下做得不太好,一般情况下和媒体查询(不同尺寸下使用不同的相对布局策略)搭配使用会更好。

1、相对布局

👉🏻 1.1、概述

RelativeContainer为采用相对布局的容器,支持容器内部的子元素设置相对位置关系。子元素支持指定兄弟元素作为锚点,也支持指定父容器作为锚点,基于锚点做相对位置布局。下图是一个RelativeContainer的概念图,图中的虚线表示位置的依赖关系。

图片

子元素并不完全是上图中的依赖关系。比如,Item4可以以Item2为依赖锚点,也可以以RelativeContainer父容器为依赖锚点。

👉🏻 1.2、基本概念

  • 锚点:通过锚点设置当前元素基于哪个元素确定位置。

  • 对齐方式:通过对齐方式,设置当前元素是基于锚点的上中下对齐,还是基于锚点的左中右对齐。

👉🏻 1.3、设置依赖关系

a)锚点设置

锚点设置是指设置子元素相对于父元素或兄弟元素的位置依赖关系。在水平方向上,可以设置left、middle、right的锚点。在竖直方向上,可以设置top、center、bottom的锚点。

为了明确定义锚点,必须为RelativeContainer及其子元素设置ID,用于指定锚点信息。ID默认为“__container__”,其余子元素的ID通过id属性设置。未设置ID的子元素在RelativeContainer中不会显示。

RelativeContainer父组件为锚点,__container__代表父容器的id。

RelativeContainer() {  Row()    // 添加其他属性    .alignRules({      top: { anchor: '__container__', align: VerticalAlign.Top },      left: { anchor: '__container__', align: HorizontalAlign.Start }    })    .id("row1")  Row()    ...    .alignRules({      top: { anchor: '__container__', align: VerticalAlign.Top },      right: { anchor: '__container__', align: HorizontalAlign.End }    })    .id("row2")}...

图片

以兄弟元素为锚点。​​​​​​​

RelativeContainer() {  ...  top: { anchor: 'row1', align: VerticalAlign.Bottom },  ...}.width(300).height(300).margin({ left: 20 }).border({ width: 2, color: '#6699FF' })

图片

b)设置相对于锚点的对齐位置

设置了锚点之后,可以通过align设置相对于锚点的对齐位置。

在水平方向上,对齐位置可以设置为HorizontalAlign.Start、HorizontalAlign.Center、HorizontalAlign.End。

图片

在竖直方向上,对齐位置可以设置为VerticalAlign.Top、VerticalAlign.Center、VerticalAlign.Bottom。

图片

👉🏻 1.4、demo

实现下面的对齐效果

图片

代码如下:​​​​​​​

@Entry@Componentstruct Index {  build() {    Row() {      RelativeContainer() {        Row()          .width(100)          .height(100)          .backgroundColor('#FF3333')          .alignRules({            top: { anchor: '__container__', align: VerticalAlign.Top },  //以父容器为锚点,竖直方向顶头对齐            middle: { anchor: '__container__', align: HorizontalAlign.Center }  //以父容器为锚点,水平方向居中对齐          })          .id('row1')  //设置锚点为row1        Row() {          Image($r('app.media.icon'))        }        .height(100).width(100)        .alignRules({          top: { anchor: 'row1', align: VerticalAlign.Bottom },  //以row1组件为锚点,竖直方向底端对齐          left: { anchor: 'row1', align: HorizontalAlign.Start }  //以row1组件为锚点,水平方向开头对齐        })        .id('row2')  //设置锚点为row2        Row()          .width(100)          .height(100)          .backgroundColor('#FFCC00')          .alignRules({            top: { anchor: 'row2', align: VerticalAlign.Top }          })          .id('row3')  //设置锚点为row3        Row()          .width(100)          .height(100)          .backgroundColor('#FF9966')          .alignRules({            top: { anchor: 'row2', align: VerticalAlign.Top },            left: { anchor: 'row2', align: HorizontalAlign.End },          })          .id('row4')  //设置锚点为row4        Row()          .width(100)          .height(100)          .backgroundColor('#FF66FF')          .alignRules({            top: { anchor: 'row2', align: VerticalAlign.Bottom },            middle: { anchor: 'row2', align: HorizontalAlign.Center }          })          .id('row5')  //设置锚点为row5      }      .width(300).height(300)      .border({ width: 2, color: '#6699FF' })    }    .height('100%').margin({ left: 30 })  }}

2、媒体查询

👉🏻 2.1、概述

媒体查询作为响应式设计的核心,在移动设备上应用十分广泛。媒体查询可根据不同设备类型或同设备不同状态修改应用的样式。媒体查询常用于下面两种场景:

  1. 针对设备和应用的属性信息(比如显示区域、深浅色、分辨率),设计出相匹配的布局。

  2. 当屏幕发生动态改变时(比如分屏、横竖屏切换),同步更新应用的页面布局。

👉🏻 2.2、引入与使用流程

媒体查询通过mediaquery模块接口,设置查询条件并绑定回调函数,在对应的条件的回调函数里更改页面布局或者实现业务逻辑,实现页面的响应式设计。具体步骤如下:

首先导入媒体查询模块。

import mediaquery from '@ohos.mediaquery';

通过matchMediaSync接口设置媒体查询条件,保存返回的条件监听句柄listener。例如监听横屏事件:

let listener = mediaquery.matchMediaSync('(orientation: landscape)');

给条件监听句柄listener绑定回调函数onPortrait,当listener检测设备状态变化时执行回调函数。在回调函数内,根据不同设备状态更改页面布局或者实现业务逻辑。​​​​​​​

onPortrait(mediaQueryResult) {  if (mediaQueryResult.matches) {    // do something here  } else {    // do something here  }}listener.on('change', onPortrait);

👉🏻 2.3、媒体查询条件

媒体查询条件由媒体类型、逻辑操作符、媒体特征组成,其中媒体类型可省略,逻辑操作符用于连接不同媒体类型与媒体特征,其中,媒体特征要使用“()”包裹且可以有多个。具体规则如下:

⭐️ 语法规则

语法规则包括媒体类型(media-type)、媒体逻辑操作(media-logic-operations)和媒体特征(media-feature)

[media-type] [media-logic-operations] [(media-feature)]

例如:

  • screen and (round-screen: true) :表示当设备屏幕是圆形时条件成立。

  • (max-height: 800) :表示当高度小于等于800vp时条件成立。

  • (height <= 800) :表示当高度小于等于800vp时条件成立。

  • screen and (device-type: tv) or (resolution < 2) :表示包含多个媒体特征的多条件复杂语句查询,当设备类型为tv或设备分辨率小于2时条件成立。

目前,媒体类型只有一个:screen。

逻辑操作主要有几个:and、or、not、only、<=、>=、<、>,也可以通过括号+逗号的方式将多种逻辑操作组合起来,几个逻辑操作详细解释如下:

and: 将多个媒体特征(Media Feature)以“与”的方式连接成一个媒体查询,只有当所有媒体特征都为true,查询条件成立。另外,它还可以将媒体类型和媒体功能结合起来。例如:screen and (device-type: wearable) and (max-height: 600) 表示当设备类型是智能穿戴且应用的最大高度小于等于600个像素单位时成立。

or: 将多个媒体特征以“或”的方式连接成一个媒体查询,如果存在结果为true的媒体特征,则查询条件成立。例如:screen and (max-height: 1000) or (round-screen: true) 表示当应用高度小于等于1000个像素单位或者设备屏幕是圆形时,条件成立。

not: 取反媒体查询结果,媒体查询结果不成立时返回true,否则返回false。例如:not screen and (min-height: 50) and (max-height: 600) 表示当应用高度小于50个像素单位或者大于600个像素单位时成立。【使用not运算符时必须指定媒体类型。】

only: 当整个表达式都匹配时,才会应用选择的样式,可以应用在防止某些较早的版本的浏览器上产生歧义的场景。一些较早版本的浏览器对于同时包含了媒体类型和媒体特征的语句会产生歧义,比如:screen and (min-height: 50)。老版本浏览器会将这句话理解成screen,从而导致仅仅匹配到媒体类型(screen),就应用了指定样式,使用only可以很好地规避这种情况。【使用only时必须指定媒体类型。】

comma(, )将多个媒体特征以“或”的方式连接成一个媒体查询,如果存在结果为true的媒体特征,则查询条件成立。其效果等同于or运算符。例如:screen and (min-height: 1000), (round-screen: true) 表示当应用高度大于等于1000个像素单位或者设备屏幕是圆形时,条件成立。

<=,>=,<,>操作符将不再展开介绍,分别表示:小于等于、大于等于、小于、大于。

媒体特征主要是有以下几种:

height、min-height、max-hegiht、width、min-width、max-width:可显示区域宽度高度的限定

resolution、min-resolution、max-resolution:  设备的分辨率,支持dpi,dppx和dpcm单位。其中:- dpi表示每英寸中物理像素个数,1dpi ≈ 0.39dpcm;- dpcm表示每厘米上的物理像素个数,1dpcm ≈ 2.54dpi;- dppx表示每个px中的物理像素数(此单位按96px = 1英寸为基准,与页面中的px单位计算方式不同),1dppx = 96dpi。

device-height、min-device-height、max-device-height、device-width、min-device-width、max-device-width:设备的高度和宽度

device-type:设备的类型

orientation: landscape,portrait,分别表示横屏与竖屏

round-screen:屏幕类型,圆形屏幕为true,非圆形屏幕为false。

dark-mode: 系统为深色模式时为true,否则为false。

👉🏻 2.4、demo

下例中使用媒体查询,实现屏幕横竖屏切换时,给页面文本应用添加不同的内容和样式。​​​​​​​

import mediaquery from '@ohos.mediaquery';import window from '@ohos.window';import common from '@ohos.app.ability.common';let portraitFunc = null;@Entry@Componentstruct MediaQueryExample {  @State color: string = '#DB7093';  @State text: string = 'Portrait';  // 当设备横屏时条件成立  listener = mediaquery.matchMediaSync('(orientation: landscape)');  // 当满足媒体查询条件时,触发回调  onPortrait(mediaQueryResult) {    if (mediaQueryResult.matches) { // 若设备为横屏状态,更改相应的页面布局      this.color = '#FFD700';      this.text = 'Landscape';    } else {      this.color = '#DB7093';      this.text = 'Portrait';    }  }  aboutToAppear() {    // 绑定当前应用实例    portraitFunc = this.onPortrait.bind(this);    // 绑定回调函数    this.listener.on('change', portraitFunc);  }  // 改变设备横竖屏状态函数  private changeOrientation(isLandscape: boolean) {    // 获取UIAbility实例的上下文信息    let context = getContext(this) as common.UIAbilityContext;    // 调用该接口手动改变设备横竖屏状态    window.getLastWindow(context).then((lastWindow) => {      lastWindow.setPreferredOrientation(isLandscape ? window.Orientation.LANDSCAPE : window.Orientation.PORTRAIT)    });  }  build() {    Column({ space: 50 }) {      Text(this.text).fontSize(50).fontColor(this.color)      Text('Landscape').fontSize(50).fontColor(this.color).backgroundColor(Color.Orange)        .onClick(() => {          this.changeOrientation(true);        })      Text('Portrait').fontSize(50).fontColor(this.color).backgroundColor(Color.Orange)        .onClick(() => {          this.changeOrientation(false);        })    }    .width('100%').height('100%')  }}

竖屏

图片

横屏

图片

3、结语

后续还有网格布局和栅格布局,请持续关注“ArcTs布局入门05”

如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!

扫描下面的二维码关注公众号。

图片

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

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

相关文章

MySQL之备份与恢复(二)

备份与恢复 定义恢复需求 如果一切正常&#xff0c;那么永远也不需要考虑恢复。但是&#xff0c;一旦需要恢复&#xff0c;只有世界上最好的备份系统是没用的&#xff0c;还需要一个强大的恢复系统。 不幸的是&#xff0c;让备份系统平滑工作比构造良好的恢复过程和工具更容易…

WebRtc实现1V1音视频通话

WebRtc实现1V1音视频通话 简介应用场景共享桌面的基本原理传统共享桌面WebRTC 共享桌面 相关API基本使用调用本地摄像头播放约束设置 媒体协商过程协议协议的交换与传输 WebRTC 通信过程ICE Candidate&#xff08;ICE 候选者&#xff09; 1V1视频通话 简介 WebRTC&#xff0c;名…

新版本发布丨昂辉科技EasySAR-Configurator V1.2.0再启航

昂辉科技新一代跨平台高性能AUTOSAR配置工具EasySAR-Configurator V1.2.0全新版本重磅发布&#xff01;产品基于Web架构前后端分离的方式开发&#xff0c;可提供SaaS部署&#xff0c;能够实现精准配置和最大限度的代码裁剪&#xff0c;且配备标准的约束限制、配置验证、代码生成…

jenkins 发布服务到linux服务器

1.环境准备 1.1 需要一台已经部署了jenkins的服务器&#xff0c;上面已经集成好了&#xff0c;jdk、maven、nodejs、git等基础的服务。 1.2 需要安装插件 pusblish over ssh 1.3 准备一台额外的linux服务器&#xff0c;安装好jdk 2.流程描述 2.1 配置jenkins&#xff0c;包括p…

如何将 Apifox 的自动化测试与 Jenkins 集成?

CI/CD &#xff08;持续集成/持续交付&#xff09; 在 API 测试 中的主要目的是为了自动化 API 的验证流程&#xff0c;确保 API 发布到生产环境前的可用性。通过持续集成&#xff0c;我们可以在 API 定义变更时自动执行功能测试&#xff0c;以及时发现潜在问题。 Apifox 支持…

二叉树的最近公共祖先-二叉树

236. 二叉树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; ​ 递归 lson、rson左右子树&#xff1b; 深度优先遍历&#xff0c;遍历到p或者q就返回ture&#xff1b; class Solution { public:TreeNode* ans;bool dfs(TreeNode* root, TreeNode* p, TreeNode* q){i…

GoLand 2024 for Mac GO语言集成开发工具环境

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…

CAN学习笔记

学习链接&#xff1a;CAN学习笔记&#xff08;1&#xff09;_can sjw-CSDN博客 内容全部取自链接&#xff0c;非原创。用于自己学习和记录&#xff0c;如有错误请指正。如果侵权了&#xff0c;请联系我删掉。 CAN主要有两种物理层&#xff0c;1.闭环的ISO11898 2.开环的ISO1…

Hadoop3:NameNode和DataNode多目录配置(扩充磁盘的技术支持)

一、NameNode多目录 1、说明 NameNode多目录&#xff0c;需要在刚搭建Hadoop集群的时候&#xff0c;就配置好 因为&#xff0c;配置这个&#xff0c;需要格式化NameNode 所以&#xff0c;如果一开始没配置NameNode多目录&#xff0c;后面&#xff0c;就不要配置了。 2、配置…

数据库组成及原理

属性&#xff1a; 把数据库中的一个表类比成一个公司&#xff0c;那么公司里的每个人都是一个“属性”&#xff08;表中的一个字段视为一个属性&#xff09;&#xff0c;不管老板还是员工&#xff0c;只要是公司里的人&#xff0c;就都是一个属性。 主键&#xff1a; 老板就是“…

网络安全 文件上传漏洞-20 第二十关 Pass-20

点击进入第二十关&#xff0c;并选择显示代码&#xff1a; $is_upload false; $msg null; if(!empty($_FILES[upload_file])){//检查MIME$allow_type array(image/jpeg,image/png,image/gif);if(!in_array($_FILES[upload_file][type],$allow_type)){$msg "禁止上传该…

vector模拟实现【C++】

文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间和类类的成员变量 迭代器迭代器获取函数 构造函数默认构造使用n个值构造迭代器区间构造解决迭代器区间构造和用n个值构造的冲突拷贝构造 析构函数swap【交换函数】赋值运算符重载emptysize和capacityopera…

N5 使用Gensim库训练Word2Vec模型

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊# 前言 前言 这周学习训练一个Word2Vec模型&#xff0c;并进行一些基本的词向量操作。 Word2Vec 模型 Word2Vec 是一种基于神经网络的词向量表示方法&#x…

HMI 的 UI 风格成就经典

HMI 的 UI 风格成就经典

力扣61. 旋转链表(java)

思路&#xff1a;用快慢指针找到最后链表k个需要移动的节点&#xff0c;然后中间断开节点&#xff0c;原尾节点连接原头节点&#xff0c;返回新的节点即可&#xff1b; 但因为k可能比节点数大&#xff0c;所以需要先统计节点个数&#xff0c;再取模&#xff0c;看看k到底需要移…

Python数据可视化书籍推荐:利用Python进行数据分析

《利用Python进行数据分析》 这本书几乎是数据分析入门必读书了 主要介绍了python 3个库numpy&#xff08;数组&#xff09;&#xff0c;pandas&#xff08;数据分析&#xff09;和matplotlib&#xff08;绘图&#xff09;的学习 阅读本书可以获得一份关于在Python下操作、处…

Rustdesk如何编译代码实现安装后不会显示主界面,不会在右下角出现托盘图标,作为后台服务运行

环境&#xff1a; Rustdesk1.1.9 问题描述&#xff1a; Rustdesk如何编译代码实现安装后不会显示主界面&#xff0c;不会在右下角出现托盘图标&#xff0c;作为后台服务运行 解决方案&#xff1a; 可以自定义进程名称和图标&#xff0c;不会显示主界面&#xff0c;不会在…

LLM大模型中LoRA是什么?面试经验回答汇总(2024.7月最新)

目录 1 什么是 LoRA&#xff1f; 2 LoRA 的思路是什么&#xff1f; 3 LoRA 的特点是什么&#xff1f; 4 简单描述一下 LoRA? 5 QLoRA 的思路是怎么样的&#xff1f; 6 QLoRA 的特点是什么&#xff1f; 7 AdaLoRA 的思路是怎么样的&#xff1f; 8 LoRA权重是否可以合入…

笛卡尔乘积算法js实现

全因子实验设计( DOE) &#xff1a;指所有因子的所有水平的所有组合都至少进行一次实验&#xff0c;可以估计所有的主效应和所有的各阶交互效应。 笛卡尔乘积&#xff1a;指在数学中&#xff0c;两个集合X和Y的笛卡尔积&#xff08;Cartesian product&#xff09;&#xff0c;…

视频监控汇聚和融合平台的特点、功能、接入方式、应用场景

目录 一、产品概述 二、主要特点 1、多协议支持 2、高度集成与兼容性 3、高性能与可扩展性 4、智能化分析 5、安全可靠 三、功能概述 1. 视频接入与汇聚 2. 视频存储与回放 3. 实时监控与预警 4. 信息共享与联动 5. 远程管理与控制 四、接入方式 1、直接接入 2…