OpenHarmony进度条与系统交互的核心逻辑
OpenHarmony中进度条与系统的交互主要围绕进度数据获取(系统任务进度同步)、进度状态更新(进度条组件渲染)、用户操作反馈(进度条控制任务)三个环节展开,通过系统API、事件监听及组件属性实现闭环交互。
系统任务(如下载、视频播放、文件传输)的进度数据需通过系统提供的API获取,核心是利用进度监听机制捕获实时进度。
@ohos.request模块的download方法创建下载任务,通过DownloadTask的on('progress')事件监听下载进度,获取receivedSize(已下载大小)和totalSize(总大小),计算进度百分比(receivedSize/totalSize*100)。示例代码:let downloadTask = request.download(downloadConfig, (err, data) => {
if (err) console.error('下载失败:', err);
});
downloadTask.on('progress', (receivedSize, totalSize) => {
let progress = (receivedSize / totalSize) * 100; // 计算进度百分比
this.progress = progress; // 更新状态变量
});
AVPlayer的on('timeupdate')事件监听播放进度,获取currentTime(当前播放时间)和duration(总时长),更新进度条的value属性。napi_call_threadsafe_function将进度数据异步传递到ArkTS侧,更新进度条状态。进度条组件(Progress)通过属性绑定将系统进度数据映射到UI显示,核心是value(当前进度)和total(总进度)属性的动态更新。
Progress组件的value属性表示当前进度值(需在0到total之间),total属性表示进度总长(默认100)。系统任务进度数据更新后,修改组件value属性即可同步UI。animation属性为进度条添加过渡动画(如duration持续时间、curve缓动曲线),使进度更新更平滑。示例代码:Progress({
value: this.progress,
total: 100,
type: ProgressType.Ring
})
.animation({ duration: 500, curve: Curve.Ease }) // 添加动画
.style({ strokeWidth: 15 }) // 自定义样式
value设置为total,或切换为成功状态的样式(如颜色变为绿色)。进度条不仅是进度显示组件,还可通过用户交互(如拖动、点击)反向控制系统任务,核心是监听进度条的onChange或onDrag事件。
onChange事件获取新的进度值,调用AVPlayer的seek()方法跳转到对应时间点,实现进度控制。示例代码:progressBar.onChange((value: number) => {
player.seek(value); // 跳转到指定进度
});
DownloadTask的pause()方法暂停下载,或调用resume()方法恢复下载。对于Native层与ArkTS层的交互(如Native侧执行耗时任务),需通过异步回调或线程通信实现进度同步。
startDownload((data: number) => { this.progress = data; })),Native侧通过napi_call_function执行回调,将进度数据传递到ArkTS侧。uv_queue_work将进度数据推送到事件循环,再通过napi_call_threadsafe_function异步调用ArkTS回调,确保线程安全。通过上述环节,OpenHarmony进度条实现了与系统的双向交互:系统任务进度同步到进度条UI,用户通过进度条操作反向控制系统任务,形成完整的用户体验闭环。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。