HarmonyOS6 半年磨一剑 - RcList 组件综合示例与尺寸计算

HarmonyOS6 半年磨一剑 - RcList 组件综合示例与尺寸计算

文章目录

前言

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

开源计划

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

rchoui 官网

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

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

一、尺寸计算与工具函数

1.1 getSizeByUnit 的作用

getSizeByUnitRcStringNumberstring | number)统一转换为 ArkUI 组件属性可接受的值:

// 来自 utils.ts(简化示意)exportfunctiongetSizeByUnit(size:string|number):string|number{if(typeof size ==='number'){return size // 数字直接返回(单位为 vp)}return size // 字符串直接返回(支持 '100%'、'50vp' 等)}

这让 rcListWidthrcListHeightrcListSpace 等属性既可以传 100(数字 vp)也可以传 '100%'(百分比字符串)。

1.2 不透明度与禁用状态

// RcListItem build() 中的禁用视觉.opacity(this.rcListItemDisabled ?0.6:1)

使用全局 opacity 实现禁用效果比逐一修改子元素颜色更高效,整个列表项(包括缩略图、图标、文字)统一降低到 60% 透明度,视觉上一致地传达"不可用"状态。


二、完整实战示例

以下是一个综合展示缩略图、角标、额外图标三套系统的完整可运行页面:

