#跟着晓明学鸿蒙# RelativeContainer卡片布局之基础UI实现
·
目录
- 案例介绍
- 代码实现
- 代码详解
- 1. 卡片容器设置
- 2. 标题组件实现
- 3. 内容组件实现
- 4. 图片组件实现
- 总结
案例介绍
本案例将介绍如何使用RelativeContainer组件实现卡片的基础UI布局。我们将实现卡片的标题、内容、图片等基本元素的布局,并确保它们能够根据内容自动调整位置和大小。
代码实现
@Builder
CardItem(card: {
id: string,
title: string,
content: string,
tags: string[],
imageUrl?: Resource,
likes: number,
comments: number
}) {
RelativeContainer() {
// 卡片标题
Text(card.title)
.fontSize(18)
.fontWeight(FontWeight.Medium)
.fontColor('#333333')
.maxLines(2)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.id('title')
.alignRules({
top: { anchor: '__container__', align: VerticalAlign.Top },
left: { anchor: '__container__', align: HorizontalAlign.Start },
right: { anchor: '__container__', align: HorizontalAlign.End }
})
.margin({ top: 16, left: 16, right: 16 })
// 卡片内容
Text(card.content)
.fontSize(14)
.fontColor('#666666')
.maxLines(3)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.id('content')
.alignRules({
top: { anchor: 'title', align: VerticalAlign.Bottom },
left: { anchor: '__container__', align: HorizontalAlign.Start },
right: card.imageUrl ? { anchor: 'image', align: HorizontalAlign.Start } : { anchor: '__container__', align: HorizontalAlign.End }
})
.margin({ top: 8, left: 16, right: card.imageUrl ? 12 : 16 })
// 卡片图片(如果有)
if (card.imageUrl) {
Image(card.imageUrl)
.width(120)
.height(90)
.objectFit(ImageFit.Cover)
.borderRadius(8)
.id('image')
.alignRules({
top: { anchor: 'title', align: VerticalAlign.Bottom },
right: { anchor: '__container__', align: HorizontalAlign.End }
})
.margin({ top: 8, right: 16 })
}
}
.width('100%')
.backgroundColor('#FFFFFF')
.borderRadius(12)
.shadow({
radius: 6,
color: '#1A000000',
offsetX: 0,
offsetY: 2
})
}
代码详解
1. 卡片容器设置
RelativeContainer()
.width('100%')
.backgroundColor('#FFFFFF')
.borderRadius(12)
.shadow({
radius: 6,
color: '#1A000000',
offsetX: 0,
offsetY: 2
})
容器样式特点:
- 使用RelativeContainer作为根容器,支持元素相对定位
- 设置白色背景和圆角边框
- 添加阴影效果提升视觉层次感
2. 标题组件实现
Text(card.title)
.fontSize(18)
.fontWeight(FontWeight.Medium)
.fontColor('#333333')
.maxLines(2)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.id('title')
.alignRules({
top: { anchor: '__container__', align: VerticalAlign.Top },
left: { anchor: '__container__', align: HorizontalAlign.Start },
right: { anchor: '__container__', align: HorizontalAlign.End }
})
.margin({ top: 16, left: 16, right: 16 })
标题组件特点:
- 设置合适的字体大小和粗细
- 限制最大行数为2行,超出显示省略号
- 通过alignRules设置相对位置:
- 顶部对齐容器顶部
- 左右两侧对齐容器边缘
3. 内容组件实现
Text(card.content)
.fontSize(14)
.fontColor('#666666')
.maxLines(3)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.id('content')
.alignRules({
top: { anchor: 'title', align: VerticalAlign.Bottom },
left: { anchor: '__container__', align: HorizontalAlign.Start },
right: card.imageUrl ? { anchor: 'image', align: HorizontalAlign.Start } : { anchor: '__container__', align: HorizontalAlign.End }
})
.margin({ top: 8, left: 16, right: card.imageUrl ? 12 : 16 })
内容组件特点:
- 使用较小的字体和浅色文字
- 限制最大行数为3行
- 位置规则:
- 顶部对齐标题底部
- 左侧对齐容器
- 右侧根据是否有图片动态调整
4. 图片组件实现
if (card.imageUrl) {
Image(card.imageUrl)
.width(120)
.height(90)
.objectFit(ImageFit.Cover)
.borderRadius(8)
.id('image')
.alignRules({
top: { anchor: 'title', align: VerticalAlign.Bottom },
right: { anchor: '__container__', align: HorizontalAlign.End }
})
.margin({ top: 8, right: 16 })
}
图片组件特点:
- 条件渲染,只在有图片时显示
- 固定尺寸和圆角
- 使用objectFit确保图片填充效果
- 位置规则:
- 顶部对齐标题底部
- 右侧对齐容器
总结
本文通过使用RelativeContainer
组件实现了卡片的基础UI布局,展示了如何构建一个灵活且美观的卡片展示效果。通过合理设置容器的背景、圆角和阴影,提升了视觉层次感。利用alignRules
属性,精确控制标题、内容和图片等元素的位置关系,实现了自适应的文本显示和图片布局。同时,通过条件渲染和动态调整样式,确保了卡片在不同数据情况下的适应性。这种基础UI实现为后续添加标签、互动功能等高级特性提供了坚实的基础,同时也为其他类似卡片布局的设计提供了参考。
更多推荐
所有评论(0)