0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Openharmony中的Flex和Grid布局

OpenHarmony技术社区 来源:OpenHarmony技术社区 作者:韩祥 2022-04-26 10:54 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Flex 布局

Flex 布局是很常用也是很方便的一种布局模式,此种布局方式已经广泛使用在前端、小程序开发之中。

如果之前已经学习过 Flex 布局,那么在 Openharmony 中也是大同小异的。

用法如下:

容器的常用参数:

  • direction:子组件在 Flex 容器上排列的方向,即主轴的方向。

  • wrap:Flex 容器是单行/列还是多行/列排列。

  • justifyContent:子组件在 Flex 容器主轴上的对齐格式。

  • alignItems:子组件在 Flex 容器交叉轴上的对齐格式。

  • alignContent:交叉轴中有额外的空间时,多行内容的对齐方式。仅在 wrap 为 Wrap 或 WrapReverse 下生效。

子组件常用属性(不是所有属性):flexGrow:Flex 容器的剩余空间分配给给此属性所在的组件的比例。

简单的使用:Flex 布局的属性有很多,但是最常用的还是让子组件垂直水平居中,两条属性即可保证子组件垂直水平居中:

Flex({justifyContent:FlexAlign.Center,alignItems:ItemAlign.Center}){
Text('水平垂直居中显示').fontSize(18)
}.width('100%').height('100%')

Flex 也可用于很多常见布局场景,如下图效果:

078ba7be-c481-11ec-bce3-dac502259ad0.png

利用 direction 属性和 flexGrow 配合即可轻松达到上面的布局效果,核心代码段如下:

Flex({direction:FlexDirection.Column}){
Column(){
ForEach(this.ListData,(item)=>{
Text(item).fontSize(18).height(100).width('100%').margin({bottom:5}).backgroundColor('#575da8')
},item=>item)
}.flexGrow(1).backgroundColor('#08ec89').margin({bottom:2}).padding(10)
Flex({alignItems:ItemAlign.Center}){
ForEach(this.navData,(item)=>{
Text(item).fontSize(18).height('100%').flexGrow(1).textAlign(TextAlign.Center).backgroundColor("#18ec08").margin(1)
},item=>item)
}.height(64)
}.width('100%').height('100%')

Flex 还有一个常用的属性是 wrap,可以去配置换行,不过如果是多行建议还是使用 Grid 布局,更加灵活,下面看看 Grid 布局。

Grid 布局

Grid 做前端的同学应该都很熟悉了,翻译成中文为“栅格” , 它将页面划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局。

用法如下:

基本概念:网格布局的区域,称为“容器”,容器内部采用网格定位的子元素,称为"项目"。

项目必须使用 Grid 子组件 GridItem 子组件包裹,即 Grid 的子组件必须是 GridItem。

容器属性:

  • columnsTemplate
  • rowsTemplate

这两个属性用于设置当前网格布局的行和列的数量,不设置时默认 1 列行或者 1 列。

可以采用 fr 关键字表示各行和列的比例关系, 以列为例:‘1fr 1fr 2fr’ 将父组件等分为 4 等份,第一列第二列各占 1 份,第三列占两份:

07963cd8-c481-11ec-bce3-dac502259ad0.png

核心代码如下:

@StateNumber:String[]=['0','1','2']
build(){
Grid(){
ForEach(this.Number,(item:string)=>{
ForEach(this.Number,(item:string)=>{
GridItem(){
Text(item)
.fontSize(16)
.backgroundColor(Color.Grey)
.width('100%')
.height('100%')
.textAlign(TextAlign.Center)
}.borderWidth(1)
},item=>item)
},item=>item)
}
.columnsTemplate('1fr1fr2fr')
.rowsTemplate('1fr1fr2fr')
.backgroundColor(Color.Black)
.height(300)
}

这两个属性里面也可使用 px 单位,如将 columnsTemplate 修改:

.columnsTemplate('100px1fr1fr')

展示效果如下:

07aa671c-c481-11ec-bce3-dac502259ad0.pngcolumnsGap 和 rowsGap:这两个属性可以设置行列之间的间距,此处不在赘述。

layoutDirection:LayoutDirection.Row 和 LayoutDirection.Column,不过尝试过后两种值的结果都是按列排布,默认不给属性的话是按行排布,这里应是没有完全支持。

其他属性:看到文档还提供了很多属性,但目前尝试过后没有效果,未支持。

事件:

onScrollIndex(first:number)=>void

当前列表显示的起始位置发生变化会触发这个事件,若要展示效果,则需使布局出现滚动条,可以去掉 rowsTemplate 属性,然后在子组件内部设置高度,然后再添加事件监听:

Grid(){
ForEach(this.Number,(item:string)=>{
ForEach(this.Number,(item:string)=>{
GridItem(){
Text(item)
.fontSize(16)
.backgroundColor(Color.Grey)
.width('100%')
.height(80)
.textAlign(TextAlign.Center)
}
},item=>item)
},item=>item)
}
.columnsTemplate('1fr1fr1fr1fr1fr')
.columnsGap(10)
.rowsGap(10)
.onScrollIndex((first:number)=>{
console.log(first.toString())
})
.backgroundColor(Color.Black)
.height(300)

总结

Grid 布局与 Flex 有一定的相似性,都可以指定容器内部多个项目的位置。但是,它们也存在重大区别。

Flex 布局是轴线布局,只能指定"项目"针对轴线的位置,可以看作是一维布局。

Grid 布局则是将容器划分成"行"和"列",产生单元格,然后指定"项目所在"的单元格,可以看作是二维布局。

