【HarmonyOS】應用振動效果實現

一、問題背景:
應用在強提醒場景下,一般會有馬達振動的效果,提示用戶注意力的關注。

比如消息提醒,掃碼提示,刪除鍵確認提示等。

針對高定制化或者固定的振動方式,我們需要有不同的方案實現,馬達振動效果。

二、解決方案:
鴻蒙針對振動效果的實現,有多種方案,目前分為振動和音振協同兩種方式。

單純的只是振動,又分為三種方式:

  1. 系統定制的振動方式,例如鬧鐘
  2. 非系統定制,自定義振動配置json文件的方式
  3. 線性馬達振動,只需要設置時間和強度(最簡單的調用方式)

音振協同一般用于,音效播放和振動同時的場景,例如掃碼。

1.首先需要配置振動權限,該權限是系統權限,只需要配置后,默認就會被授權。
ohos.permission.VIBRATE

2.之后根據需要實現不同的馬達振動效果,方案調用詳情參見下方代碼示例的注釋。

三、DEMO示例:

import vibrator from '@ohos.vibrator';
import { BusinessError } from '@ohos.base';
import { resourceManager } from '@kit.LocalizationKit';/*** 振動管理類* 需要權限: ohos.permission.VIBRATE*/
export class HapticMgr {private TAG: string = 'HapticMgr';private static mHapticMgr: HapticMgr | undefined = undefined;public static Ins(): HapticMgr{if(!HapticMgr.mHapticMgr){HapticMgr.mHapticMgr = new HapticMgr();}return HapticMgr.mHapticMgr;}/*** 按照指定持續時間觸發馬達振動*/public timeVibration(){try {// 觸發馬達振動vibrator.startVibration({type: 'time',duration: 1000,}, {id: 0,usage: 'alarm'}, (error: BusinessError) => {if (error) {console.error(`Failed to start vibration. Code: ${error.code}, message: ${error.message}`);return;}console.info('Succeed in starting vibration');});} catch (err) {let e: BusinessError = err as BusinessError;console.error(`An unexpected error occurred. Code: ${e.code}, message: ${e.message}`);}}/*** 按照預置振動效果觸發馬達振動,可先查詢振動效果是否被支持,再調用振動接口*/public typeVibration(){try {// 查詢是否支持'haptic.clock.timer'vibrator.isSupportEffect('haptic.clock.timer', (err: BusinessError, state: boolean) => {if (err) {console.error(`Failed to query effect. Code: ${err.code}, message: ${err.message}`);return;}console.info('Succeed in querying effect');if (state) {try {// 觸發馬達振動vibrator.startVibration({type: 'preset',effectId: 'haptic.clock.timer',count: 1,}, {usage: 'unknown'}, (error: BusinessError) => {if (error) {console.error(`Failed to start vibration. Code: ${error.code}, message: ${error.message}`);} else {console.info('Succeed in starting vibration');}});} catch (error) {let e: BusinessError = error as BusinessError;console.error(`An unexpected error occurred. Code: ${e.code}, message: ${e.message}`);}}})} catch (error) {let e: BusinessError = error as BusinessError;console.error(`An unexpected error occurred. Code: ${e.code}, message: ${e.message}`);}}public fileVibration(){const fileName: string = 'vibration.json';// 獲取文件資源描述符let rawFd: resourceManager.RawFileDescriptor = getContext().resourceManager.getRawFdSync(fileName);// 觸發馬達振動try {vibrator.startVibration({type: "file",hapticFd: { fd: rawFd.fd, offset: rawFd.offset, length: rawFd.length }}, {id: 0,usage: 'alarm'}, (error: BusinessError) => {if (error) {console.error(`Failed to start vibration. Code: ${error.code}, message: ${error.message}`);return;}console.info('Succeed in starting vibration');});} catch (err) {let e: BusinessError = err as BusinessError;console.error(`An unexpected error occurred. Code: ${e.code}, message: ${e.message}`);}// 關閉文件資源描述符getContext().resourceManager.closeRawFdSync(fileName);}/*** 按照指定模式停止對應的馬達振動,自定義振動不支持此類停止方式*/public stopVibrationByType(){//  停止固定時長振動try {// 按照VIBRATOR_STOP_MODE_TIME模式停止振動vibrator.stopVibration(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_TIME, (error: BusinessError) => {if (error) {console.error(`Failed to stop vibration. Code: ${error.code}, message: ${error.message}`);return;}console.info('Succeed in stopping vibration');})} catch (err) {let e: BusinessError = err as BusinessError;console.error(`An unexpected error occurred. Code: ${e.code}, message: ${e.message}`);}// 停止預置振動:try {// 按照VIBRATOR_STOP_MODE_PRESET模式停止振動vibrator.stopVibration(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_PRESET, (error: BusinessError) => {if (error) {console.error(`Failed to stop vibration. Code: ${error.code}, message: ${error.message}`);return;}console.info('Succeed in stopping vibration');})} catch (err) {let e: BusinessError = err as BusinessError;console.error(`An unexpected error occurred. Code: ${e.code}, message: ${e.message}`);}}/*** 停止所有模式的馬達振動,包括自定義振動:*/public stopVibration(){try {// 停止所有模式的馬達振動vibrator.stopVibration((error: BusinessError) => {if (error) {console.error(`Failed to stop vibration. Code: ${error.code}, message: ${error.message}`);return;}console.info('Succeed in stopping vibration');})} catch (error) {let e: BusinessError = error as BusinessError;console.error(`An unexpected error occurred. Code: ${e.code}, message: ${e.message}`);}}}

振動配置文件:
在這里插入圖片描述

{"MetaData": {"Create": "2023-01-09","Description": "a haptic case","Version": 1.0,"ChannelNumber": 1},"Channels": [{"Parameters": {"Index": 0},"Pattern": [{"Event": {"Type": "transient","StartTime": 0,"Parameters": {"Frequency": 31,"Intensity": 100}}},{"Event": {"Type": "continuous","StartTime": 40,"Duration": 54,"Parameters": {"Frequency": 30,"Intensity": 38,"Curve": [{"Time": 0,"Frequency": 0,"Intensity": 0},{"Time": 1,"Frequency": 15,"Intensity": 0.5},{"Time": 40,"Frequency": -8,"Intensity": 1.0},{"Time": 54,"Frequency": 0,"Intensity": 0}]}}}]}]
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22412.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22412.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22412.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php項目加密源碼

軟件簡介 壓縮包里有多少個php就會被加密多少個PHP、php無需安裝任何插件。源碼全開源 如果上傳的壓縮包里有子文件夾(子文件夾里的php文件也會被加密),加密后的壓縮包需要先修復一下,步驟:打開壓縮包 》 工具 》 修…

【云原生】Kubernetes----Ingress對外服務

目錄 引言 一、K8S對外方式 (一)NodePort 1.作用 2.弊端 3.示例 (二)externalIPs 1.作用 2.弊端 3.示例 (三)LoadBalancer 1.作用 2.弊端 (四)Ingress 二、Ingress的…

Linux文件I/O與標準I/O緩沖機制及性能分析

目錄 1、文件I/O 1.1、數據緩沖機制 1.2、性能影響 2、標準I/O 2.1、數據緩沖機制 2.2、性能影響 3、文件I/O與標準I/O的對比 在Linux中,文件I/O和標準I/O是兩種常見的I/O操作方式,它們在數據緩沖的原理和機制上有所不同。理解這些原理和機制對優…

gitea的git庫備份與恢復

文章目錄 gitea庫的備份與恢復概述筆記實驗環境更新git for windows更新 TortoiseGit備份已經存在的gitea的git庫目錄使用gitea本身來備份所有git庫目錄將gitea庫恢復到新目錄m1m2m3啟動gitea - 此時已經恢復完成FETCH_HEAD 中有硬寫位置再查一下app.ini, 是否改漏了。m1m2 總結…

容器中運行ip addr提示bash: ip: command not found【筆記】

容器中運行ip addr提示bash: ip: command not found 原因沒有安裝ip命令。 rootdocker-desktop:/# ip addr bash: ip: command not found rootdocker-desktop:/# apt-get install -y iproute2

谷歌廣告怎么開戶?Google推廣開戶費用、代運營流程、代理開戶、投放價格

谷歌推廣(Google Ads廣告)是指Google公司面向全球用戶,在其自有搜索引擎、YouTube視頻、Gmail郵箱等各類自有產品提供的廣告位中,展示的各類互聯網廣告。谷歌廣告,有很多種衍生的叫法:谷歌SEM、谷歌競價、谷…

渦輪流量傳感器

渦輪流量傳感器是一種精密的流量測量儀表,廣泛應用于石油、化工、冶金、科研等領域的計量和控制系統。配備有衛生接頭的渦輪流量傳感器還可以應用于制藥行業。該傳感器的主要工作原理基于流體動力學和電磁感應原理,當流體流經傳感器時,流體的…

cron表達式的講解及其在若依定時任務中的使用

目錄 前言介紹一 cron的結構二 各域的含義三 常用cron表達式 實例1 后臺添加定時任務處理類2 前端新建定時任務信息3 點擊執行一次4 啟動定時任務 前言 在實際項目開發中Web應用有一類不可缺少的,那就是定時任務。 定時任務的場景可以說非常廣泛,比如某…

JS跨頁面或跨JS文件對變量賦值

JS跨頁面或跨JS文件對變量賦值,這是很小的一個問題。 但問題雖小,卻總覺得有點不夠自然,不爽。 為什么呢?訪問一個頁面上的變量不是什么難事,比如用parent.變量名,或者windows名.變量名,都可以…

Day42 代碼隨想錄打卡|二叉樹篇---二叉樹的所有路徑

題目(leecode T257): 給你一個二叉樹的根節點 root ,按 任意順序 ,返回所有從根節點到葉子節點的路徑。 葉子節點 是指沒有子節點的節點。 方法:本題需要對二叉樹中的所有路徑進行遍歷,并且是…

vue-router 源碼分析——2. router-link 組件是如何實現導航的

這是對vue-router 3 版本的源碼分析。 本次分析會按以下方法進行: 按官網的使用文檔順序,圍繞著某一功能點進行分析。這樣不僅能學習優秀的項目源碼,更能加深對項目的某個功能是如何實現的理解。這個對自己的技能提升,甚至面試時…

CSS選擇器和樣式

CSS CSS:選擇器:通配符選擇器:基本選擇器:標簽選擇器:類選擇器:ID選擇器:基本選擇器的優先級別: 群組選擇器:派生選擇器:后代選擇器:子代選擇器:相鄰兄弟選擇…

sed批量修改shell腳本內容

需求:郵件服務器腳本ip做了切換,由原先的11.22.33.44,切換為11.22.33.55 需要把所有使用了11.22.33.44該ip的腳本改為11.22.33.55 示例: #建2個測試文件 cat test1.txt 11.22.33.44 hello 11.22.33.44cat test2.txt 11.22.33.44 world#1.先找出哪些腳本包含該ip grep 11.22.3…

正邦科技(day3)

出廠測試 設備校準 這個需要注意的是校準電流、電壓、電感的時候有時候負感器會裝反,mcu會壞,需要flash一下清空內存

【貓狗識別系統】圖像識別Python+TensorFlow+卷積神經網絡算法+人工智能深度學習

貓狗識別系統。通過TensorFlow搭建MobileNetV2輕量級卷積神經算法網絡模型,通過對貓狗的圖片數據集進行訓練,得到一個進度較高的H5格式的模型文件。然后使用Django框架搭建了一個Web網頁端可視化操作界面。實現用戶上傳一張圖片識別其名稱。 一、前言 …

iptables備份

備份 iptables sudo iptables-save > iptables_backup.txt文件還原

【安裝筆記-20240529-Windows-poedit 翻譯編輯器】

安裝筆記-系列文章目錄 安裝筆記-20240529-Windows-Poedit 翻譯編輯器 文章目錄 安裝筆記-系列文章目錄安裝筆記-20240529-Windows-Poedit 翻譯編輯器 前言一、軟件介紹名稱:Poedit主頁官方介紹 二、安裝步驟測試版本:Poedit-3.4.4下載鏈接安裝界面 三、…

華為機械工程師面試問題

在機械工程師的面試中,面試官可能會提出一系列問題,以評估應聘者的專業知識、技能、經驗以及解決問題的能力。以下是一些可能的面試題: 基礎知識與技能: 請解釋機械工程中常用的幾種傳動方式,并比較它們的優缺點。描述一下你在機械設計過程中常用的軟件,并舉例說明你是如…

網絡安全設備常見部署模式介紹

文章目錄 前言串聯模式路由模式透明模式 旁路模式旁路監聽代理模式正向代理透明代理反向代理 前言 網絡安全設備主要有串聯模式和旁路模式。這些模式在網絡安全架構中扮演著關鍵角色,以確保數據傳輸的安全性和高效性。 串聯模式 串聯模式要求所有流量都必須通過安…

程序員為什么會成為工具人——及其一些破局的思考

一、程序員為什么會成為工具人 程序員為什么會成為工具人的因素分析 序號因素分析1 技術從來不是解決用戶價值問題的那個人,產品才是解決用戶需求痛點創造價值問題的那個人 (技術只是服務于產品的工具,程序員永遠都是在做最后一公里的搬磚&am…