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 也可用于很多常见布局场景,如下图效果:
利用 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 份,第三列占两份:
核心代码如下:
@state number: 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('1fr 1fr 2fr') .rowstemplate('1fr 1fr 2fr') .backgroundcolor(color.black) .height(300)}
这两个属性里面也可使用 px 单位,如将 columnstemplate 修改:
.columnstemplate('100px 1fr 1fr')
展示效果如下:
columnsgap 和 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('1fr 1fr 1fr 1fr 1fr') .columnsgap(10) .rowsgap(10) .onscrollindex((first: number) => { console.log(first.tostring()) }) .backgroundcolor(color.black) .height(300)
总结
grid 布局与 flex 有一定的相似性,都可以指定容器内部多个项目的位置。但是,它们也存在重大区别。
flex 布局是轴线布局,只能指定项目针对轴线的位置,可以看作是一维布局。
grid 布局则是将容器划分成行和列,产生单元格,然后指定项目所在的单元格,可以看作是二维布局。
其实掌握这两种布局方式,页面上面大部分效果都是可以做出来的。当然,当前 gird 布局还有很多属性是不支持的,相比较与传统的前端 grid 布局功能上有很多不足,期待 api 更新,完善功能。
瞄准工业物联网 高通发布骁龙600E和410E处理器
嵌入式Web服务器可以解决物联网问题吗
Xilinx与生态伙伴启动All Programmable抽象化计划 助力更多设计人员并将生产力提升
基于一种典型的LED应用电路设计
锌-空气电池
Openharmony中的Flex和Grid布局
浅谈激光切割工艺参数如何确定
小电容为什么适用于高频电路?为什么高频旁路电容选择小电容?
续航1000+公里背后的电池“竞赛”
12V输入-5.2/15A输出的双相反向降压/升压电源
一加6T曝光,支持屏下指纹技术电池容量有提升增加了续航能力
人工智能在航空市场的业务洞察力方面表现如何
新媒传信:助运营商全面提升基础电信服务能力
Linux中查看硬件信息超强命令sar
源创通信fxs/fxo Asterisk卡介绍
基于SmCl3框架的SSE的全固态电池在室温下的应用表现
SUB1GHz高集成度无线收发芯片DP4301简介
如何选择适合工业电池的充电器?
CPU一般能使用多久应该如何才能合理的使用及维护CPU
数字资产交易系统怎么盈利 数字资产交易系统开发