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

news2024/11/19 9:30:17

如果你也对鸿蒙开发感兴趣,加入“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.coloradmin.cn/o/1890585.html

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

相关文章

Visual Studio 中的键盘快捷方式

1. Visual Studio 中的键盘快捷方式 1.1. 可打印快捷方式备忘单 1.2. Visual Studio 的常用键盘快捷方式 本部分中的所有快捷方式都将全局应用&#xff08;除非另有指定&#xff09;。 “全局”上下文表示该快捷方式适用于 Visual Studio 中的任何工具窗口。 生成&#xff1…

使用EndNote在Word中插入参考文献,并编辑参考文献样式方法

一、背景 在准备中期报告时&#xff0c;学校给的是Word模板&#xff0c;习惯了Latex排版和添加参考文献的便利后&#xff0c;真不想用word写东西。 之前投《机器人》期刊&#xff08;被拒了&#xff09;和准备开题的时候也是用word写的&#xff0c;当时为方便添加参考文献和定…

【Linux】线程封装与互斥(万字)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 C多线程的用法 对原生线程进行一次封装 理解pthread线程 Linux线程互斥 进程线程间的互斥相关背景概念 互斥量mutex 操作共享变量会有问题的售票…

20万内最能打的颜值,小鹏MONA M03开启全球首秀

7月3日&#xff0c;小鹏MONA M03开启全球首秀。这款为年轻用户打造的智能纯电掀背轿跑&#xff0c;以其独特的AI量化美学设计吸引了行业关注。 据「TMT星球」了解&#xff0c;小鹏汽车董事长CEO何小鹏携手造型中心副总裁胡安马洛佩兹&#xff08;JuanMa Lopez&#xff09;共同…

【高中数学/基本不等式】已知:x,y皆大于1,且x+2y=4 求:1/(x-1)+1/(y-1)的最小值为?

【问题来源】 https://www.ixigua.com/7025123539728466469?logTag1c2fd2e305d60e6277ab 之第一题 【问题】 已知&#xff1a;x,y皆大于1&#xff0c;且x2y4 求&#xff1a;1/(x-1)1/(y-1)的最小值为&#xff1f; 【解答】 解&#xff1a; 若将(x2y)/41代入目标式&…

OpenGL3.3_C++_Windows(27)

法线/凹凸贴图 如何让纹理产生更细节的效果&#xff0c;产生凹凸视觉感&#xff1f;解决思路之一&#xff1a;镜面贴图(黑—白&#xff09;&#xff08;&#xff08;diffuse贴图&#xff08;rgba&#xff09;&#xff09;&#xff0c;阻止部分表面被照的更亮&#xff0c;但这并…

鸿蒙数据防泄漏(DLP)【Data Loss Prevention Kit简介】

Data Loss Prevention Kit简介 Data Loss Prevention Kit&#xff08;数据防泄漏服务&#xff0c;简称为DLP&#xff09;&#xff0c;是系统提供的系统级的数据防泄漏解决方案&#xff0c;提供文件权限管理、加密存储、授权访问等能力&#xff0c;数据所有者可以基于帐号认证对…

pjsip环境搭建、编译源码生成.lib库

使用平台&#xff1a; windows qt(5.15.2) vs(2019)x86 pjsip版本以及第三方库使用 pjsip 2.10 ffmpeg4.2.1 sdl2.0.12pjsip源码链接&#xff1a; https://github.com/pjsip/pjproject源码环境配置 首先创建两个文件夹&#xff0c;分别是include、lib其中include放置ff…

亚马逊跟卖卖家还在选品发愁吗!已经有卖家用这种方式选品大卖!

对于亚马逊相信很多卖家都不陌生&#xff0c;也有很多新手卖家涌入&#xff0c;但是进入后就不知道怎么选品了&#xff0c;很多新手卖家是不是天天盯着亚马逊页面的产品&#xff0c;眼花撩乱的&#xff0c;不知道那些产品&#xff0c;能跟卖那些不能跟卖&#xff0c;也有些卖家…

通过卷防水上限,解锁手机的新玩法?IP68之间亦有不同

当手机的日常防水已经成了基本功&#xff0c;防水能力的上限便成了新的赛道。 毕竟再谨慎的人&#xff0c;也可能会有手滑的时候。这个时候&#xff0c;一台有着IP68级防水的手机&#xff0c;就能给你提供一份安心。 【IP68是标准上限&#xff0c;不是手机防水上限】 IP68是…

