HarmonyOS鸿蒙Next中这种的布局用什么组件?
HarmonyOS鸿蒙Next中这种的布局用什么组件?
本来想用Stack,可是Stack好像没有子组件单独align的方法?用RelativeContainer的话放在Row里边RelativeContainer的宽度拉满了,设置auto也没管用。
这种的不说比Android了,比Flutter都费劲很多啊
更多关于HarmonyOS鸿蒙Next中这种的布局用什么组件?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
不知道楼主是不是想要这种效果,已经给楼主改好了。
另外,在鸿蒙中建议长度单位写为’vp’(虚拟像素,vp单位可省略), lpx 是逻辑像素单位
示例:
.height('60vp') // 等效 > .height(60)
@Builder
function selectionLineItem(params: SelectionLineItemParams) {
Column({ space: 5 }) {
Button(params.text)
.height('60lpx')
.fontSize('28lpx')
.fontColor(params.selected ? Color.White : Color.Orange)
.fontWeight(params.selected ? FontWeight.Bold : FontWeight.Normal)
.backgroundColor(params.selected ? Color.Orange : Color.Transparent)
if (params.onDeleteClick != undefined) {
Image($r('app.media.delete_red'))
.width('30lpx')
.height('30lpx')
.borderRadius('15lpx')
.position({ top: '-15lpx', right: 0 })
.onClick(params.onDeleteClick)
}
if (params.showBottomIndicator && params.selected) {
Image($r('app.media.selected_arrow_white'))
.width('20lpx')
.height('15lpx')
.onClick(params.onDeleteClick)
}
}
.onClick(params.onClick)
}
更多关于HarmonyOS鸿蒙Next中这种的布局用什么组件?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
只要思想不滑坡,办法总比困难多。没办法,RelativeContainer是真难用。只能多想点组合办法,大不了,Stack中再包一个Stack。
右上角删除可以postion,下面那个三角形的应该可以
删除用position({ top: 0, right: 0 })
可以,三角用position({ bottom: 0, left:0, right: 0 })
的话它是靠左下角了,有点奇怪,我设置Stack
成Alignment.Center
,三角只用bottom
也是左下角,
同时left:0和right:0肯定不行,只能设置一个。直接设置left:10这种,
标题
能解决部分问题,三角好像没法放,
子标题
- 列表项1
- 列表项2
- 列表项3
套了3层Stack实现了。。。
@Builder
function selectionLineItem(params: SelectionLineItemParams) {
Stack() {
Stack() {
Stack() {
Text(params.text)
.fontSize('28lpx')
.fontColor(params.selected ? Color.White : appTheme.colors.tipText)
.fontWeight(params.selected ? FontWeight.Bold : FontWeight.Normal)
}
.alignContent(Alignment.Center)
.height('60lpx')
.padding({ left: '38lpx', right: '38lpx' })
.borderRadius('30lpx')
.backgroundColor(params.selected ? appTheme.colors.primary : Color.Transparent)
.onClick(params.onClick)
if (params.onDeleteClick != undefined) {
Image($r('app.media.delete_red'))
.width('30lpx')
.height('30lpx')
.offset({ top: '-15lpx', right: '-15lpx' })
.onClick(params.onDeleteClick)
}
}
.padding({ top: '15lpx', right: '15lpx' })
.alignContent(Alignment.TopEnd)
if (params.showBottomIndicator && params.selected) {
Image($r('app.media.selected_arrow_white'))
.width('20lpx')
.height('15lpx')
.margin({ top: '80lpx' })
.onClick(params.onDeleteClick)
}
}
.alignContent(Alignment.Top)
.height(params.showBottomIndicator ? '95lpx' : '75lpx')
}
在HarmonyOS Next中实现该布局建议使用Column、Row、Stack等ArkUI组件组合。Column用于纵向排列子组件,Row用于横向排列,Stack用于层叠布局。可配合Flex弹性布局、Grid网格布局或List列表组件使用。具体组件选择取决于实际布局结构,需结合Position定位、Margin/Padding间距等样式属性调整。ForEach循环渲染适用于动态内容展示。
在HarmonyOS Next中实现这种布局,推荐使用Flex
组件配合Stack
的组合方案。具体分析如下:
- 对于图片+文字的叠加效果,仍然建议使用
Stack
作为容器,通过绝对定位控制子组件位置:
Stack({ alignContent: Alignment.BottomStart }) {
Image()
.width('100%')
Column() {
Text('标题').fontSize(16)
Text('副标题').fontSize(12)
}.margin({ bottom: 10, left: 10 })
}
- 当需要横向排列多个这样的卡片时,使用
Flex
布局比Row
更灵活:
Flex({ direction: FlexDirection.Row, wrap: FlexWrap.Wrap }) {
ForEach(this.cardData, (item) => {
Stack() {
// 卡片内容
}.width('45%').margin(5)
})
}
- 关键点说明:
- 通过Stack的alignContent属性控制整体对齐
- 子组件使用margin/padding实现精确定位
- Flex布局的wrap属性可实现自动换行
- 百分比宽度适配不同屏幕
这种方案避免了RelativeContainer的复杂度,同时解决了Row布局的宽度问题。Flutter的Stack确实有更灵活的定位方式,但HarmonyOS的Stack+Flex组合也能达到类似效果。