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

Flutter for OpenHarmony:Flutter 三方库 very_good_cli 打造企业级鸿蒙工程规范(标准化开发利器)

Flutter for OpenHarmony:Flutter 三方库 very_good_cli 打造企业级鸿蒙工程规范(标准化开发利器)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行大中型 OpenHarmony 项目开发时,如何保证团队代码风格统一?如何快速搭建一个包含测试、Lint 规范、多环境配置的工程底座?官方的 flutter create 虽然好用,但它生成的只是一个“毛坯房”。 very_good_cli 是由知名的 Very Good Ventures 团队推出的命令行工具。它能一键生成“精装修”的 Flutter 项目模板,内置了严格的 Lint 规则、100% 测试覆盖率要求以及清晰的架构分层。对于追求高可靠性的鸿蒙应用,它是建立开发标准的最佳起点。 一、核心价值体系 very_good_cli 不仅仅是一个脚手架,它代表了一套工程哲学。 very_good create

By Ne0inhk
Flutter 三方库 fluent_result 的鸿蒙化适配指南 - 实现优雅的函数式错误处理模型、支持透明的结果封装与业务逻辑流转控制

Flutter 三方库 fluent_result 的鸿蒙化适配指南 - 实现优雅的函数式错误处理模型、支持透明的结果封装与业务逻辑流转控制

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 fluent_result 的鸿蒙化适配指南 - 实现优雅的函数式错误处理模型、支持透明的结果封装与业务逻辑流转控制 前言 在进行 Flutter for OpenHarmony 的大规模业务逻辑开发时,传统的异常处理(Try-Catch)往往会导致代码散落在各处,且难以在函数调用链中优雅地传递失败原因。fluent_result 引入了源自函数式编程的“Result 对象”概念。它通过将成功的数据和失败的错误封装在同一个返回值中,让鸿蒙应用的代码流变得更加清晰和健壮。本文将探讨如何在鸿蒙端利用该库构建“零崩溃”调用链。 一、原理解析 / 概念介绍 1.1 基础原理 fluent_result 放弃了通过“抛出(Throw)”异常来控制流程的模式,转而返回一个 Result<T&

By Ne0inhk
Flutter 组件 zxcvbnm 的适配 鸿蒙Harmony 实战 - 驾驭极致密码强度评估、实现鸿蒙端金融级账户准入安全与人性化安全感知的深度方案

Flutter 组件 zxcvbnm 的适配 鸿蒙Harmony 实战 - 驾驭极致密码强度评估、实现鸿蒙端金融级账户准入安全与人性化安全感知的深度方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 zxcvbnm 的适配 鸿蒙Harmony 实战 - 驾驭极致密码强度评估、实现鸿蒙端金融级账户准入安全与人性化安全感知的深度方案 前言 在鸿蒙(OpenHarmony)构建的全场景安全体系中,“账号安全”是所有隐私防护的起点。我们绝大多数开发者在处理用户注册时,依然采用 length > 6 这种极其原始的校验逻辑。殊不知,像 password123 这种符合长度规则的密码,在现代暴力破解算法面前几乎是瞬间沦陷。 如何让你的鸿蒙 App 具备一眼识破“弱密码”的火眼金睛?如何在高频率交互的注册界面实现秒级的安全评级? zxcvbnm 是一款基于波斯纳算法(zxcvbn)的高性能 Dart 实现。它不是简单的正则匹配,而是扫描字典、日期、序列乃至常用键盘模式,给出一个 0 到

By Ne0inhk
JuiceSSH+cpolar解锁手机远程Linux新姿势,无需公网IP,固定地址稳定用

JuiceSSH+cpolar解锁手机远程Linux新姿势,无需公网IP,固定地址稳定用

文章目录 * 前言 * 1. Linux安装cpolar * 2. 创建公网SSH连接地址 * 3. JuiceSSH公网远程连接 * 4. 固定连接SSH公网地址 * 5. SSH固定地址连接测试 * **总之,JuiceSSH 结合 cpolar,让手机远程访问 Linux 变得简单高效,解决了异地操作的难题,适合需要灵活处理工作的用户,提升远程办公的便利性。** 前言 JuiceSSH 是一款手机端 SSH 工具,能让用户通过手机远程连接 Linux 服务器,执行命令、管理文件,适合程序员、运维人员和需要远程操作 Linux 的学生。它界面简洁,操作方便,支持保存连接信息,还能快速切换不同服务器,移动办公很实用。 用 JuiceSSH 时感觉,它的快捷键设计挺贴心,输入命令效率不低,但连接时要确保网络稳定,不然容易断开。另外,初次配置时,

By Ne0inhk