布局
思路
- 将每个组件看作盒子
- 可以通过DevEco Previewer的TT查看,也可以自己设置.borderWidth查看盒子
主轴与交叉轴概述
两个轴相互垂直,不同容器中主轴方向不一样。如Column主轴为竖、交叉轴为横,而Row则相反。
- 设置主轴:.justyfyContent(FlexAlign.)
- 设置交叉轴:.alignItems(HorizontalAlign/VerticalAlign.)
Column
Row
Row({space:}) .width() .height() .alignItems(VerticalAlign) .justifyContent(FlexAlign or FlexDirection or FlexWarp)
|
Stack
前面写的组件在下,后面写的在上
Stack({alignContent:Alignment.Center}){ }
|
RelativeContainer
RelativeContainer() {} .alignRules({ middle: { anchor: "__container__", align: HorizontalAlign.Center }, center: { anchor: "__container__", align: VerticalAlign.Center } }) .layoutWeight .id('xxxx')
|
Grid
Grid() { GridItem() { Text(key) ... } .columnStart(1) .columnEnd(2) .rowStart(5) .rowEnd(6) }
.rowsTemplate('1fr 1fr 1fr') .columnsTemplate('1fr 2fr 1fr')
.maxCount(3) .layoutDirection(GridDirection.Row)
.columnsGap(10) .rowsGap(15)
|
Flex
吃性能
Flex({ justifyContent:FlexAlign.SpaceAround, direction:FlexDirection.Row, wrap:FlexWrap.Wrap, alignContent:FlexAlign.SpaceAround })
|
Tabs
一般用法:
Tabs(){ TabContent(){} .tabBar(this.newTab()) } .barPosition(BarPosition.End) .scrollable(false) .onChange(()=>{ }) @Builder newTab(){}
|
自定义tabBar:不使用自定义导航栏时,系统默认的Tabs会实现切换逻辑。在使用了自定义导航栏后,切换页签的逻辑需要手动实现。即用户点击对应页签时,屏幕需要显示相应的内容页。
tabsController : TabsController = new TabsController() @State currentIndex:number = 0;
Tabs(this.tabsController)
@Builder TabBuilder(title: string, targetIndex: number) { Column() { ... .onClick(() => { this.currentIndex = targetIndex; this.tabsController.changeIndex(this.currentIndex); }) }
|