当前位置: 首页 > news >正文

【共创季稿事节】HarmonyOS 6.1 API23新特性实战:Marquee跑马灯组件进阶用法

承接上篇《基于ArkTS的状态管理机制深度解析》,本文基于已调通的 DevEco Studio 6.1 + API23 环境,实测 Marquee 组件在 HarmonyOS 6.1 中的三项增强,并给出可直接复用的电商长标题场景代码。


一、前言:从"环境地狱"爬出来后的第一份实测

前两周卡在 SDK Lock 和 API 12/23 双环境切换的兼容坑里,差点以为赶不上共创季稿事节。昨天终于把 DevEco Studio 6.1 + Compile SDK 6.1.0 (API 23) 的环境调通,第一时间翻了官方 API23 更新日志,发现Marquee 组件的优化非常克制且实用——不是堆参数,而是精准戳中旧版的三个痛点。

之前做电商类 Demo 时,长商品标题溢出屏幕是常态,旧版本 Marquee 没法自定义首尾间距,两段文本衔接像"连体婴",也没有原生点击暂停,交互很僵硬。这次实测下来,新特性的适配成本极低(改 2 行代码),效果提升却很明显,特意整理成实操文,给同样在踩 API23 坑的新手朋友。


二、API23 Marquee 新特性拆解(对照旧版)

翻官方 API23 变更日志,Marquee 这次动了三个点,咱们逐个对:

特性

旧版(API 12 及以下)

API23 新增强

适用场景

首尾间距

无,文本首尾硬接

新增spacing: number,单位 vp

电商标题、通知栏,避免衔接生硬

滚动速度

只能靠step间接控速,不直观

新增scrollAmount: number,单位 vp/秒

不同屏幕尺寸精准控速

交互

需自己写定时器暂停

原生支持.onClick()绑定状态变量

点击标题暂停查看、再次点击恢复

💡 一个认知点:spacingscrollAmount的参数类型是numberAPI23 内部已默认按 vp 处理,不要再包'100vp'字符串——这点后面踩坑节会展开。


三、代码实现(API23 专属,复制可用)

3.1 完整代码(Index.ets)
// 必须导包,否则 Color.Grey 会报 "Cannot find name 'Color'" import { Color } from '@kit.ArkUI' @Entry @Component struct MarqueeDemo { // 控制跑马灯暂停/播放 @State isPaused: boolean = false // 长文本,模拟电商超长商品标题 private longText: string = '【API23新特性】HarmonyOS 6.1 定制款超长商品标题,支持自定义间距和点击暂停,适配多端设备' // 点击计数(状态反馈用) @State clickCount: number = 0 build() { Column({ space: 30 }) { // —— 页面标题 —— Text('HarmonyOS 6.1 Marquee 新特性演示') .fontSize(24) .fontWeight(FontWeight.Bold) .margin({ top: 20 }) // ===== 旧版本效果(对照组的存在感很重要)===== Text('旧版本效果(无间距/无点击暂停)') .fontSize(16) .fontColor(Color.Grey) Marquee({ start: true, step: 2, loop: -1, fromStart: true, src: this.longText }) .width(300) .height(40) .backgroundColor('#f5f5f5') .padding(10) .margin({ bottom: 20 }) // ===== API23 新版本(核心亮点)===== Text('API23 新特性效果(自定义间距 + 点击暂停)') .fontSize(16) .fontColor(Color.Grey) Marquee({ start: !this.isPaused, // 绑定暂停状态 step: 2, loop: -1, fromStart: true, src: this.longText, spacing: 100, // 【API23】两段文本间距 100vp scrollAmount: 30 // 【API23】每秒滚动 30vp }) .width(300) .height(40) .backgroundColor('#e8f4ff') .padding(10) // 【API23 原生点击暂停,不用自己写定时器】 .onClick(() => { this.isPaused = !this.isPaused this.clickCount++ }) // —— 状态反馈区(让"交互生效"肉眼可见)—— Column({ space: 10 }) { Text(`当前状态:${this.isPaused ? '已暂停' : '滚动中'}`) .fontSize(18) .fontColor(this.isPaused ? Color.Red : Color.Green) Text(`点击次数:${this.clickCount}`) .fontSize(16) Text('提示:点击上方蓝色区域可暂停/恢复') .fontSize(14) .fontColor(Color.Grey) } .margin({ top: 20 }) } .width('100%') .height('100%') .alignItems(HorizontalAlign.Center) } }
3.2 代码里的三个"API23 标记点"
  • spacing: 100:旧版没有,文本首尾不再"黏在一起"

  • scrollAmount: 30:替代旧版靠step猜速度的别扭写法

  • .onClick()直接绑@State:不用自己维护setInterval做暂停/恢复,框架接管


四、运行效果(远程模拟器实拍)

环境:DevEco Studio 6.1 → Device Manager →Remote Emulator​ → Phone API23。

状态

表现

初始态

上方灰底跑马灯(旧版)+ 下方蓝底跑马灯(API23版)同时滚动,状态区显示"滚动中"

