跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
TypeScript大前端

HarmonyOS RcList 组件缩略图、角标与图标系统设计

HarmonyOS RcList 组件提供缩略图、角标与额外图标三大视觉子系统。缩略图支持尺寸映射、圆角控制及 Cover 填充模式,通过 Stack 容器叠加角标实现右上角定位。角标系统涵盖红点、数字气泡及文字标签形态,内置数字截断逻辑与颜色配置。额外图标支持矢量与图片双模式,可独立或组合使用。三套系统灵活搭配,适用于内容型列表与功能型列表的视觉富化需求。

云间运维发布于 2026/3/23更新于 2026/5/2319 浏览
HarmonyOS RcList 组件缩略图、角标与图标系统设计

一、缩略图系统设计

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
  }
  // 传数字字符串(如 '50'):转换为数字
  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 
})
// 正圆头像(半径 = 尺寸 / 2)
RcListItem({ 
  rcListItemThumb: $r('app.media.startIcon'), 
  rcListItemThumbSize: 60, 
  rcListItemThumbRadius: 30 // 60 / 2 = 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 角标渲染分支
// 在 Stack 中叠加渲染角标
if (this.rcListItemBadge.isDot) {
  // 点状角标:固定 8px 红点
  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 // 未设置 max 时默认 99
  const value = this.rcListItemBadge.value // 只对数字进行截断
  if (typeof value === 'number' && value > max) {
    return `${max}+` // 超出则显示 "99+"
  }
  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 // 字符串颜色直接使用
  }
  // Resource 类型($r() 引用)暂不支持直接渲染,回退到默认红色
  return '#fa3534'
}

颜色处理方法考虑了 ResourceColor 的三种子类型:未定义、字符串、Resource 引用。对于 Resource 类型目前回退到默认色,保证了安全性。

2.5 四种角标配置示例
// 1. 普通数字角标
rcListItemBadge: { value: 5 }
// 2. 超出最大值角标(显示 99+)
rcListItemBadge: { value: 150, max: 99 }
// 3. 点状角标(蓝色)
rcListItemBadge: { isDot: true, color: '#409eff' }
// 4. 自定义文字 + 自定义颜色
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,因此支持两种图标来源:

模式一:内置矢量图标

// 使用 rchoui 内置的矢量图标(字体图标)
RcListItem({ 
  rcListItemShowExtraIcon: true, 
  rcListItemExtraIcon: { 
    name: 'icon-houi_bell_outline', // 内置图标名称 
    color: '#409eff', 
    size: 22 
  } 
})

模式二:本地或网络图片

// 使用本地 Resource 图片
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() // 1. 额外图标(最左侧)
    this.renderRcListItemThumb() // 2. 缩略图(extra 右侧)
    this.renderRcListItemBody() // 3. 标题 + 描述(flex:1)
    this.renderRcListItemFooter() // 4. 右侧操作区
  }
}
4.2 角标依附于缩略图

角标是缩略图的叠加层,不是独立区域。因此:

  • 只有设置了 rcListItemThumb 时,角标才会显示
  • 若只有额外图标而没有缩略图,角标不会出现在额外图标上
// 正确:角标会显示在缩略图右上角
RcListItem({ 
  rcListItemThumb: $r('app.media.startIcon'), 
  rcListItemThumbSize: 'medium', 
  rcListItemShowBadge: true, 
  rcListItemBadge: { value: 5 } 
})
// 注意:没有设置 thumb,角标不会渲染
RcListItem({ 
  rcListItemShowExtraIcon: true, 
  rcListItemExtraIcon: { name: 'icon-houi_bell_outline' }, 
  rcListItemShowBadge: true, // 此设置无效,因为没有 thumb 
  rcListItemBadge: { value: 5 } 
})

总结

RcList 的视觉富化系统由缩略图、角标、额外图标三个子系统有机组合而成。缩略图通过 Stack 叠加实现了角标依附效果,额外图标通过类型联合支持矢量与图片双模式,角标通过智能截断和多形态适配了真实业务场景。三套系统可以独立使用,也可以自由组合,灵活性极强。

在实际开发中,建议遵循以下原则:内容型列表(头像、商品)使用缩略图,功能型列表(设置、菜单)使用额外图标,消息提示场景搭配角标系统,将视觉信息层次做到最优。

目录

  1. 一、缩略图系统设计
  2. 1.1 缩略图渲染流程
  3. 1.2 尺寸映射方法
  4. 1.3 缩略图三档尺寸对比
  5. 1.4 圆角控制
  6. 二、角标系统实现
  7. 2.1 角标三种形态
  8. 2.2 角标渲染分支
  9. 2.3 数字截断逻辑
  10. 2.4 角标颜色处理
  11. 2.5 四种角标配置示例
  12. 三、额外图标系统
  13. 3.1 额外图标的定位
  14. 3.2 双模式图标支持
  15. 3.3 常用图标与颜色搭配
  16. 四、三系统组合布局
  17. 4.1 布局优先级
  18. 4.2 角标依附于缩略图
  19. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 前端团队协作最佳实践
  • AIGC 时代的网络安全威胁与应急响应机制构建
  • 银河麒麟及 Linux 系统下 MySQL 8.0 安装部署指南
  • 前端 GraphQL 客户端:优雅地获取数据
  • AIri 虚拟角色全平台部署指南(Web/桌面/移动)
  • Python 极简教程:Java 开发者视角入门实战
  • LazyLLM 多 Agent 应用实战:源码部署与可视化调试指南
  • 前端安全实战:密码加密与常见漏洞防护
  • Openclaw 对接本地 Ollama 服务无响应问题排查
  • IDEA 报警:未注解方法重写@NonNullApi 注解方法
  • Visual C++ 运行库管理指南:故障诊断与部署维护
  • 飞算 JavaAI 深度评测:从需求分析到工程化生成的全流程解析
  • DocxFactory:基于 C++ 的 Word 文档处理开源库
  • 高并发场景下 Java 与 Go 的区别及 Channel 机制详解
  • 智慧社区可视化平台的设计与实现
  • MyBatis 缓存机制详解:一级与二级缓存
  • Vivado 工程 Git 版本管理实战指南
  • SkyWalking - .NET / C++ / Lua 探针现状与社区支持
  • Visual C++运行库一键安装方案:解决 DLL 缺失错误
  • C++ 测试框架 Catch2 快速上手指南

相关免费在线工具

  • 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