HarmonyOS6 半年磨一剑 - RcCheckbox 组件颜色系统与状态渲染机制
文章目录前言一、四态颜色状态机1.1 颜色计算函数1.2 四态颜色对照表1.3 透明度叠加策略二、按钮样式的独立颜色逻辑三、Builder 渲染分层架构3.1 四层渲染结构3.2 勾选图标的 Path 绘制3.3 不确定状态的横线四、自定义颜色主题4.1 颜色参数说明4.2 多主题颜色示例总结前言颜色是传递组件状态最直观的视觉语言。一个高质量的复选框组件需要在未选中、选中、不确定、禁用四种状态之间精准切换颜色让用户无需阅读文字就能感知当前的交互状态。RcCheckbox 的颜色系统通过一组纯函数式的颜色计算方法将状态到颜色的映射逻辑完全内聚在组件内部外部只需传入activeColor、inactiveColor两个颜色参数即可完成主题定制。本文将深入解析 RcCheckbox 的四态颜色状态机、Builder 渲染分层架构以及勾选图标的 Path 绘制原理同时提供完整可运行的颜色定制示例。一、四态颜色状态机1.1 颜色计算函数RcCheckbox 有两套颜色计算函数普通样式和按钮样式分别负责不同渲染路径的颜色逻辑。普通样式 — 背景色privategetRcCheckboxBackgroundColor():string|Resource{if(this.disabled){return#F5F7FA// 禁用浅灰背景}if(this.rcCheckboxInnerChecked||this.indeterminate){returnthis.activeColor// 选中/不确定主色填充}returntransparent// 默认透明背景}普通样式 — 边框色privategetRcCheckboxBorderColor():string|Resource{if(this.disabled){return#E4E7ED// 禁用浅灰边框}if(this.rcCheckboxInnerChecked||this.indeterminate){returnthis.activeColor// 选中/不确定主色边框与背景同色消除边框感}returnthis.inactiveColor// 默认灰色边框}两个方法的优先级顺序完全一致disabled checked/indeterminate 默认保证了状态层级的清晰无歧义。1.2 四态颜色对照表状态背景色边框色标签色图标可见默认未选中transparent#DCDFE6#303133不显示选中activeColor#409EFFactiveColor#303133显示白色勾不确定indeterminateactiveColoractiveColor#303133显示白色横线禁用未选中#F5F7FA#E4E7ED#C0C4CC不显示禁用选中#F5F7FA#E4E7ED#C0C4CC显示图标透明度 0.6提示选中状态下背景色和边框色相同这个设计让复选框在视觉上呈现为实心方块而非有边框的方块减少视觉噪音。1.3 透明度叠加策略禁用状态还有一层额外的透明度处理// renderRcCheckboxNormal 中.opacity(this.disabled?0.6:1)// renderRcCheckboxButton 中.opacity(this.disabled?0.6:1)整体透明度降至 0.6配合灰色背景进一步强化不可交互的视觉感知即使在深色背景下也能清晰传达禁用语义。二、按钮样式的独立颜色逻辑按钮样式isButton: true有独立的颜色计算函数因为它的颜色表现完全不同// 按钮背景色privategetRcCheckboxButtonBackgroundColor():string|Resource{if(this.disabled)return#F5F7FAif(this.rcCheckboxInnerChecked)returnthis.activeColorreturn#FFFFFF}// 按钮文字色privategetRcCheckboxButtonTextColor():string|Resource{if(this.disabled)return#C0C4CCif(this.rcCheckboxInnerChecked)return#FFFFFFreturnthis.labelColor}按钮模式与普通模式的颜色逻辑差异对比点普通模式按钮模式未选中背景transparent无背景#FFFFFF白色背景选中背景activeColoractiveColor相同文字色变化不变选中时变为白色不确定状态支持不涉及三、Builder 渲染分层架构3.1 四层渲染结构RcCheckbox 的渲染通过Builder方法分为四层build()└──renderRcCheckboxNormal()或renderRcCheckboxButton()└──renderRcCheckboxBox()// 复选框外壳└──renderRcCheckboxIcon()// 图标内容└──renderRcCheckboxLabel()// 标签文字每层职责单一互不耦合renderRcCheckboxBox负责外壳的背景色、边框、圆角renderRcCheckboxIcon负责图标内容勾/横线/自定义图标renderRcCheckboxLabel负责标签文字的字号、颜色、点击事件renderRcCheckboxNormal/Button负责排列组合以上部分处理整体 padding 和 opacity3.2 勾选图标的 Path 绘制默认勾选图标使用 ArkUI 的Path组件绘制不依赖任何图片资源Path().width(this.getRcCheckboxIconSize()).height(this.getRcCheckboxIconSize()).commands(M${size*0.15}${size*0.5}L${size*0.42}${size*0.8}L${size*0.85}${size*0.2}).stroke(this.iconColor).strokeWidth(2.5).strokeLineCap(LineCapStyle.Round).strokeLineJoin(LineJoinStyle.Round).fillOpacity(0)// 只描边不填充路径坐标使用比例系数如* 0.15、* 0.42保证在任意尺寸下勾形的视觉比例保持一致。三段折线的数学含义起点(0.15, 0.5)左中位置折点(0.42, 0.8)下方转折点勾的底部终点(0.85, 0.2)右上位置3.3 不确定状态的横线不确定状态使用Rect绘制一条居中横线Rect().width(this.getRcCheckboxIconSize()).height(2).fill(this.iconColor)宽度与图标宽度相同高度固定 2vp配合Stack居中对齐实现视觉上的水平居中。四、自定义颜色主题4.1 颜色参数说明参数默认值影响范围activeColor#409EFF选中/不确定的背景色、边框色按钮模式的背景色inactiveColor#DCDFE6未选中状态的边框色iconColor#FFFFFF勾选图标和横线颜色labelColor#303133标签文字颜色非禁用时4.2 多主题颜色示例import{RcCheckbox,RcCheckboxGroup,RcCheckboxOption,RcCheckboxValue}fromrchouiEntryComponentstruct ColorThemeExample{StateredChecked:booleantrueStategreenChecked:booleantrueStateorangeChecked:booleantrueStatepurpleChecked:booleanfalseStatedarkIconChecked:booleantrueStatetagValues:RcCheckboxValue[][tag1]privatetagOptions:RcCheckboxOption[][{value:tag1,label:促销},{value:tag2,label:热门},{value:tag3,label:新品},{value:tag4,label:推荐}]build(){Scroll(){Column({space:24}){Text(颜色主题定制).fontSize(20).fontWeight(FontWeight.Bold)// 单色主题Column({space:14}){Text(单色主题).fontSize(15).fontWeight(FontWeight.Medium)RcCheckbox({checkboxLabel:红色主题危险/删除场景,activeColor:#F56C6C,checked:this.redChecked,onCheckedChange:(v:boolean){this.redCheckedv}})RcCheckbox({checkboxLabel:绿色主题成功/确认场景,activeColor:#67C23A,checked:this.greenChecked,onCheckedChange:(v:boolean){this.greenCheckedv}})RcCheckbox({checkboxLabel:橙色主题警告/提醒场景,activeColor:#E6A23C,checked:this.orangeChecked,onCheckedChange:(v:boolean){this.orangeCheckedv}})RcCheckbox({checkboxLabel:紫色主题品牌/VIP场景,activeColor:#9B59B6,checked:this.purpleChecked,onCheckedChange:(v:boolean){this.purpleCheckedv}})}.alignItems(HorizontalAlign.Start).width(100%)// 深色图标搭配浅色背景Column({space:12}){Text(浅色主题深色图标).fontSize(15).fontWeight(FontWeight.Medium)RcCheckbox({checkboxLabel:浅蓝背景 深蓝图标,activeColor:#ECF5FF,inactiveColor:#B3D8FF,iconColor:#409EFF,labelColor:#409EFF,checked:this.darkIconChecked,onCheckedChange:(v:boolean){this.darkIconCheckedv}})}.alignItems(HorizontalAlign.Start).width(100%)// 标签筛选按钮组自定义主色Column({space:12}){Text(自定义主色按钮组).fontSize(15).fontWeight(FontWeight.Medium)RcCheckboxGroup({options:this.tagOptions,isButton:true,placement:row,activeColor:#FF6B6B,checkedValues:this.tagValues,onCheckedValuesChange:(values:RcCheckboxValue[]){this.tagValuesvalues}})Text(已选标签${this.tagValues.join(、)}).fontSize(13).fontColor(#909399)}.alignItems(HorizontalAlign.Start).width(100%)// 禁用状态对比Column({space:12}){Text(禁用状态固定为灰色不受 activeColor 影响).fontSize(14).fontColor(#606266)Row({space:20}){RcCheckbox({checkboxLabel:禁用未选,disabled:true,checked:false,activeColor:#FF4444})RcCheckbox({checkboxLabel:禁用已选,disabled:true,checked:true,activeColor:#FF4444})}}.alignItems(HorizontalAlign.Start).width(100%)}.width(90%).padding({bottom:40})}.width(100%).height(100%).backgroundColor(#F5F7FA)}}总结RcCheckbox 的颜色系统以优先级有序的状态判断链禁用 选中/不确定 默认为核心通过activeColor和inactiveColor两个参数实现整套颜色的主题化定制并将普通样式和按钮样式的颜色逻辑分别用独立的计算函数管理使得两种渲染路径互不干扰。Path勾选图标的比例坐标设计、Rect横线的固定高度设计都体现了在极小尺寸内保持视觉精准的细节追求。如果这篇文章对你有帮助欢迎点赞、收藏、关注你的支持是我持续创作的动力