HarmonyOS7 RatingStepPrecision 教程:整数、半星与四分之一星评分 文章目录前言适用场景实现思路完整代码逐段读代码第一处关键代码第二处关键代码第三处关键代码容易忽略的细节再往前走一步容易被忽略的小地方写在最后前言当评分开始追求更细腻的表达时stepSize 就成了必须理解的参数。它直接决定用户一次能给出多精细的结果。 这也是我很喜欢拿来讲 ArkUI 的一类例子因为它足够小却能把状态、布局和反馈三件事串起来。 这篇更适合边读边对照代码因为很多细节只有放在页面行为里才看得出来。这篇我会重点从动画与反馈设计这个角度往下讲。不是为了把每个属性都讲一遍而是帮你建立一个更接近真实开发的阅读顺序先看页面目标再看状态流最后再看样式怎么收口。适用场景读这段代码时先看用户会做什么再看代码为什么这样写会顺很多。把它放进真实项目里看会更容易理解这个案例的价值。围绕“Rating 步长”这件事页面通常不是孤立存在的它前面连着输入动作后面连着结果展示。这一类写法常见在 商品评价、内容评分、门店口碑、榜单展示 这些页面里。你只要把示例里的交互换成自己的业务文案再把静态数据换成真实数据源骨架基本就够用了。我读这类示例时有个习惯先不看属性名先看“用户碰了哪里页面发生了什么”。这样更容易抓住重点。另外一个不能跳过的问题是边界。这个案例要是准备落地第一时间要检查的通常不是样式而是 状态字段和展示结果有没有保持同一份数据来源避免页面看起来“能动”但结果不可信。实现思路页面最外层通常先用Column把主轴定下来这一步看起来普通但它决定了后面所有内容是顺着读还是碎着看。如果代码里出现了Scroll那基本说明作者已经预判到内容会超过一屏。这种处理很实在至少不会等页面做长了再返工。这一页更多是纵向阅读逻辑说明作者希望用户按顺序完成操作而不是在多个区域来回跳。第 5 篇案例在布局上最值得学的地方是它没有为了展示组件能力去强行堆内容而是尽量让每一块区域都有明确职责。这样的代码后面更好拆组件。完整代码下面这份代码保留了案例本身的实现思路但把示例编号替换成了更自然的英文命名。你直接拿去做实验、拆段运行阅读成本会低很多。/** * RatingStepPrecision - Rating 步长 */import{PRESET_COLORS,generateListItems,PAGE_BG_COLOR,PANEL_BG_COLOR,ACCENT_COLOR,MUTED_TEXT_COLOR}from./typesEntryComponentstruct RatingStepPrecision{StateisShow:booleantrueStateratingFull:number3StateratingHalf:number2.5StateratingQuarter:number3.75build(){Column(){if(this.isShow){Scroll(){Column(){Text(Rating 步长 (stepSize)).fontSize(16).fontWeight(FontWeight.Bold).margin({bottom:16})Text(stepSize1 整数评分).fontSize(14).fontWeight(FontWeight.Medium).margin({bottom:8})Rating({rating:this.ratingFull,indicator:false}).stars(5).stepSize(1).onChange((v:number){this.ratingFullv})Text(${this.ratingFull.toFixed(0)}星).fontSize(14).fontColor(ACCENT_COLOR).margin({top:4,bottom:16})Text(stepSize0.5 半星评分).fontSize(14).fontWeight(FontWeight.Medium).margin({bottom:8})Rating({rating:this.ratingHalf,indicator:false}).stars(5).stepSize(0.5).onChange((v:number){this.ratingHalfv})Text(${this.ratingHalf.toFixed(1)}星).fontSize(14).fontColor(ACCENT_COLOR).margin({top:4,bottom:16})Text(stepSize0.25 细粒度评分).fontSize(14).fontWeight(FontWeight.Medium).margin({bottom:8})Rating({rating:this.ratingQuarter,indicator:false}).stars(5).stepSize(0.25).onChange((v:number){this.ratingQuarterv})Text(${this.ratingQuarter.toFixed(2)}星).fontSize(14).fontColor(ACCENT_COLOR).margin({top:4})}.width(100%).padding(16).backgroundColor(PANEL_BG_COLOR).borderRadius(12).alignItems(HorizontalAlign.Center)}}Text(Rating 步长 - stepSize 1/0.5/0.25 精度).fontSize(12).fontColor(MUTED_TEXT_COLOR).margin({top:12})}.width(100%).height(100%).backgroundColor(PAGE_BG_COLOR).padding(16)}}逐段读代码第一处关键代码State isShow: boolean true这一行先别急着略过它通常就是页面状态的起点。后面很多显示内容都会跟着它一起变化。 如果这是评分相关代码我还会继续追一下它最终有没有同步到展示文案或结果区。第二处关键代码State ratingFull: number 3看起来只是一个字段定义但页面后面能不能“动起来”很多时候就靠它。 如果这是评分相关代码我还会继续追一下它最终有没有同步到展示文案或结果区。第三处关键代码State ratingHalf: number 2.5这种状态声明的价值不在写法本身而在于它决定了谁来保存结果、谁来触发刷新。 如果这是评分相关代码我还会继续追一下它最终有没有同步到展示文案或结果区。容易忽略的细节这段代码里真正驱动页面活起来的多半是下面这些位置.onChange((v: number) { this.ratingFull v }).onChange((v: number) { this.ratingHalf v }).onChange((v: number) { this.ratingQuarter v })对评分类页面来说页面顺不顺手往往取决于用户点完之后有没有马上看到数值和文案一起变。这里最值得养成的习惯是顺手确认结果值到底存在哪。状态一多页面最容易出的问题不是不刷新而是刷出来的不是同一个结果。真准备继续往下改时我会先把输入值、结果值和提示文案拆开存。这样后面无论是加校验还是加动画都不容易把build()变成大杂烩。再往前走一步真要把这个案例拿去改业务页面我会按下面这个顺序动手把演示用的静态数据替换成真实数据源别等接口接进来以后再改页面结构。把重复出现的卡片、标题栏、结果区提成小组件后面加状态会轻松很多。提前补上异常态比如空值、失败态、禁用态、超范围输入否则示例一进业务就会露怯。如果是评分页我会尽量把“用户可评分”和“只展示结果”拆开不让一个组件同时承担两种语义。这里最容易被忽略的一点是 状态字段和展示结果有没有保持同一份数据来源避免页面看起来“能动”但结果不可信。 这个问题。很多示例在静态数据下看不出毛病一接真实状态就开始暴露问题所以这一步最好趁早做。容易被忽略的小地方有些细节在第一眼看代码时很容易被跳过去但它们往往决定了页面是不是耐改。State不是装饰器样板它决定了哪些数据变化后会重新驱动画面。对于 Rating 类页面我会特别留意文案反馈是不是跟着用户动作一起变化因为这直接影响页面有没有“会说话”的感觉。这些东西单看都不复杂组合在一起才是一个案例真正的完成度。写在最后把这篇读透之后你再回头看同类控件会更容易判断哪些是核心参数哪些只是表面样式。把这份案例读成“一个可以继续长大的页面骨架”你后面改业务时会轻松很多。