点击蓝底跑马灯

蓝底停下,状态切为"已暂停",点击次数 +1

再点击

蓝底恢复滚动,状态切回"滚动中"


五、踩坑记录(官方文档没写的细节)

5.1spacing'100vp'反而报错

最开始我按"所有尺寸加 vp"的旧习惯写了spacing: '100vp',编译器直接甩:

Type 'string' is not assignable to type 'number'

查了 API23 源码签名才发现:spacingscrollAmount的参数类型是number内部已按 vp 换算,传纯数字100就行。这个坑官方文档示例里没强调,新手极易按旧惯性踩。

5.2Color.GreyCannot find name 'Color'

代码里用了Color.Grey / Red / Green,但忘了导包:

// 必须加这一行,否则编译器不认 Color import { Color } from '@kit.ArkUI'

这个坑在前一篇 @State 文里也提过——ArkTS 的枚举类基本都要显式导包,养成"用枚举先导包"的肌肉记忆能省很多事。

5.3 Preview 又双叒叕不刷新

改完spacing切 Preview,还是跑的旧效果。老办法:File → Invalidate Caches → Invalidate and Restart,清完再开 Preview 才认新参数。这个属于 DevEco 6.1 的通病,三篇文里反复出现,已经能构成"系列共性踩坑"了。


六、总结与延伸

Marquee 在 API23 的这次增强,定位很清晰——不是让你"能用",而是让你"好用"spacing解决视觉衔接、scrollAmount解决控速直觉、onClick + @State解决交互 boilerplate,三个点都打在旧版的痛处上。

适配成本 vs 收益比:改 2 行代码(加两个参数 + 绑一个 onClick),就能让电商长标题、首页公告栏、行情滚动这类场景的体验上一个台阶,性价比很高。

💡 下一篇预告:把这颗 Marquee 嵌进"电商商品列表页",结合上一篇的@State+ 即将展开的@Link做父子状态传递,实现"点击商品卡片 → 标题暂停 + 底部弹详情"的小交互,把 API23 新特性和状态管理串成一条线。


http://www.jsqmd.com/news/1134929/

相关文章:

  • 抖音无水印视频下载神器:从零开始掌握批量下载技巧
  • Grafana Dashboard JSON 文件详解
  • Java计算机毕设之基于前后端分离的病毒靶点药物关系数据采集系统的设计与实现 基于 SpringBoot 的生物医药多源数据采集与归档系统(完整前后端代码+说明文档+LW,调试定制等)
  • Driver Store Explorer:Windows驱动管理的终极解决方案,三步释放系统空间
  • ArcGIS Pro 3.2 遥感影像语义分割标签制作:矢量转栅格3大坐标系对齐要点
  • 刷写协议(TODO)
  • 用Go语言构建微服务后端的经验分享
  • 【Java课程设计/毕业设计】基于 SpringBoot+Vue 的博物馆票务台账管理系统的设计与实现 基于 SpringBoot 的数字化文博预约服务系统【附源码、数据库、万字文档】
  • ORB-SLAM3 实战部署:Ubuntu 20.04 + ROS Noetic 完整环境配置 5 步指南
  • ImageNet-1K 数据集 3 种下载方案对比:官网、网盘与 Hugging Face 速度实测
  • 多教师知识蒸馏3种加权策略剖析:CA-MKD置信度 vs 平均 vs 熵加权
  • 使用Let‘s Encrypt与Certbot为Nginx网站免费配置HTTPS及自动续期
  • 106.工业级状态机设计!IEC61131-3 ST 交通灯控制|行人优先 + 急停联锁全实现
  • LLM Agent 的可观测性工程:Trace、决策审计与成本分析
  • PoisonSeed攻击深度解析:FIDO2未破,认证降级漏洞与防御实战
  • 从源码角度理解Java并发编程面试题
  • EM3080-W与PIC18F2458条形码识别系统设计与优化
  • 多模态 Agent 视觉理解:VLM + 工具调用的工程落地
  • 5步掌握炉石传说脚本:告别繁琐操作,实现智能自动化对战
  • 115proxy-for-kodi终极指南:让电视直接播放115云盘视频的完整教程
  • 从手动到自动:B站抽奖助手的智能革命与技术深度解析
  • 3分钟学会Layerdivider:将任何图片智能转换为PSD分层文件
  • 拆解 Pixel2Geo™:视频孪生像素转三维地理坐标核心数学模型
  • MySQL 基本命令操作大全(从入门到熟练)
  • 爬虫数据质量监控——自动检测数据异常与完整性
  • 《客房服务》 电视剧|在线观看|下载|完整版
  • 在线秒升级:前端渐进式更新的“暂停-恢复”策略
  • Docker化部署GooFuzz:3步搭建跨平台Web安全测试环境
  • SpaceOS™八大引擎协同机制:支撑百万级摄像头全域视频孪生运行
  • 5分钟解锁B站缓存视频:跨平台播放的终极解决方案