跳到主要内容HarmonyOS RcList 组件缩略图、角标与图标系统设计 | 极客日志TypeScript大前端
HarmonyOS RcList 组件缩略图、角标与图标系统设计
HarmonyOS RcList 组件提供缩略图、角标与额外图标三大视觉子系统。缩略图支持尺寸映射、圆角控制及 Cover 填充模式,通过 Stack 容器叠加角标实现右上角定位。角标系统涵盖红点、数字气泡及文字标签形态,内置数字截断逻辑与颜色配置。额外图标支持矢量与图片双模式,可独立或组合使用。三套系统灵活搭配,适用于内容型列表与功能型列表的视觉富化需求。
云间运维51 浏览 一、缩略图系统设计
1.1 缩略图渲染流程
RcListItem 的缩略图由 renderRcListItemThumb() 负责渲染,该方法使用 Stack 容器将图片和角标叠加在一起:

@Builder
renderRcListItemThumb() {
if (this.rcListItemThumb) {
Stack() {
Image(this.rcListItemThumb)
.width(this.getRcListItemThumbSize())
.height(this.getRcListItemThumbSize())
.borderRadius(getSizeByUnit(this.rcListItemThumbRadius))
.objectFit(ImageFit.Cover)
if (this.rcListItemShowBadge && this.rcListItemBadge) {
}
}
.alignContent(Alignment.TopEnd)
.margin({ right: 12 })
}
}
设计要点:
- 图片使用
ImageFit.Cover 填充模式,确保任何尺寸的图片都不会被拉伸变形
Stack.alignContent(Alignment.TopEnd) 将角标定位在右上角
margin({ right: 12 }) 与主体内容保持间距
1.2 尺寸映射方法
private getRcListItemThumbSize(): number {
if (typeof this.rcListItemThumbSize === 'number') {
return this.rcListItemThumbSize
}
if (typeof this.rcListItemThumbSize === 'string' && !isNaN(Number(this.rcListItemThumbSize))) {
return Number(this.rcListItemThumbSize)
}
switch (this.rcListItemThumbSize) {
case 'small': return 40
case 'large': return 80
case 'medium': default: return 60
}
}
这个方法的处理顺序体现了输入容错原则:先处理精确类型(number),再处理可转换类型(数字字符串),最后处理语义预设值。无论用户怎么传参,都不会报错。
1.3 缩略图三档尺寸对比
| 预设值 | 尺寸 | 典型场景 |
|---|
'small' | 40 × 40 | 小图标、应用图标 |
'medium' | 60 × 60 | 联系人头像、商品封面 |
'large' | 80 × 80 | 专辑封面、大头像 |
| 自定义数字 | N × N | 精准控制尺寸场景 |
1.4 圆角控制
rcListItemThumbRadius 参数控制缩略图圆角,配合尺寸可以实现多种形态:
RcListItem({
rcListItemThumb: $r('app.media.startIcon'),
rcListItemThumbSize: 'medium',
rcListItemThumbRadius: 8
})
RcListItem({
rcListItemThumb: $r('app.media.startIcon'),
rcListItemThumbSize: 60,
rcListItemThumbRadius: 30
})
RcListItem({
rcListItemThumb: $r('app.media.startIcon'),
rcListItemThumbSize: 'medium',
rcListItemThumbRadius: 0
})
提示:要获得完美正圆效果,rcListItemThumbRadius 需要等于 rcListItemThumbSize 的一半。当 rcListItemThumbSize 使用预设值时,圆角对应关系为:small → 20,medium → 30,large → 40。
二、角标系统实现
2.1 角标三种形态
RcListBadgeConfig 支持三种角标形态,通过 isDot、value 组合控制:
| 配置组合 | 渲染形态 | 典型场景 |
|---|
{ isDot: true } | 红点(8px 圆形) | 仅提示有新内容 |
{ value: 5 } | 数字气泡 | 未读消息数量 |
{ value: 'NEW' } | 文字气泡 | 新功能标签 |
2.2 角标渲染分支
if (this.rcListItemBadge.isDot) {
Circle()
.width(8)
.height(8)
.fill(this.getRcListItemBadgeColor())
.position({ x: '100%', y: 0 })
.translate({ x: -4, y: 4 })
} else if (this.getRcListItemBadgeText()) {
Text(this.getRcListItemBadgeText())
.fontSize(10)
.fontColor(Color.White)
.backgroundColor(this.getRcListItemBadgeColor())
.padding({ left: 4, right: 4, top: 2, bottom: 2 })
.borderRadius(10)
.position({ x: '100%', y: 0 })
.translate({ x: -6, y: 6 })
}
位置计算使用 position({ x: '100%', y: 0 }) 相对于 Stack 的右上角定位,再通过 translate 微调,确保角标压在图片的边缘而非完全超出。
2.3 数字截断逻辑
private getRcListItemBadgeText(): string {
if (!this.rcListItemBadge.value) {
return ''
}
const max = this.rcListItemBadge.max || 99
const value = this.rcListItemBadge.value
if (typeof value === 'number' && value > max) {
return `${max}+`
}
return String(value)
}
这个方法只对数字类型做截断判断,字符串角标(如 'NEW')不受 max 影响,设计简洁合理。
2.4 角标颜色处理
private getRcListItemBadgeColor(): string | Color {
const color = this.rcListItemBadge.color
if (!color) {
return '#fa3534'
}
if (typeof color === 'string') {
return color
}
return '#fa3534'
}
颜色处理方法考虑了 ResourceColor 的三种子类型:未定义、字符串、Resource 引用。对于 Resource 类型目前回退到默认色,保证了安全性。
2.5 四种角标配置示例
rcListItemBadge: { value: 5 }
rcListItemBadge: { value: 150, max: 99 }
rcListItemBadge: { isDot: true, color: '#409eff' }
rcListItemBadge: { value: 'HOT', color: '#ff6700' }
三、额外图标系统
3.1 额外图标的定位
renderRcListItemExtraIcon() 渲染在 RcListItem 的最左侧,位于缩略图的左边。实际使用时,额外图标和缩略图通常二选一:
- 额外图标:使用矢量图标(RcIcon),适合设置页、功能菜单
- 缩略图:使用图片,适合头像、商品封面等内容型列表
@Builder
renderRcListItemExtraIcon() {
if (this.rcListItemShowExtraIcon && this.rcListItemExtraIcon.name) {
RcIcon({
name: this.rcListItemExtraIcon.name,
iconSize: this.rcListItemExtraIcon.size || 20,
color: this.rcListItemExtraIcon.color || this.baseStyle.primary
}).margin({ right: 12 })
}
}
3.2 双模式图标支持
RcListExtraIconConfig.name 字段的类型是 keyof RcIconDataType | ResourceStr,因此支持两种图标来源:
RcListItem({
rcListItemShowExtraIcon: true,
rcListItemExtraIcon: {
name: 'icon-houi_bell_outline',
color: '#409eff',
size: 22
}
})
RcListItem({
rcListItemShowExtraIcon: true,
rcListItemExtraIcon: {
name: $r('app.media.startIcon'),
size: 24
}
})
RcListItem({
rcListItemShowExtraIcon: true,
rcListItemExtraIcon: {
name: 'https://example.com/icon.png',
size: 24
}
})
提示:使用本地 Resource 图片($r())作为额外图标时,color 属性无法改变图片颜色,该参数仅对矢量字体图标有效。
3.3 常用图标与颜色搭配
| 场景 | 图标名 | 推荐颜色 |
|---|
| 通知/消息 | icon-houi_bell_outline | #409eff(蓝色) |
| 设置 | icon-houi_settings_outline | #909399(灰色) |
| 下载 | icon-houi_download_outline | #67c23a(绿色) |
| 夜间模式 | icon-houi_moon_outline | #303133(深色) |
| 首页 | icon-houi_home_outline | #e6a23c(橙色) |
| 星标/收藏 | icon-houi_star_outline | #e6a23c(橙色) |
| 消息 | icon-houi_message_circle_outline | #409eff(蓝色) |
| 同步 | icon-houi_sync_outline | #67c23a(绿色) |
| 锁定 | icon-houi_lock_outline | #c0c4cc(浅灰) |
四、三系统组合布局
4.1 布局优先级
当同时设置了额外图标和缩略图时,两者都会渲染,布局从左到右依次为:
| extraIcon | thumb | 标题 + 描述 | rightText / switch / arrow |
build() {
Row({ space: 0 }) {
this.renderRcListItemExtraIcon()
this.renderRcListItemThumb()
this.renderRcListItemBody()
this.renderRcListItemFooter()
}
}
4.2 角标依附于缩略图
- 只有设置了
rcListItemThumb 时,角标才会显示
- 若只有额外图标而没有缩略图,角标不会出现在额外图标上
RcListItem({
rcListItemThumb: $r('app.media.startIcon'),
rcListItemThumbSize: 'medium',
rcListItemShowBadge: true,
rcListItemBadge: { value: 5 }
})
RcListItem({
rcListItemShowExtraIcon: true,
rcListItemExtraIcon: { name: 'icon-houi_bell_outline' },
rcListItemShowBadge: true,
rcListItemBadge: { value: 5 }
})
总结
RcList 的视觉富化系统由缩略图、角标、额外图标三个子系统有机组合而成。缩略图通过 Stack 叠加实现了角标依附效果,额外图标通过类型联合支持矢量与图片双模式,角标通过智能截断和多形态适配了真实业务场景。三套系统可以独立使用,也可以自由组合,灵活性极强。
在实际开发中,建议遵循以下原则:内容型列表(头像、商品)使用缩略图,功能型列表(设置、菜单)使用额外图标,消息提示场景搭配角标系统,将视觉信息层次做到最优。
相关免费在线工具
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
- JSON美化和格式化
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online