相关新闻

最新新闻

TicketFlow AI 项目实践(六):模型压缩、LLM 分类与 Flask 部署

TicketFlow AI 项目实践(六):模型压缩、LLM 分类与 Flask 部署

完成BERT微调后,项目继续探索模型压缩、大模型分类和服务化。本篇是TicketFlow AI系列的工程落地总结。 一、为什么需要模型压缩 BERT模型语义能力较强,但权重较大、CPU推理成本较高。项目分别实现动态量化、非结构化剪枝和知识蒸馏,比较模…

2026/7/17 21:44:16
Linux GPIO子系统与Pin Controller驱动开发指南

Linux GPIO子系统与Pin Controller驱动开发指南

1. Linux GPIO子系统与Pin Controller驱动概述在嵌入式Linux系统中,GPIO(通用输入输出)是最基础也最重要的外设接口之一。现代SoC通常包含数百个可配置的GPIO引脚,这些引脚不仅可以用作简单的数字输入输出,还能通过引脚…

2026/7/17 21:44:16
JS这门语言是面向对象的还是面向过程的呢?

JS这门语言是面向对象的还是面向过程的呢?

*显然,JS这门语言是面向对象的,但对于DOM的操作体现了面向过程的思想JavaScript 这门语言本身是支持面向对象(OOP)的,但我们在用它操作 DOM 时,却往往被迫(或习惯性地)采用了面向过程…

2026/7/17 21:44:16
Pycharm中使用Git进行版本控制

Pycharm中使用Git进行版本控制

日常 Python 项目开发中,代码备份、多人协作、版本回溯是高频需求,Git是目前行业标准分布式版本管理工具,而GitHub/Gitee是云端代码托管平台。很多新手分不清三者关系,同时不会在 PyCharm 中图形化操作 Git,本文结合完整实操截图,从零讲解 PyCharm 集成 Git、仓库创建、代…

2026/7/17 21:44:16
红手指云手机技术解析:十年积累如何实现稳定多开与自动化

红手指云手机技术解析:十年积累如何实现稳定多开与自动化

如果你是一名游戏开发者、工作室运营者,或者只是想在手游中实现24小时稳定挂机的普通玩家,那么"云手机"这个概念对你来说绝对不陌生。但你可能一直有个疑问:市面上这么多云手机品牌,为什么红手指这个已经存在十年的老牌…

2026/7/17 21:44:16
Wireshark正则表达式精准过滤络达芯片蓝牙日志实战指南

Wireshark正则表达式精准过滤络达芯片蓝牙日志实战指南

1. 项目概述:从海量数据中“捞针”如果你曾经调试过蓝牙耳机、智能手表或者任何搭载络达(Airoha)芯片的物联网设备,那你一定对Wireshark抓到的那个数据海洋印象深刻。成千上万的封包在眼前滚动,蓝牙广播、连接请求、数…

2026/7/17 21:39:16

月新闻