HarmonyOS6 半年磨一剑 - RcList 组件缩略图、角标与图标系统

HarmonyOS6 半年磨一剑 - RcList 组件缩略图、角标与图标系统

文章目录

前言

Hello 各位开发者们大家好, 我是若城,今天我们开始对Rchoui三方库新的组件开始讲解, 本期我们主要讲解的是 RcList 这个组件, 话不多说我们先看下效果图吧~~~

开源计划

项目预计于 2026 年 7 月中旬正式开源,届时可通过三方库直接下载使用。在此期间,我会通过系列文章逐一介绍每个模块的设计思路与实现细节。

rchoui 官网

目前暂定 rchoui 官网地址:http://rchoui.ruocheng.site/

需要注意的是,当前官网还在完善当中,会在后续更新中逐步完善,届时可以为大家提供更加完善的说明文档。

一、缩略图系统设计

1.1 缩略图渲染流程

RcListItem 的缩略图由 renderRcListItemThumb() 负责渲染,该方法使用 Stack 容器将图片和角标叠加在一起:

@BuilderrenderRcListItemThumb(){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 尺寸映射方法

privategetRcListItemThumbSize():number{// 直接传数字:原样返回if(typeofthis.rcListItemThumbSize ==='number'){returnthis.rcListItemThumbSize }// 传数字字符串(如 '50'):转换为数字if(typeofthis.rcListItemThumbSize ==='string'&&!isNaN(Number(this.rcListItemThumbSize))){returnNumber(this.rcListItemThumbSize)}// 预设枚举值switch(this.rcListItemThumbSize){case'small':return40case'large':return80case'medium':default:return60}}

这个方法的处理顺序体现了输入容错原则:先处理精确类型(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 使用预设值时,圆角对应关系为:small20medium30large40

二、角标系统实现

2.1 角标三种形态

RcListBadgeConfig 支持三种角标形态,通过 isDotvalue 组合控制:

配置组合渲染形态典型场景
{ 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})// 向左移动半径,向下移动,使圆心在右上角}elseif(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 数字截断逻辑

privategetRcListItemBadgeText():string{if(!this.rcListItemBadge.value){return''}const max =this.rcListItemBadge.max ||99// 未设置 max 时默认 99const value =this.rcListItemBadge.value // 只对数字进行截断if(typeof value ==='number'&& value > max){return`${max}+`// 超出则显示 "99+"}returnString(value)// 数字转字符串,字符串原样返回}

这个方法只对数字类型做截断判断,字符串角标(如 'NEW')不受 max 影响,设计简洁合理。

2.4 角标颜色处理

privategetRcListItemBadgeColor():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),适合设置页、功能菜单
  • 缩略图:使用图片,适合头像、商品封面等内容型列表
@BuilderrenderRcListItemExtraIcon(){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 叠加实现了角标依附效果,额外图标通过类型联合支持矢量与图片双模式,角标通过智能截断和多形态适配了真实业务场景。三套系统可以独立使用,也可以自由组合,灵活性极强。

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

如果这篇文章对你有帮助,欢迎点赞、收藏、关注,你的支持是我持续创作的动力!

Read more

【前端实战】Axios 错误处理的设计与进阶封装,实现网络层面的数据与状态解耦

【前端实战】Axios 错误处理的设计与进阶封装,实现网络层面的数据与状态解耦

目录 【前端实战】Axios 错误处理的设计与进阶封装,实现网络层面的数据与状态解耦 一、为什么网络错误处理一定要下沉到 Axios 层 二、Axios 拦截器 interceptors 1、拦截器的基础应用 2、错误分级和策略映射的设计 3、错误对象标准化 三、结语         作者:watermelo37         ZEEKLOG优质创作者、华为云云享专家、阿里云专家博主、腾讯云“创作之星”特邀作者、火山KOL、支付宝合作作者,全平台博客昵称watermelo37。         一个假装是giser的coder,做不只专注于业务逻辑的前端工程师,Java、Docker、Python、LLM均有涉猎。 --------------------------------------------------------------------- 温柔地对待温柔的人,包容的三观就是最大的温柔。 --------------------------------------------------------------------- 【前

By Ne0inhk
FastAPI:Python 高性能 Web 框架的优雅之选

FastAPI:Python 高性能 Web 框架的优雅之选

🚀 FastAPI:Python 高性能 Web 框架的优雅之选 * 🌟 FastAPI 框架简介 * ⚡ 性能优势:为何选择 FastAPI? * 性能对比表 * 🔍 同步 vs 异步:性能测试揭秘 * 测试代码示例 * 测试结果分析 * 🛠️ FastAPI 开发体验:优雅而高效 * 1. 类型提示与自动验证 * 2. 交互式 API 文档 * 🏆 真实案例:为什么企业选择 FastAPI * 📚 后续学习引导 * 🎯 结语 🌟 FastAPI 框架简介 在当今快速发展的互联网时代,构建高效、可靠的 API 服务已成为后端开发的核心需求。FastAPI 作为 Python 生态中的新星,以其卓越的性能和开发者友好特性迅速赢得了广泛关注。 框架概述:FastAPI 是一个现代化的 Python Web 框架,专为构建

By Ne0inhk
2026动态规划新风向:实在智能Agent如何以自适应逻辑重构企业效率?

2026动态规划新风向:实在智能Agent如何以自适应逻辑重构企业效率?

2026年2月,当全球目光聚焦于米兰冬奥会的盛大开幕与美国政府停摆危机的化解时,在中国,一场关于“动态规划”的深刻变革正在悄然重塑社会治理与商业运行的底层逻辑。 从自然资源部强调国土空间规划的“动态维护”,到长三角地区如杭州余杭、无锡太湖新城密集发布的“动态更新”方案,动态规划已不再局限于计算机科学中那个求解最优路径的算法名词,它演变成了一种适应高质量发展、应对不确定性的核心生存法则。在政务领域,这意味着从“一张图干到底”向“实时体检、精准微调”的转变;而在商业与技术领域,这种对“动态适应能力”的极致追求,正催生出以实在智能为代表的新一代Agent智能体技术的爆发。 企业如何在这场从“静态僵化”到“动态敏捷”的转型中抓住机遇?答案或许就藏在动态规划思维与AI Agent技术的深度融合之中。 一、 从城市治理到数字办公:为什么我们需要“动态规划”思维? 2026年2月3日,杭州余杭区公布的《国土空间总体规划动态维护方案》为我们提供了一个极佳的观察窗口。方案明确提出“大稳定、小调整”,通过对城西科创大走廊等重点区域的要素精准保障,实现了对市场变化的快速响应。与此同时,海口、

By Ne0inhk

从A*算法到轨迹生成:某盾验证码躲避障碍的3种优化策略对比(附膨胀参数测试数据)

从A*算法到轨迹生成:三种优化策略在验证码躲避场景中的深度对比与实战 如果你曾经尝试过自动化处理某些带有交互元素的验证码,特别是那种需要控制一个小球绕过障碍物到达目标点的类型,你可能会发现,仅仅识别出目标位置是远远不够的。更棘手的问题在于,如何生成一条既安全又自然的移动轨迹,让程序能够“模仿”人类操作,成功避开所有障碍。这不仅仅是简单的“点对点”移动,而是一个典型的路径规划问题。在众多算法中,A*(A-Star)搜索算法因其在效率和最优性之间的出色平衡,成为了解决此类问题的首选工具。然而,直接将经典的A*算法应用于验证码躲避场景,往往会遭遇“理论可行,实践翻车”的尴尬——生成的路径紧贴障碍物边缘,导致实际执行时因微小的坐标误差而失败。 本文将深入探讨在验证码躲避这一特定场景下,如何对A算法进行工程化改造和策略优化。我们将系统性地对比三种核心优化策略:**原始A算法**、障碍物膨胀策略以及人工增障策略。每一种策略都不仅仅是代码的修改,更是对问题本质理解的深化。我们会结合网格划分、启发函数选择、膨胀参数测试等工程细节,并通过可视化的轨迹对比图和成功率统计表,为你清晰地展示不同策略的优劣

By Ne0inhk