
项目已开源,开源地址: https://gitcode.com/nutpi/HarmonyosNextCaseStudyTutorial , 欢迎fork & star

在上一篇教程中,我们介绍了Column组件的reverse属性及其在时间线应用中的基本用法。本篇将深入探讨时间线中各个子组件的实现细节,包括ForEach循环渲染、Row布局、Text组件的样式设置,以及如何通过这些组件构建一个完整的时间线界面。
在时间线应用中,需要渲染多条消息,这时可以使用ForEach进行循环渲染。
在我们的案例中,ForEach的使用如下:
ForEach(this.messages.reverse(), (msg:string, index) => {
// 渲染每条消息
}, (msg:string) => msg)ForEach接受三个参数:
参数 | 类型 | 描述 |
|---|---|---|
第一个参数 | 数组 | 要遍历的数据源,这里是反转后的消息数组 |
第二个参数 | 回调函数 | 定义如何渲染每个数组元素,接收当前元素和索引作为参数 |
第三个参数 | 回调函数 | 为每个元素生成唯一标识符,用于优化渲染性能 |
ForEach的第三个参数用于生成唯一标识符,这对于列表渲染的性能优化非常重要:
(msg:string) => msg在本例中,直接使用消息字符串作为唯一标识符。在实际应用中,如果数据是对象数组,通常会使用对象的唯一ID属性作为标识符。
每条消息项使用Row组件实现水平布局,包含时间戳和消息内容两部分。
Row({ space: 8 })
{
// 时间戳
Text(msg.split(': ')[0])
.fontSize(12)
.fontColor(0x666666)
.width(80)
.textAlign(TextAlign.Start)
.textOverflow({ overflow:TextOverflow.MARQUEE })
// 消息内容
Text(msg.split(': ')[1])
.fontSize(14)
.lineHeight(1.5)
.flexGrow(1)
.textOverflow({ overflow:TextOverflow.MARQUEE })
}
.width('100%')
.padding(12)
.backgroundColor(index % 2 === 0 ? 0xF5F5F5 : 0xFFFFFF) // 交替背景色
.borderRadius(8)参数/属性 | 值 | 作用 |
|---|---|---|
space | 8 | 设置子组件之间的水平间距为8vp |
width | ‘100%’ | 设置Row宽度占父容器的100% |
padding | 12 | 设置内边距为12vp |
backgroundColor | 条件表达式 | 根据索引设置交替背景色 |
borderRadius | 8 | 设置边框圆角为8vp |
交替背景色是列表显示的常用技巧,可以提高可读性。在我们的案例中,通过索引的奇偶性来设置不同的背景色:
.backgroundColor(index % 2 === 0 ? 0xF5F5F5 : 0xFFFFFF) // 交替背景色时间线中的每条消息包含两个Text组件:时间戳和消息内容,它们有不同的样式设置。
// 时间戳
Text(msg.split(': ')[0])
.fontSize(12)
.fontColor(0x666666)
.width(80)
.textAlign(TextAlign.Start)
.textOverflow({ overflow:TextOverflow.MARQUEE })属性 | 值 | 作用 |
|---|---|---|
fontSize | 12 | 设置字体大小为12vp,较小的字体适合时间戳 |
fontColor | 0x666666 | 设置字体颜色为深灰色,使其不太突兀 |
width | 80 | 设置固定宽度为80vp,保证时间戳对齐 |
textAlign | TextAlign.Start | 设置文本左对齐 |
textOverflow | { overflow:TextOverflow.MARQUEE } | 设置文本溢出时显示为跑马灯效果 |
// 消息内容
Text(msg.split(': ')[1])
.fontSize(14)
.lineHeight(1.5)
.flexGrow(1)
.textOverflow({ overflow:TextOverflow.MARQUEE })属性 | 值 | 作用 |
|---|---|---|
fontSize | 14 | 设置字体大小为14vp,比时间戳大,突出主要内容 |
lineHeight | 1.5 | 设置行高为字体大小的1.5倍,提高可读性 |
flexGrow | 1 | 设置弹性增长系数为1,使其占据剩余空间 |
textOverflow | { overflow:TextOverflow.MARQUEE } | 设置文本溢出时显示为跑马灯效果 |
TextOverflow是处理文本溢出的重要属性,在我们的案例中,使用了MARQUEE(跑马灯)效果:
.textOverflow({ overflow:TextOverflow.MARQUEE })TextOverflow枚举值包括:
枚举值 | 描述 |
|---|---|
CLIP | 裁剪溢出的文本 |
ELLIPSIS | 用省略号表示溢出的文本 |
MARQUEE | 跑马灯效果,文本会滚动显示 |
NONE | 不处理溢出文本,可能导致文本超出容器边界 |
在时间线设计中,保持布局合理和样式一致性是提升用户体验的关键。
元素 | 间距 |
|---|---|
消息项之间 | 16vp(通过Column的space参数设置) |
时间戳与消息内容之间 | 8vp(通过Row的space参数设置) |
消息项内边距 | 12vp(通过Row的padding设置) |
列表与屏幕边缘 | 24vp(通过Column的padding设置) |
元素 | 字体大小 | 字体颜色 |
|---|---|---|
时间戳 | 12vp | 深灰色(0x666666) |
消息内容 | 14vp | 默认颜色(黑色) |
元素 | 颜色 | 十六进制值 |
|---|---|---|
偶数项背景 | 浅灰色 | 0xF5F5F5 |
奇数项背景 | 白色 | 0xFFFFFF |
时间戳文字 | 深灰色 | 0x666666 |
消息内容文字 | 黑色 | 默认 |
消息项统一使用8vp的圆角,保持视觉一致性。
让我们回顾完整的TimelineExample组件代码:
@Component
export struct TimelineExample {
private messages: string[] = [
'2025-05-30 15:45: 您好,欢迎使用HarmonyOS NEXT!',
'2025-05-30 15:40: 系统已为您更新最新通知',
'2025-05-30 15:35: 您的订单已发货'
]
build() {
Column({ space: 16 })
{ // 固定高度,模拟列表容器
ForEach(this.messages.reverse(), (msg:string, index) => { // 反转数组保持渲染顺序
Row({ space: 8 })
{
// 时间戳
Text(msg.split(': ')[0])
.fontSize(12)
.fontColor(0x666666)
.width(80)
.textAlign(TextAlign.Start)
.textOverflow({ overflow:TextOverflow.MARQUEE })
// 消息内容
Text(msg.split(': ')[1])
.fontSize(14)
.lineHeight(1.5)
.flexGrow(1)
.textOverflow({ overflow:TextOverflow.MARQUEE })
}
.width('100%')
.padding(12)
.backgroundColor(index % 2 === 0 ? 0xF5F5F5 : 0xFFFFFF) // 交替背景色
.borderRadius(8)
}, (msg:string) => msg)
}.width('100%')
.padding({ top: 24, left: 24, right: 24 })
.reverse(true) // 子组件反向排列(新消息在上)
.height('80%')
}
}通过本教程的两个部分,我们详细讲解了如何使用Column组件的reverse属性构建反向排列的时间线,包括: