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

31、全栈AI测试工具实战:Vue3+Java+Python协同构建企业级测试平台

点击投票为我的2025博客之星评选助力! 全栈AI测试工具实战:Vue3+Java+Python协同构建企业级测试平台 引言:全栈协同开发的价值与挑战 在AI测试领域,单一技术栈已难以应对复杂的数据处理、模型评估和结果可视化需求。某知名金融科技公司的测试团队曾面临这样的困境:数据科学家用Python编写了复杂的模型测试脚本,但业务团队难以使用;Java开发的后端服务无法直接运行Python代码;而Vue前端展示的测试结果又与实际模型输出存在偏差。 本文将带你从零开始,通过Vue3前端+Java网关+Python测试服务的协同架构,构建一个全栈AI测试工具原型。这个方案不仅解决了跨技术栈协作问题,还提供了完整的实战代码和一键部署方案,让你在2小时内就能搭建起可运行的AI测试平台。 1. 协同架构设计:清晰的分层与职责划分 1.1 分层架构设计 我们采用经典的三层架构,每层都有明确的职责边界: HTTP请求 JSON数据 gRPC/HTTP调用 序列化数据 处理结果 评估报告 统一响应 标准化格式 算法服务职责 数据质量校验 模型性能评估 测试报告生成

By Ne0inhk
Python中秋月圆夜:手把手实现月相可视化,用代码赏千里共婵娟

Python中秋月圆夜:手把手实现月相可视化,用代码赏千里共婵娟

文章目录 * 📖 引言 * 🎯 项目概述 * 🛠️ 技术架构解析 * 项目结构 * 💡 实现思路 * 月相计算核心 * 可视化难点 * 核心模块设计 * `moon_calculator.py` - 核心计算引擎 * 可视化渲染类 * 📊 四种图表实现详解 * 时间轴图表 - 连续月相展示 * 月相曲线图 - 数学规律可视化 * 当前月相图 * 图像Base64编码 * 🌐 HTML界面生成 * `generate_html.py` - 界面组装器 * CSS3特效设计 * JavaScript交互特效 * 🌟 结语 📖 引言 中秋节,这个承载着千年文化的传统节日,以其独特的满月寓意着团圆与和谐。我们不妨用Python这门优雅的编程语言,来创造一个富有诗意的中秋节月相可视化器。本文将带您通过代码的艺术,重现天空中月亮的盈亏变化,并在中秋节这个特殊的日子里,为我们的程序增添一抹传统文化的色彩。 🎯 项目概述 我们将构建一个功能丰富的月相可视

By Ne0inhk
在昇腾 NPU 上部署与测评 CodeLlama-7b-Python

在昇腾 NPU 上部署与测评 CodeLlama-7b-Python

目标:本文记录了我在昇腾 NPU 环境中从零开始部署 CodeLlama-7b-Python 模型的全过程,包括环境配置、模型加载、推理验证及基础性能评估。所有操作均基于 GitCode Notebook 平台提供的昇腾实例完成,旨在为后续开发者提供一份可复现的参考流程。 一、环境准备:启动合适的 Notebook 实例 首先,我在 GitCode Notebook 平台上选择了一个支持昇腾 NPU 的计算实例。这类实例通常预装了 CANN(Compute Architecture for Neural Networks)工具链和 PyTorch + torch_npu 插件,省去了手动编译驱动的麻烦。 算力资源申请链接: https://ai.gitcode.com/ascend-tribe/openPangu-Ultra-MoE-718B-V1.1?source_module=search_

By Ne0inhk
2026 Python+AI入门|0基础速通,吃透热门轻量化玩法

2026 Python+AI入门|0基础速通,吃透热门轻量化玩法

🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:AI 文章目录: * 一、2026 Python+AI入门,必抓3个热门新趋势 * 二、入门前提:不用啃硬骨头,掌握这2点就够了 * 环境搭建(10分钟搞定,Windows/Mac通用) * 三、3个实战案例 * 案例1:30行代码开发AI文本总结工具(轻量化工具,最易上手) * 案例2:大模型微调入门(Llama 3微调,2026热门) * 案例3:AI自动数据标注(图像标注,企业刚需) * 四、Python+AI入门学习流程图(2026最新,不绕路) * 五、2026新手避坑指南 * 六、总结 【前言】 大家好,我是一名深耕AI入门教学的开发者,

By Ne0inhk