import{ RcList, RcListItem }from'rchoui'@Entry@ComponentV2 struct RcListVisualSystemDemo {build(){Scroll(){Column({ space:20}){Text('视觉富化系统演示').fontSize(22).fontWeight(FontWeight.Bold).margin({ top:20, bottom:8})// ========== 缩略图系统 ==========Text('缩略图尺寸与圆角').fontSize(16).fontColor('#303133').margin({ bottom:4})RcList({ rcListBorder:true}){RcListItem({ rcListItemTitle:'小尺寸 40x40', rcListItemNote:'方形圆角,适合应用图标', rcListItemThumb:$r('app.media.startIcon'), rcListItemThumbSize:'small', rcListItemThumbRadius:8, rcListItemClickable:true})RcListItem({ rcListItemTitle:'中尺寸 60x60', rcListItemNote:'适中圆角,联系人头像', rcListItemThumb:$r('app.media.startIcon'), rcListItemThumbSize:'medium', rcListItemThumbRadius:12, rcListItemClickable:true})RcListItem({ rcListItemTitle:'大尺寸 + 正圆', rcListItemNote:'半径等于尺寸一半,形成正圆', rcListItemThumb:$r('app.media.startIcon'), rcListItemThumbSize:80, rcListItemThumbRadius:40, rcListItemClickable:true, rcListItemShowBorder:false})}// ========== 角标系统 ==========Text('角标系统三种形态').fontSize(16).fontColor('#303133').margin({ bottom:4})RcList({ rcListBorder:true}){RcListItem({ rcListItemTitle:'数字角标', rcListItemNote:'显示未读消息数量', rcListItemThumb:$r('app.media.startIcon'), rcListItemThumbSize:'medium', rcListItemShowBadge:true, rcListItemBadge:{ value:8}, rcListItemClickable:true})RcListItem({ rcListItemTitle:'超限截断', rcListItemNote:'超过 99 显示为 99+', rcListItemThumb:$r('app.media.startIcon'), rcListItemThumbSize:'medium', rcListItemShowBadge:true, rcListItemBadge:{ value:150, max:99}, rcListItemClickable:true})RcListItem({ rcListItemTitle:'点状角标', rcListItemNote:'仅提示有新内容', rcListItemThumb:$r('app.media.startIcon'), rcListItemThumbSize:'medium', rcListItemShowBadge:true, rcListItemBadge:{ isDot:true, color:'#fa3534'}, rcListItemClickable:true})RcListItem({ rcListItemTitle:'文字角标', rcListItemNote:'自定义颜色蓝色', rcListItemThumb:$r('app.media.startIcon'), rcListItemThumbSize:'medium', rcListItemShowBadge:true, rcListItemBadge:{ value:'NEW', color:'#409eff'}, rcListItemClickable:true, rcListItemShowBorder:false})}// ========== 额外图标系统 ==========Text('额外图标(矢量图标)').fontSize(16).fontColor('#303133').margin({ bottom:4})RcList({ rcListBorder:true}){RcListItem({ rcListItemTitle:'消息通知', rcListItemNote:'蓝色图标', rcListItemShowExtraIcon:true, rcListItemExtraIcon:{ name:'icon-houi_bell_outline', color:'#409eff', size:22}, rcListItemClickable:true})RcListItem({ rcListItemTitle:'下载管理', rcListItemNote:'绿色图标', rcListItemShowExtraIcon:true, rcListItemExtraIcon:{ name:'icon-houi_download_outline', color:'#67c23a', size:22}, rcListItemClickable:true})RcListItem({ rcListItemTitle:'应用设置', rcListItemNote:'灰色图标', rcListItemShowExtraIcon:true, rcListItemExtraIcon:{ name:'icon-houi_settings_outline', color:'#909399', size:22}, rcListItemClickable:true, rcListItemShowBorder:false})}// ========== 本地图片图标 ==========Text('额外图标(本地图片)').fontSize(16).fontColor('#303133').margin({ bottom:4})RcList({ rcListBorder:true}){RcListItem({ rcListItemTitle:'本地图片图标', rcListItemNote:'通过 $r() 引用', rcListItemShowExtraIcon:true, rcListItemExtraIcon:{ name:$r('app.media.startIcon'), size:24}, rcListItemClickable:true, rcListItemShowBorder:false})}// ========== 三系统综合使用 ==========Text('综合:图标 + 缩略图 + 角标').fontSize(16).fontColor('#303133').margin({ bottom:4})RcList({ rcListBorder:true}){RcListItem({ rcListItemTitle:'消息中心', rcListItemNote:'图标 + 缩略图 + 数字角标', rcListItemThumb:$r('app.media.startIcon'), rcListItemThumbSize:'medium', rcListItemThumbRadius:8, rcListItemShowBadge:true, rcListItemBadge:{ value:3, color:'#fa3534'}, rcListItemShowExtraIcon:true, rcListItemExtraIcon:{ name:'icon-houi_message_circle_outline', color:'#409eff', size:20}, rcListItemRightText:'查看全部', rcListItemClickable:true, rcListItemShowBorder:false})}Text('以上展示了三套视觉系统的全部形态').fontSize(13).fontColor('#909399').textAlign(TextAlign.Center).margin({ top:16, bottom:30})}.width('100%').padding(16)}.width('100%').height('100%').backgroundColor('#f5f5f5')}}

三、视觉样式对照表

3.1 缩略图参数速查

参数类型默认值说明
rcListItemThumbResourceStr''图片资源(本地/网络/base64)
rcListItemThumbSize'small' / 'medium' / 'large' / number'medium'尺寸
rcListItemThumbRadiusRcStringNumber4圆角半径

3.2 角标参数速查

参数类型默认值说明
rcListItemShowBadgebooleanfalse是否显示角标
rcListItemBadge.valuestring / number-角标内容
rcListItemBadge.isDotbooleanfalse是否点状角标
rcListItemBadge.colorResourceColor'#fa3534'角标颜色
rcListItemBadge.maxnumber99最大值(超出显示 N+)

3.3 额外图标参数速查

参数类型默认值说明
rcListItemShowExtraIconbooleanfalse是否显示额外图标
rcListItemExtraIcon.namestring / ResourceStr-图标名或图片资源
rcListItemExtraIcon.colorResourceColor主题色图标颜色(仅矢量图标有效)
rcListItemExtraIcon.sizeRcStringNumber20图标尺寸

总结

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

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

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

Read more

Linux 动态链接与动态库加载深度解析

Linux 动态链接与动态库加载深度解析

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 进程如何感知并加载动态库 * 1.1 进程对动态库的 “可见性” * 1.2 多进程共享动态库的实现 * 二. 动态链接的核心工作原理 * 2.1 程序运行前的动态链接准备 * 2.2 动态库的地址无关性:PIC 编译 * 2.3 运行时的地址重定位:从符号到实际地址 * 三. GOT/PLT:动态链接的核心实现机制 * 3.1 全局偏移量表(GOT) * 3.2 过程链接表(PLT):延迟绑定优化 * 3.

By Ne0inhk
Flutter 组件 json_stream 适配鸿蒙 HarmonyOS 实战:高性能流式解析,构建超大型 JSON 数据处理与 OOM 防御架构

Flutter 组件 json_stream 适配鸿蒙 HarmonyOS 实战:高性能流式解析,构建超大型 JSON 数据处理与 OOM 防御架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 json_stream 适配鸿蒙 HarmonyOS 实战:高性能流式解析,构建超大型 JSON 数据处理与 OOM 防御架构 前言 在鸿蒙(OpenHarmony)生态迈向工业级大数据应用、涉及海量配置文件加载、全量数据备份同步及大型离线数据库映射的背景下,如何处理超大型(100MB+)的 JSON 报文,已成为决定应用“内存稳定性”的核心技术瓶颈。在鸿蒙设备这类强调 AOT 极致内存管控与进程优先级的环境下,如果应用依然使用传统的“全加载”解析模式(如 json.decode),由于由于数据在内存中的暴力展开及其产生的海量临时对象,极易由于由于“瞬时内存峰值”导致鸿蒙内核强制杀掉应用进程(OOM Panic)。 我们需要一种能够支持流式读取(Streaming)、具备低内存足迹(

By Ne0inhk
Flutter 三方库 mix_context 的鸿蒙化适配指南 - 实现极简上下文增强、支持非 Widget 作用域下的 BuildContext 访问与状态注入

Flutter 三方库 mix_context 的鸿蒙化适配指南 - 实现极简上下文增强、支持非 Widget 作用域下的 BuildContext 访问与状态注入

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 mix_context 的鸿蒙化适配指南 - 实现极简上下文增强、支持非 Widget 作用域下的 BuildContext 访问与状态注入 前言 在进行 Flutter for OpenHarmony 开发时,我们经常会遇到底层逻辑(如 Service、Repository)需要访问 BuildContext 的窘境(例如为了弹出一个全局 Dialog 或获取当前的主题颜色)。虽然传统的做法是层层传递参数,但代码会因此变得臃肿。mix_context 提供了一种更优雅的上下文混入与注入方案。本文将指导大家如何在鸿蒙端利用该库提升代码的响应能力。 一、原理解析 / 概念介绍 1.1 基础原理 mix_context 的核心思想是将 BuildContext 的引用通过全局代理或单例模式进行“

By Ne0inhk
中小团队如何低成本搭建项目管理系统?基于 Ubuntu 的 Dootask 私有化部署实战

中小团队如何低成本搭建项目管理系统?基于 Ubuntu 的 Dootask 私有化部署实战

作为技术负责人或者创业团队的 Team Leader,你是否也经历过这样的“项目管理噩梦”? 团队规模刚过 10 人,管理瞬间失控。需求变了没记录,Bug 修复进度全靠吼,代码上线版本混乱。老板让你上一套项目管理系统,你调研了一圈发现:Jira 太贵且对非技术人员极不友好;禅道功能强大但界面由于年代久远,操作逻辑繁琐,推行下去阻力巨大,运营和设计同事天天抱怨学不会;市面上的 SaaS 工具(如 Teambition)虽然好用,但核心数据存在别人云端,想要二次开发或私有化部署,授权费又是一笔不小的开支。 这其实是很多中小团队的共性痛点:需要一个好用的开源项目管理工具,既要免费开源、数据私有化,又要界面现代、部署简单。 为了帮大家理清思路,我画了一张当前团队协作常见困境的思维导图,看看你是否中招了: 最近在为团队寻找替代方案时,我在 GitHub 上发现了一个宝藏项目——DooTask。目前它在 GitHub 上已经获得了 4k+ Star,这不仅代表了社区认可度,

By Ne0inhk