据阿谱尔统计,全球mRNA原料酶市场预计2024年达到11.98亿美元

Codexis 宣布与 Aldevron 达成协议&#xff0c;授予 Aldevron Codexis 的 Codex HiCap RNA 聚合酶的全球制造和商业化权利。 Applied DNA、Maravai LifeSciences (MRVI) 和 Alphazyme 达成协议&#xff0c;Alphazyme 将扩大 Applied DNA 专有 Linea™ RNA 聚合酶 (RNAP) 的生产…

新声创新20年:无线技术给助听器插上“娱乐”的翅膀

听力损失并非现代人的专利&#xff0c;古代人也会有听力损失。助听器距今发展已经有二百多年了&#xff0c;从当初单纯的声音放大器到如今的全数字时代助听器&#xff0c;助听器发生了翻天覆地的变化&#xff0c;现代助听器除了助听功能&#xff0c;还具有看电视&#xff0c;听…

Character.ai因内容审查流失大量用户、马斯克:Grok-3用了10万块英伟达H100芯片

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 1、爆火AI惨遭阉割&#xff0c;1600万美国年轻人失恋&#xff1f;Character.ai被爆资金断裂 美国流行的社交软件Character.ai近期对模型进行大幅度内容审查&#xff0c;导致用户感到失望并开始流失。…

国内外生成式AI教育产品:深度解析教育各环节的智能化教学

随着人工智能技术的飞速发展&#xff0c;教育行业迎来了一场革命性的变革。 2024年&#xff0c;AI教育产品不仅在课堂上大放异彩&#xff0c;更在课前备课、课后辅导、教研支持等各个环节发挥着重要作用。 本文将为您全面总结AI教育产品如何渗透教育的每一个环节&#xff0c;…

PD虚拟机对电脑配置要求高吗 PD虚拟机配置怎么改 Parallels Desktop使用教程

说到虚拟机&#xff0c;很多人会觉得电脑需要很高的配置才能安装。其实不然&#xff0c;有些虚拟机软件的技术已经很成熟&#xff0c;不需要借助电脑的高配置支撑其功能&#xff0c;比如PD软件&#xff0c;很多旧的Mac机型都能安装使用。本文会给大家详细介绍PD虚拟机对电脑配置…

鸿蒙数据防泄漏(DLP)【Data Loss Prevention Kit开发指导】

Data Loss Prevention Kit开发指导 DLP是系统提供的系统级的数据防泄漏解决方案&#xff0c;提供一种称为DLP的文件格式。后缀格式为“原始文件名&#xff08;包含原始文件后缀&#xff09;.dlp”&#xff0c;例如: “test.docx.dlp”&#xff0c;文件由授权凭证和原始文件密文…

09 docker 安装tomcat 详解

目录 一、安装tomcat 1. tomcat镜像的获取 2. docker创建容器实列 3. 访问测试 404错误 4. 解决方案 5. 使用免修改版容器镜像 5.1. 运行实列的创建 5.2. 出现问题及解决&#xff1a; 6. 验证 OK 一、安装tomcat 1. tomcat镜像的获取 docker search tomcat #docker …

Spire.PDF for .NET【文档操作】演示:以特定的缩放比例/百分比打开 PDF 文件

有时&#xff0c;我们可能需要在显示 PDF 文件时更改缩放比例以满足我们的要求。在本文中&#xff0c;我们将演示如何使用 Spire.PDF for .NET 以特定的缩放比例/百分比&#xff08;例如默认值、100% 或任何其他所需的缩放比例&#xff09;打开 PDF 文件。 Spire.PDF for .NET…

echarts legend组件单独设置样式形状

为legend组件单独设置一个样式 //单独legend样式 const customLegend {name: test,// 设置文本为红色textStyle: {color: red} } legend: {data: [Email, Union Ads, Video Ads, Direct, Search Engine, customLegend ] }注意事项&#xff1a;series里面也必须配置与legend相对…

python中的文件

1.什么是文件&#xff1f; 硬盘上存储的数据都是以文件的形式来组织的~ 文件是数据在硬盘上的存储形式&#xff0c;不同的数据在硬盘上的存储形式是不同的&#xff0c; 2.文件路径 文件夹/目录。 文件夹&#xff0c;再包含文件夹的情况&#xff0c;这就是一个嵌套的关系&…