其实掌握这两种布局方式,页面上面大部分效果都是可以做出来的。当然,当前 Gird 布局还有很多属性是不支持的,相比较与传统的前端 Grid 布局功能上有很多不足,期待 API 更新,完善功能。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Grid
    +关注

    关注

    0

    文章

    9

    浏览量

    10211
  • OpenHarmony
    +关注

    关注

    31

    文章

    3925

    浏览量

    20698

原文标题:Openharmony中的Flex和Grid布局

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Molex C-Grid III现成电缆组件的技术解析与应用指南

    Molex现成 (OTS) C-Grid III电缆组件具有完整的设计灵活性和 独特特性,便于原型设计和全球预生产。 OTS C-Grid III电缆组件具有镀金闪存和双面镀金功能,可实现高性价比解决方案。该系列2.54mm脚距 电缆组件完全兼容行业标准DIN41651以
    的头像 发表于 11-20 16:01 209次阅读

    Molex Premo-Flex FFC跳线电缆技术解析与应用指南

    Premo-Flex FFC 0.30mm脚距跳线电缆的锁定孔可在高冲击和高振动环境具有出色的保持力。该系列提供各种电缆长度、电路计数和交错设计,适用于空间受限的应用。
    的头像 发表于 11-20 15:12 201次阅读

    【HarmonyOS 5】鸿蒙中常见的标题栏布局方案

    是返回按钮,右边是问号帮助按钮,中间是标题文字。 那有几种布局方式,分别怎么布局呢?常见的思维是,有老铁使用row去布局,怎么都对不齐。 二、解决方案 方案一,使用Flex
    的头像 发表于 07-11 18:30 635次阅读
    【HarmonyOS 5】鸿蒙中常见的标题栏<b class='flag-5'>布局</b>方案

    鸿蒙5开发宝藏案例分享---一多开发实例(音乐)

    关联实际开发的高频痛点,比如内存泄漏、跨端适配、服务卡片设计等。我整理了一份超全解读,带你解锁鸿蒙开发的“隐藏Buff”! 一、动态布局实战:从折叠屏到多端适配 你以为的鸿蒙布局只是Flex
    的头像 发表于 06-30 11:54 615次阅读

    HarmonyOS NEXT应用元服务布局优化精简节点数

    复制 共15个节点,并且其中并没有冗余的嵌套节点。而扁平化布局是一种让页面结构变浅变宽的方式,通过一些高级组件如RelativeContainer、Grid等容器,可以让元素在平面上展开。这种布局方式
    发表于 06-26 10:21

    HarmonyOS NEXT应用元服务布局优化精简节点数

    复制 共15个节点,并且其中并没有冗余的嵌套节点。而扁平化布局是一种让页面结构变浅变宽的方式,通过一些高级组件如RelativeContainer、Grid等容器,可以让元素在平面上展开。这种布局方式
    发表于 06-26 10:21

    网格布局介绍

    ,且Grid不可滚动。(推荐使用该种布局方式) 只设置行、列数量与占比的一个:元素按照设置的方向进行排布,超出的元素可通过滚动的方式展示。 行列数量与占比都不设置:元素在布局方向上排
    发表于 06-25 06:27

    HarmonyOS NEXT应用元服务布局合理使用布局组件

    布的组件是按照特定的方向线性放置,如横向/纵向/Z序方向。除上述布局类型外,还有一些复杂布局能力,如Flex、List、Grid、RelativeContainer和自定义
    发表于 06-20 15:48

    鸿蒙5开发宝藏案例分享---Grid性能优化案例

    注意到。今天我就带大家拆解这个案例,加上详细讲解和代码分析,帮你轻松提升应用流畅度! ?问题场景:为什么Grid会卡? 当Grid布局需要实现 不规则网格 (比如合并单元格)时,我们常用<
    发表于 06-12 17:47

    弹性布局 (Flex) 提供更加有效的方式对容器的子元素进行排列、对齐和分配剩余空间

    弹性布局 (Flex) 弹性布局Flex)提供更加有效的方式对容器的子元素进行排列、对齐和分配剩余空间。常用于页面头部导航栏的均匀分布
    发表于 04-30 07:54

    层叠布局 (Stack):Stack组件为容器组件,容器内可包含各种子元素

    层叠布局 (Stack) 层叠布局(StackLayout)用于在屏幕上预留一块区域来显示组件的元素,提供元素可以重叠的布局。层叠布局
    发表于 04-30 07:51

    flex-builder为什么无法构建xserver?

    我能够使用 flex-builder 工具很好地构建 OpenCV 组件。我正在尝试使用以下命令构建 xserver 组件: bld -c xserver -m ls1028ardb 我得到以下
    发表于 04-09 08:21

    如何使用flex-builder构建aruco库?

    我正在尝试构建 libopencv-aruco,它通常附带新版本的 OpenCV。当我运行 bld -c opencv 时,我没有看到正在构建此库。 谁能提供一些关于如何使用 flex-builder 构建 aruco 库的指导?
    发表于 03-31 06:13

    Flex Power Designer软件工具助力电源系统设计

    在电源系统的设计,时间是至关重要的因素。在紧迫的工期下交付可靠且高效的解决方案的需求,推动了对强大技术支持服务和工具的需求。Flex Power Modules提供广泛的资源来帮助工程师取得成功
    的头像 发表于 03-05 14:00 809次阅读

    请问DLPLCRC900DEVM上的Flex 和dlp050XY上的Flex网络名称怎么对应?

    请问DLPLCRC900DEVM上的Flex 和dlp050XY上的Flex网络名称怎么对应? 控制板M_DDA[15:0]对应 DMD DDC_[15:0] 控制板M_DDB[15:0]对应
    发表于 02-24 07:36