HarmonyOS vibrator API 封装解析:DeviceUtil 振动工具函数从入门到实战

HarmonyOS vibrator API 封装解析:DeviceUtil 振动工具函数从入门到实战 文章目录一、前言二、工具函数方法三、方法详解3.1 startVibration(duration, usage) — 开启振动3.2 stopVibration() — 停止振动四、完整 Demo 演示代码4.1 振动控制方法4.2 UI 渲染4.3 API 列表数据五、运行效果说明六、实际开发建议场景 1操作确认反馈场景 2游戏碰撞反馈场景 3来电振动七、常见错误处理八、小结一、前言近期发现一款很有意思的HarmonyOS 三方库, 地址 pura/harmony-utils(V1.4.0) , 作者是桃花镇童长老, 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦案例demo导航展示↓↓↓↓↓↓接下来言归正传 ↓↓↓↓振动反馈是移动应用中重要的交互手段之一合理的振动反馈能大幅提升用户体验——比如消息通知、操作确认、游戏特效、来电提醒等场景。HarmonyOS 提供了vibrator模块来控制设备振动DeviceUtil对其进行了封装只需两个方法即可完成所有振动控制。二、工具函数方法// 开启振动需要权限ohos.permission.VIBRATEstaticstartVibration(duration:number1000,usage:vibrator.Usagemedia):Promisevoid// 停止振动按照 VIBRATOR_STOP_MODE_TIME 模式staticstopVibration():Promisevoid三、方法详解3.1startVibration(duration, usage)— 开启振动源码staticstartVibration(duration:number1000,usage:vibrator.Usagemedia):Promisevoid{returnvibrator.startVibration({type:time,duration:duration},{id:0,usage:usage});}参数说明参数类型默认值说明durationnumber1000振动时长单位毫秒msusagevibrator.Usagemedia振动使用场景usage参数可选值值适用场景media媒体播放、视频、音乐ringtone来电铃声alarm闹钟notification通知communication通话touch触摸反馈unknown未知场景底层原理调用vibrator.startVibration时使用了{ type: time, duration: duration }这种按时长振动的模式区别于按振动效果模式type: preset。id: 0表示使用默认振动器。权限要求使用振动功能前必须在module.json5中声明权限{requestPermissions:[{name:ohos.permission.VIBRATE}]}3.2stopVibration()— 停止振动源码staticstopVibration():Promisevoid{returnvibrator.stopVibration(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_TIME);}说明使用VIBRATOR_STOP_MODE_TIME模式停止振动该模式与startVibration中的{ type: time }对应停止的是按时长方式启动的振动。四、完整 Demo 演示代码DeviceUtilDemoPage.ets中振动演示部分的完整代码4.1 振动控制方法// ── 振动 ─────────────────────────────────────────────doVibrate(duration:number){this.vibrationStatus振动中 (${duration}ms);this.vibrationColor#00C853;this.addLog(Vibrate,开始振动${duration}ms...,info);DeviceUtil.startVibration(duration,media).then((){this.vibrationStatus待机;this.vibrationColor#888;this.addLog(Vibrate,振动结束,success);}).catch((e:Error){this.vibrationStatus振动失败;this.vibrationColor#FF5252;this.addLog(Vibrate,振动失败:${e.message},error);});}stopVibrate(){DeviceUtil.stopVibration().then((){this.vibrationStatus已停止;this.vibrationColor#FF9800;this.addLog(Vibrate,振动已停止,warn);}).catch((e:Error){this.addLog(Vibrate,停止失败:${e.message},error);});}4.2 UI 渲染// ══ 振动 ══════════════════════════════════════════════if(this.activeTab4){Column(){Text(振动演示).fontSize(13).fontColor(#666).fontWeight(FontWeight.Medium).alignSelf(ItemAlign.Start).margin({bottom:8})Text(startVibration(duration, usage) / stopVibration()).fontSize(11).fontColor(#888).alignSelf(ItemAlign.Start).margin({bottom:12})// 状态显示Row(){Text(状态:).fontSize(14).fontColor(#888)Text(this.vibrationStatus).fontSize(14).fontWeight(FontWeight.Bold).fontColor(this.vibrationColor).margin({left:8})}.width(100%).margin({bottom:16})Text(振动时长选择).fontSize(12).fontColor(#888).alignSelf(ItemAlign.Start).margin({bottom:8})Flex({wrap:FlexWrap.Wrap}){Button(短振 100ms).fontSize(12).height(36).backgroundColor(#4080FF).fontColor(#FFF).onClick((){this.doVibrate(100);}).margin({right:8,bottom:8})Button(中振 500ms).fontSize(12).height(36).backgroundColor(#00C853).fontColor(#FFF).onClick((){this.doVibrate(500);}).margin({right:8,bottom:8})Button(长振 1000ms).fontSize(12).height(36).backgroundColor(#FF9800).fontColor(#FFF).onClick((){this.doVibrate(1000);}).margin({right:8,bottom:8})Button(超长振 3000ms).fontSize(12).height(36).backgroundColor(#FF5252).fontColor(#FFF).onClick((){this.doVibrate(3000);}).margin({right:8,bottom:8})}.width(100%).margin({bottom:12})Button(停止振动 stopVibration()).width(100%).height(40).borderRadius(10).backgroundColor(#D63384).fontColor(#FFF).fontSize(13).onClick((){this.stopVibrate();})}.width(100%).padding(14).backgroundColor(#FFFFFF).borderRadius(12)// API 说明Column(){Text(Vibration API).fontSize(13).fontColor(#666).fontWeight(FontWeight.Medium).alignSelf(ItemAlign.Start).margin({bottom:8})ForEach(this.getVibrationApiList(),(row:VibrationApiItem){Row(){Text(row.name).fontSize(11).fontFamily(monospace).fontColor(#D63384).width(140).maxLines(1)Text(row.desc).fontSize(11).fontColor(#666).layoutWeight(1)}.width(100%).padding({top:4,bottom:4})},(row:VibrationApiItem)row.name)}.width(100%).padding(14).backgroundColor(#FFFFFF).borderRadius(12)}4.3 API 列表数据getVibrationApiList():VibrationApiItem[]{return[{name:startVibration(ms, usage),desc:开启振动usage 支持 media/ringtone/alarm/notification},{name:stopVibration(),desc:按 TIME 模式停止振动},];}五、运行效果说明Demo 中提供了 4 个时长按钮短振 100ms适合触摸反馈、按钮点击确认中振 500ms适合操作成功提示长振 1000ms适合消息通知超长振 3000ms适合来电铃声场景振动状态实时显示振动中绿色振动中 (Xms)待机灰色待机已停止橙色已停止失败红色振动失败六、实际开发建议场景 1操作确认反馈Button(提交订单).onClick(async(){try{awaitsubmitOrder();// 成功短振提示awaitDeviceUtil.startVibration(100,touch);promptAction.showToast({message:提交成功});}catch(e){// 失败双击振动awaitDeviceUtil.startVibration(200,notification);promptAction.showToast({message:提交失败请重试});}})场景 2游戏碰撞反馈onCollision(){DeviceUtil.startVibration(300,media);}场景 3来电振动onIncomingCall(){DeviceUtil.startVibration(2000,ringtone);}onCallAnswered(){DeviceUtil.stopVibration();}七、常见错误处理错误码含义解决方案201权限被拒绝在module.json5中申请ohos.permission.VIBRATE401参数错误检查 duration 是否为正整数usage 是否合法801设备不支持振动使用canIUse检测能力后再调用14600101设备操作失败重试或降级处理八、小结DeviceUtil的振动功能封装极为简洁方法返回值说明startVibration(duration, usage)Promisevoid按时长启动振动stopVibration()Promisevoid停止 TIME 模式振动记住两点必须申请VIBRATE权限否则会收到201错误。使用.then().catch()或async/await振动是异步操作结果在 Promise 中返回。合理使用振动反馈能让你的应用在交互细节上更加出色让用户感受到精心设计的产品质感。