ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

ArkTs布局组件(一)

2026/8/6 4:18:02 拓冰建站 浏览量
ArkTs布局组件(一)

通用属性

名称参数描述
widthLength
heightLength
size{width?:Length,height?:Length}设置宽高尺寸
paddingPadding|Length内边距
marginMargin|Length外边距
constraintSize{minWidth?:Length|minHeight?:Length|maxWidth?:Length|maxHeight?:Length}设置约束尺寸,优先级高于width和height
layoutWeightnumber|string水平或垂直弹性尺寸

Length长度类型,用于描述尺寸单位

类型说明
number默认单位vp(虚拟像素)
string需要显示指定像素单位,如’10px’,或设置百分比字符串,如’100%’
Resource资源引用类型,引入系统资源或应用资源中的尺寸

vp虚拟像素单位:使元素在不同密度的设备上具有一致的视觉体量
fp字体像素单位:font pixel,大小默认与vp相同,即1vp=1fp。如果用户在设置中使用了更大的字体,字体的实际显示大小就会在vp的基础上乘以用户设置的缩放系数,即1fp = 1vp*缩放系数

Column组件

Column(value?: {space?: string | number; })
参数

参数参数类型描述
spacestring|number纵向布局元素垂直方向间距

属性

名称参数类型描述
alignItemsHorizontalAlign设置子组件在水平方向上的对齐方式
justifyContentFlexAlign设置子组件在垂直方向上的对齐方式

Raw组件

Raw(value?: {space?: string | number; })
参数

参数参数类型描述
spacestring|number横向布局元素间距

属性

名称参数类型描述
alignItemsVerticalAlign设置子组件在垂直方向上的对齐方式
justifyContentFlexAlign设置子组件在水平方向上的对齐方式
Column({ space: 10 }) {Row() {Row() {Image($r('app.media.ic_controlcenter_screenshot_filled')).width(48).height(48)}.layoutWeight(1)Row() {Image($r('app.media.icon')).width(48).height(48)}.backgroundColor('#ff9f9a6c').layoutWeight(2).width(100).height(100).justifyContent(FlexAlign.Center)}.backgroundColor('#ffe590a4').width('100%').height(200)Row() {Image($r('app.media.ic_contacts_company')).width(48).height(48)}.backgroundColor('#ff72dd84').width(200).height(200)Row() {Image($r('app.media.ic_controlcenter_screen_recording_filled')).objectFit(ImageFit.Contain).width(48).height(48)}.backgroundColor('#ff90d4e5').width(200).constraintSize({ minWidth: 300 }).height(200).alignItems(VerticalAlign.Center)}.size({ width: '100%', height: '100%' }).justifyContent(FlexAlign.SpaceAround).alignItems(HorizontalAlign.Center)

在这里插入图片描述

自定义组件

@Entry
@Component
struct CustomePages {//自定义内部组件@Builder BodyWidget() {Row() {}.layoutWeight(1).backgroundColor('#ffec7b7b').height(100)}build() {Row({ space: 10 }) {this.BodyWidget()Container({ color: '#ee2233', image: 'ic_contacts_company' })}}
}
//全局自定义组件,都能用
@Component
struct Container {color: string = '#22ffee'image: string = 'icon'build() {Row() {Image($r(`app.media.${this.image}`))}.layoutWeight(1).backgroundColor(this.color).height(200)}
}

在这里插入图片描述

自定义组件抽离成一个单独的文件

@Component
export struct ListWidget { //export@State data: number[] = [1, 2, 3]build() {List({ space: 10 }) {ForEach(this.data, (item, key) => {ListItem() {Text(`${item}`).fontSize(24)}.width('100%').backgroundColor('#eee').padding(10)}, item => item)}.width('100%').height('100%')}
}import {ListWidget} from './widget/ListWidget' //import
@Entry
@Component
struct StackPages {list: number[] = [1, 2, 3]build() {Stack({ alignContent: Alignment.BottomEnd }) {ListWidget({data:this.list})}}

Stack组件

Stack(value?: {alignContent?: Alignment})

参数参数类型描述
alignContentAlignment设置子组件在容器内的对齐方式
@Entry
@Component
struct StackPages {@State list: number[] = [1, 2, 3]//自定义组件@Builder NavWidget(text: string, textSize: number, color: string | number) {Row() {Text(text).textAlign(TextAlign.Center).width('100%').fontSize(textSize).fontColor(Color.White)}.width('100%').backgroundColor(color).padding({ top: 10, bottom: 10 })}//自定义组件@Builder ListWidget(data: Array<number>) {List({ space: 10 }) {ForEach(data, (item, key) => {ListItem() {Text(`${item}`).fontSize(24)}.width('100%').backgroundColor('#eee').padding(10)}, item => item)}.width('100%').height('100%')}//自定义组件@Builder ButtonWidget() {Button() {Text('+').fontColor('#fff').fontSize(40)}.backgroundColor('#ff45e1fd').width(80).height(80).margin({ right: 10, bottom: 10 }).onClick(()=> {this.doAdd()})}build() {Stack({ alignContent: Alignment.BottomEnd }) {Stack({ alignContent: Alignment.TopEnd }) {this.ListWidget(this.list)this.NavWidget('导航', 26, '#ffeac885')}this.ButtonWidget()}}//ListWidget是传值进去的,会导致list加入的数据不会进入ListWidget进行显示doAdd() {this.list.push(this.list[this.list.length-1] + 1);}
}

Flex组件

Flex(value?:{direction?:FlexDirection,wrap?:FlexWrap,alignContent?:FlexAlign,justifyContent?:FlexAlign,alignItems?: ItemAlign})
参数

参数名参数类型参数值描述
directionFlexDirectionRow(default),Column,RowReverse,ColumnReverse子组件在Flex容器内的排列方向,即主轴的方向
wrapFlexWrapNoWrap(default),Warp,WrapReverseFlex容器是单行/列还是多行/列
alignContentFlexAlignStart(default),Center,End,SpaceBetween,SpaceAround,SpaceEvenly交叉轴中有额外的空间时,多行内容的对齐格式(仅在wrap为Wrap或WrapReverse时生效)
justifyContentFlexAlignStart(default),Center,End,SpaceBetween,SpaceAround,SpaceEvenly子组件在Flex容器主轴上的对齐格式
alignItemsItemAlignStart(default),Center,End,Baseline,Stretch子组件在Flex容器交叉轴上的对齐格式
import { Header } from './widget/Header';
import {SearchContainer} from './widget/SearchContainer'
@Entry@Componentstruct FlexPage {@State searchData:string[] = ['计算机','手表','手机','饮料','可口可乐']build() {Column() {Header()Text('热搜').fontSize(28).fontColor('#ff505656').margin({left:20}).width('100%')SearchContainer({data:this.searchData,w:'100%',h:'100%'})//为什么此高度是全屏幕的100%,而不是剩下空间的100%}.width('100%').height('100%')}}
import font from '@ohos.font'
@Componentexport struct Header {build() {Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceEvenly }) {Button() {Image($r('app.media.ic_public_back')).width(40).height(40)}.backgroundColor(null)TextInput({ placeholder: '文本' }).placeholderColor('#000').placeholderFont({size:30}).fontSize(28).backgroundColor('#eeefff').borderRadius(30).padding(16).width('60%')Button() {Text('搜索').fontSize(26).fontColor('#000')}.backgroundColor(null).width('20%')}.width('100%').height(90)}}@Componentexport struct SearchContainer {data:string[]=['女装','女装','女装','女装']w:number|string = '100%'h:number|string = '100%'build() {Flex({direction:FlexDirection.RowReverse,wrap:FlexWrap.WrapReverse,alignContent:FlexAlign.SpaceEvenly}) {ForEach(this.data,(item,key)=>{Text(`${item}`).fontSize(24).backgroundColor('#ddd').padding(20).borderRadius(20).margin({top:10,right:10})})}.width(this.w).height(this.h).padding(20)}}

属性

名称参数类型描述
flexGrownumber设置父容器的剩余空间分配给此属性所在组件的比例,自适应拉伸布局
flexShrinknumber当父容器空间不足时,子组件的压缩比例

在这里插入图片描述