HarmonyOS NEXT 振动反馈详解:@ohos.vibrator 触感交互与马达控制实战
引言
你有没有注意过——当你长按一个 App 图标时,手指会感受到一个短促的"咔嗒";当你输入错误的密码时,手机可能会一震提醒;当你调整闹钟时间时,滚轮的每一次转动都伴随着微妙的触觉反馈。这些不是 UI 动画,而是设备马达在振动——这就是触感交互(Haptic Feedback)。
HarmonyOS NEXT 的 @ohos.vibrator 模块提供了完整的振动马达控制能力。从简单的"振一下",到预设的触感效果(轻柔、强烈、尖锐),再到复杂的振动序列编程,它让开发者能为应用注入真实的物理触感——让用户不只看到、听到,更能"摸到"交互的结果。
本文将通过"振动反馈实验室"Demo,深入讲解振动马达控制的全部维度:时长振动、预设触感、振动用途分类、高清触感检测、振动器信息查询,以及自定义振动模式的构建。
@ohos.vibrator 模块概述
@ohos.vibrator 属于 @kit.SensorServiceKit——这是本系列继 @kit.BasicServicesKit(前六篇)和 @kit.InputKit(第七篇)之后,进入的第三个 Kit。传感器服务 Kit 包含振动、陀螺仪、加速度计等物理传感器相关的 API。
导入方式
import vibrator from '@ohos.vibrator';
API 总览
| API | 返回值 | 类型 | 说明 | 权限 | API 版本 |
|---|---|---|---|---|---|
startVibration(effect, attr) |
Promise<void> |
异步 | 触发振动效果 | VIBRATE | API 9+ |
stopVibration(stopMode) |
Promise<void> |
异步 | 按模式停止振动 | VIBRATE | API 9+ |
stopVibration() |
Promise<void> |
异步 | 停止所有振动 | VIBRATE | API 10+ |
stopVibrationSync() |
void |
同步 | 同步停止所有振动 | VIBRATE | API 12+ |
isHdHapticSupported() |
boolean |
同步 | 检测高清触感支持 | 无需 | API 12+ |
isSupportEffect(effectId) |
Promise<boolean> |
异步 | 检测预设效果可用性 | 无需 | API 10+ |
isSupportEffectSync(effectId) |
boolean |
同步 | 同步检测效果可用性 | 无需 | API 12+ |
getVibratorInfoSync(param?) |
Array<VibratorInfo> |
同步 | 获取振动器设备列表 | 无需 | API 19+ |
on('vibratorStateChange', cb) |
void |
订阅 | 监听振动器接入/移除 | 无需 | API 19+ |
off('vibratorStateChange', cb?) |
void |
取消 | 取消监听 | 无需 | API 19+ |
两种基础用法
振动马达的 API 从"简单"到"高级"有一条清晰的学习路径。对于大多数应用场景,你只需要两种调用:
1. 简单的时长振动:
vibrator.startVibration(
{ type: 'time', duration: 500 }, // 振动 500ms
{ usage: 'touch' } // 用途:触摸反馈
);
2. 预设的触感效果:
vibrator.startVibration(
{
type: 'preset',
effectId: 'haptic.effect.soft', // 预设:轻柔
intensity: 100 // 强度:100
},
{ usage: 'physicalFeedback' } // 用途:物理反馈
);
这两种方式涵盖了绝大多数场景——导航、通知、触摸反馈,都用这两个 API。但如果你想深入控制振动曲线、自定义振动序列、或者管理多个振动器,后面还有更高级的能力。
核心 API 详解
1. 振动效果:VibrateEffect 的四种形态
VibrateEffect 是振动控制的灵魂——它是一个联合类型,包含四种不同的振动描述方式:
type VibrateEffect = VibrateTime | VibratePreset |
VibrateFromFile | VibrateFromPattern;
VibrateTime — 时长振动
最简单的振动方式:指定一个时长(毫秒),马达以系统默认强度持续振动。
interface VibrateTime {
type: 'time';
duration: number; // 振动时长,单位 ms
}
使用示例:
// 振动 300ms — 适合短促的点击反馈
vibrator.startVibration(
{ type: 'time', duration: 300 },
{ usage: 'touch' }
);
// 振动 2000ms — 适合需要持续振动的提醒场景
vibrator.startVibration(
{ type: 'time', duration: 2000 },
{ usage: 'alarm' }
);
这种方式的优点是简单直观——想振多久就设多少毫秒。缺点是无法控制振动强度和曲线。在 Demo 中,我们用一个 Slider(滑动条)来直观选择 10ms 到 3000ms 的时长范围,点击按钮触发振动。实际中,300ms 以下的振动感觉像"点击",500-1000ms 像"提醒",2000ms 以上像"警报"。
VibratePreset — 预设触感
系统内置了一系列预制的振动效果,每个效果都是经过工程师调校的振动模式——不是简单的一直振,而是包含了强度变化、间隔节拍的复杂触感。
interface VibratePreset {
type: 'preset';
effectId: string; // 预设效果 ID
count?: number; // 重复次数(API 12+)
intensity?: number; // 振动强度(API 12+),1-100
}
HarmonyOS NEXT 预置了六种标准触感效果(HapticFeedback 枚举,API 12+):
| 枚举值 | effectId | 含义 | 典型场景 |
|---|---|---|---|
EFFECT_SOFT |
haptic.effect.soft |
轻柔振动 | 按键反馈、列表项点击 |
EFFECT_HARD |
haptic.effect.hard |
强力振动 | 重要操作确认 |
EFFECT_SHARP |
haptic.effect.sharp |
尖锐振动 | 紧急提醒、错误提示 |
EFFECT_NOTICE_SUCCESS |
haptic.notice.success |
成功通知 | 操作完成、验证通过 |
EFFECT_NOTICE_FAILURE |
haptic.notice.fail |
失败通知 | 操作失败、校验不通过 |
EFFECT_NOTICE_WARNING |
haptic.notice.warning |
警告通知 | 危险操作预警 |
使用示例:
// 操作成功的触感反馈
vibrator.startVibration(
{
type: 'preset',
effectId: 'haptic.notice.success',
intensity: 100
},
{ usage: 'physicalFeedback' }
);
// 错误提示的尖锐振动
vibrator.startVibration(
{
type: 'preset',
effectId: 'haptic.effect.sharp',
intensity: 80
},
{ usage: 'notification' }
);
值得注意的是,intensity 参数(API 12+)可以调校振动强度(1-100),这让开发者可以在保留预设效果节奏的前提下调整力度——比如"轻柔"效果在强度 100 时明显可感,在强度 20 时近乎微秒的脉冲。
VibrateFromFile — 自定义触感文件
对于需要独特振动体验的应用(如游戏中的爆炸、引擎轰鸣等),可以通过触感文件(haptic file)描述任意振动曲线:
interface VibrateFromFile {
type: 'file';
hapticFd: HapticFileDescriptor;
}
interface HapticFileDescriptor {
fd: number; // 文件描述符
offset?: number; // 读取偏移
length?: number; // 读取长度
}
这是一种高级用法——你需要预先准备好符合系统格式的触感描述文件,通过文件系统 API 打开并传入 fd。触感文件的格式不在本文范围内,有兴趣的读者可以参考鸿蒙官方文档中的 Haptic Studio 工具。
VibrateFromPattern — 振动序列编程(API 18+)
这是最强大的振动控制方式——通过 VibratorPatternBuilder 构建由多个振动事件组成的序列,每个事件可以是连续振动(CONTINUOUS)或瞬态振动(TRANSIENT),每个事件可以独立控制强度、频率和起止时间。
interface VibrateFromPattern {
type: 'pattern';
pattern: VibratorPattern;
}
使用 VibratorPatternBuilder 构建振动序列:
const pattern = new vibrator.VibratorPatternBuilder()
.addTransientEvent(0) // 0ms: 瞬态振动
.addContinuousEvent(100, 500) // 100ms: 连续振动 500ms
.addTransientEvent(700) // 700ms: 瞬态振动
.build();
vibrator.startVibration(
{ type: 'pattern', pattern: pattern },
{ usage: 'ring' }
);
addTransientEvent(time, options?) 添加一个瞬态振动事件——就像点击的"咔嗒"感,短而锐利。addContinuousEvent(time, duration, options?) 添加一个连续振动事件——就像来电振动,持续不断。通过组合这两种事件,可以编码出几乎任何振动模式:滴滴—滴滴—滴滴(电报码风格)、长振—短振—长振(SOS 风格)、甚至是音乐的振动伴奏。
2. 振动用途:Usage 分类体系
VibrateAttribute 中的 usage 字段不是装饰——它告诉系统"这次振动是做什么用的",系统会根据用途自动调整振动策略。比如在"勿扰模式"下,系统可能忽略 notification 类振动但保留 alarm 类。
interface VibrateAttribute {
id?: number; // 振动器 ID,默认 0
deviceId?: number; // 设备 ID(API 19+)
usage: Usage; // 振动用途
}
type Usage = 'unknown' | 'alarm' | 'ring' | 'notification' |
'communication' | 'touch' | 'media' |
'physicalFeedback' | 'simulateReality';
八种 Usage 类型:
| Usage | 含义 | 示例场景 |
|---|---|---|
alarm |
闹钟 | 定时提醒 |
ring |
铃声 | 来电、视频通话 |
notification |
通知 | 消息推送振动提醒 |
communication |
通信 | 震动模式下的来电 |
touch |
触摸 | UI 操作反馈(点击、长按) |
media |
媒体 | 游戏、音乐、视频中的振动 |
physicalFeedback |
物理反馈 | 模拟实体按键手感 |
simulateReality |
模拟现实 | AR/VR 中的触感模拟 |
unknown |
未知 | 未指定用途 |
正确设置 usage 不仅让系统策略能正确工作(比如省电模式下抑制非关键振动),也让系统能在"振动统计"中正确分类,帮助用户了解哪些应用在消耗振动资源。
在我们的 Demo 中,8 种 Usage 以彩色按钮网格排列,点击即可触发对应用途的轻柔振动,直观感受不同的 Usage 分类。
3. 停止振动:三种停止方式
有振动就要有停止。@ohos.vibrator 提供了三种停止方式:
按模式停止(API 9+):
// 停止"时间模式"的振动(VibrateTime类型的)
vibrator.stopVibration(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_TIME);
// 停止"预设模式"的振动(VibratePreset类型的)
vibrator.stopVibration(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_PRESET);
停止所有振动(API 10+):
// 异步停止
vibrator.stopVibration().then(() => {
console.log('所有振动已停止');
});
同步停止(API 12+):
// 同步停止 — 适合页面销毁时的清理
vibrator.stopVibrationSync();
在 Demo 中,我们在页面底部的红色"立即停止"按钮中调用 stopVibrationSync()——这是页面 aboutToDisappear() 的最佳实践:用户离开页面时,任何进行中的振动都应该立即停止,而不是让马达继续嗡嗡响。
4. 高清触感检测与振动器信息
HD 触感检测(API 12+):
const hdSupported: boolean = vibrator.isHdHapticSupported();
高清触感(HD Haptic)是一种更精细的振动技术——传统的马达只有"振"和"不振"两种状态,而 HD 触感马达可以精确控制振动强度和频率曲线,实现更细腻的触觉反馈。不是所有设备都支持 HD 触感,因此在设计振动体验前应该先查询。
振动器信息查询(API 19+):
const infoList: Array<vibrator.VibratorInfo> =
vibrator.getVibratorInfoSync();
// infoList 中的每个 VibratorInfo 包含:
// deviceId, vibratorId, deviceName,
// isHdHapticSupported, isLocalVibrator
现代设备可能不止一个振动马达——手机可能在 X 轴和 Y 轴各有一个线性马达,游戏手柄可能内置了独立的振动器。getVibratorInfoSync() 返回所有振动器的信息,包括设备名称、是否支持 HD 触感、是本地还是外接。
5. 振动器状态监听(API 19+)
类似于输入设备的热插拔监听,振动器也有状态变化事件:
const listener: Callback<vibrator.VibratorStatusEvent> =
(event: vibrator.VibratorStatusEvent) => {
if (event.isVibratorOnline) {
console.log('振动器上线');
} else {
console.log('振动器离线');
}
};
vibrator.on('vibratorStateChange', listener);
// 取消时:vibrator.off('vibratorStateChange', listener);
这对于依赖振动反馈的应用(如游戏)非常重要——如果用户关闭了外接手柄的振动功能,应用可以立即切换到视觉反馈方案。

6. 效果可用性检测
并非所有设备都支持所有预设触感效果。可以用 isSupportEffect() 或 isSupportEffectSync() 检查:
// Promise 方式
vibrator.isSupportEffect('haptic.effect.soft')
.then((supported: boolean) => {
if (supported) {
// 可以用这个效果
}
});
// 同步方式(API 12+)
const supported: boolean =
vibrator.isSupportEffectSync('haptic.notice.success');
实战:振动反馈实验室
页面设计
┌──────────────────────────────────────┐
│ < 振动反馈实验室 @kit.SensorServiceKit│ ← 标题栏(#8B5CF6 紫罗兰)
├──────────────────────────────────────┤
│ 振动器信息 │
│ ┌──────────────────────────────────┐│
│ │ HD触感: 支持 [已触发振动: 15 次] ││ ← 设备能力 + 使用统计
│ │ 振动器: 默认马达(HD/本地) ││
│ └──────────────────────────────────┘│
├──────────────────────────────────────┤
│ ┌──────────────────────────────────┐│ ← 振动中的实时指示器
│ │ ⚡ 振动中 ││
│ │ 轻柔 (SOFT) ││
│ └──────────────────────────────────┘│
├──────────────────────────────────────┤
│ 时长振动 │ ← 时长 Slider 控制
│ ┌──────────────────────────────────┐│
│ │ 持续时长 500 ms 中等 ││
│ │ [===========●============] ││ ← Slider (10ms-3000ms)
│ │ [触发振动 (500ms)] ││
│ └──────────────────────────────────┘│
├──────────────────────────────────────┤
│ 预设触感 (HapticFeedback) │ ← 6 宫格触感
│ ┌──────┬──────┬──────┐ │
│ │ 轻柔 │ 强烈 │ 尖锐 │ │
│ │ 按键 │ 强调 │ 紧急 │ │
│ ├──────┼──────┼──────┤ │
│ │ 成功 │ 失败 │ 警告 │ │
│ │ 完成 │ 错误 │ 警示 │ │
│ └──────┴──────┴──────┘ │
├──────────────────────────────────────┤
│ 振动用途 (Usage) │ ← 8 种 Usage
│ ┌────┬────┬────┬────┐ │
│ │闹钟│铃声│通知│通信│ │
│ ├────┼────┼────┼────┤ │
│ │触摸│媒体│物理│模拟│ │
│ └────┴────┴────┴────┘ │
├──────────────────────────────────────┤
│ [立即停止所有振动] │ ← 紧急停止按钮
├──────────────────────────────────────┤
│ 操作日志 │
└──────────────────────────────────────┘
核心实现
时长振动 + Slider
Demo 的核心交互之一是时长振动——用户拖动 Slider 选择 10ms~3000ms 的时长,点击按钮触发:
private startTimeVibration(): void {
const effect: vibrator.VibrateEffect = {
type: 'time',
duration: this.durationMs
} as vibrator.VibrateTime;
const attr: vibrator.VibrateAttribute = { usage: 'touch' };
vibrator.startVibration(effect, attr)
.then(() => {
this.vibrateCount++;
this.addLog('时长振动: ' + this.durationMs + 'ms');
this.activeLabel = '振动中 ' + this.durationMs + 'ms';
setTimeout(() => { this.activeLabel = ''; }, this.durationMs);
})
.catch((err: Error) => {
this.addLog('振动失败: ' + err.message);
this.addLog('需要 ohos.permission.VIBRATE 权限');
});
}
这里有几个细节:使用 as vibrator.VibrateTime 类型断言确保对象被识别为正确的联合类型分支;振动触发后更新 activeLabel 状态让 UI 显示"振动中"指示器;振动结束后用 setTimeout 清除指示(因为 startVibration 的 Promise 在振动开始时 resolve,不是结束时)。
预设触感六宫格
Demo 将六种 HapticFeedback 预设效果组织为 3x2 的网格,每个卡片有不同的颜色标识:
private readonly hapticPresets: HapticPreset[] = [
{ label: '轻柔', desc: '轻微触感,按键反馈',
effectId: 'haptic.effect.soft', color: '#10B981' },
{ label: '强烈', desc: '强力振动,强调操作',
effectId: 'haptic.effect.hard', color: '#EF4444' },
{ label: '尖锐', desc: '短促锐利,紧急提醒',
effectId: 'haptic.effect.sharp', color: '#F97316' },
{ label: '成功', desc: '操作成功通知振动',
effectId: 'haptic.notice.success', color: '#10B981' },
{ label: '失败', desc: '操作失败通知振动',
effectId: 'haptic.notice.fail', color: '#EF4444' },
{ label: '警告', desc: '警告提示振动',
effectId: 'haptic.notice.warning', color: '#F59E0B' }
];
点击任意卡片触发对应的预设振动:
private startPresetVibration(preset: HapticPreset): void {
const effect: vibrator.VibrateEffect = {
type: 'preset',
effectId: preset.effectId,
intensity: 100
} as vibrator.VibratePreset;
const attr: vibrator.VibrateAttribute = { usage: 'physicalFeedback' };
vibrator.startVibration(effect, attr)
.then(() => { /* ... */ });
}
Usage 分类网格
8 种 Usage 以 4x2 的网格排列,每种有不同的颜色:
private readonly usageOptions: UsageOption[] = [
{ l: '闹钟', v: 'alarm' },
{ l: '铃声', v: 'ring' },
{ l: '通知', v: 'notification' },
{ l: '通信', v: 'communication' },
{ l: '触摸', v: 'touch' },
{ l: '媒体', v: 'media' },
{ l: '物理反馈', v: 'physicalFeedback' },
{ l: '模拟现实', v: 'simulateReality' }
];
每个按钮以 usage 分类触发轻柔振动,让用户在模拟器上虽然感受不到振动,但能理解每种 Usage 对应的场景。
实时振动指示器
Demo 中有一个动态的"振动中"指示器——当马达开始振动时,界面中央会出现一个紫色边框的卡片,显示当前的振动标签(如"振动中 500ms"、“轻柔”、“usage: alarm”)。振动结束后指示器自动消失。这个视觉反馈解决了"在模拟器上看不到振动"的问题——让开发者即使没有真机也能验证振动调用的逻辑流程。
设备能力检测
页面加载时自动检测两个关键能力:
private checkCapabilities(): void {
// 1. HD 触感支持
this.hdSupported = vibrator.isHdHapticSupported();
// 2. 振动器信息
try {
const infoList = vibrator.getVibratorInfoSync();
for (let i = 0; i < infoList.length; i++) {
const info = infoList[i];
// info.deviceName, info.isHdHapticSupported,
// info.isLocalVibrator
}
} catch (e) {
// API 19 以下版本降级
this.vibratorInfo = '默认振动器(API 19+ 可查询详情)';
}
}
这个检测对开发者很有价值——确定设备是否支持 HD 触感后,可以决定是否启用高级振动效果。例如,一款赛车游戏在检测到 HD 触感支持时,可以为引擎轰鸣、碰撞、漂移等不同事件设计独特的触感;在不支持 HD 的设备上则回退到基础的时长振动。
权限配置
振动器需要 ohos.permission.VIBRATE 权限。与 RunningLock 的 RUNNING_LOCK 权限类似,这是系统普通权限——用户安装时自动授予,但需要在 module.json5 中声明:
"requestPermissions": [
{
"name": "ohos.permission.VIBRATE",
"reason": "$string:vibrate_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
}
]
不需要权限的 API:isHdHapticSupported()、isSupportEffect()、getVibratorInfoSync() 都是免权限查询——在创建振动之前先了解设备能力,这是正确的开发顺序。
@kit.SensorServiceKit:第三个 Kit
本系列已经走过了三个不同的 Kit:
| 篇次 | 模块 | Kit | 领域 |
|---|---|---|---|
| #1-#6 | window, wifiManager, batteryInfo, thermal, power, runningLock | @kit.BasicServicesKit |
基础系统服务 |
| #7 | inputDevice | @kit.InputKit |
输入子系统 |
| #8 | vibrator | @kit.SensorServiceKit |
传感器服务 |
@kit.SensorServiceKit 是感知层——它包含设备上所有物理传感器的 API:振动马达、加速度计、陀螺仪、磁力计、光线传感器、接近传感器等。振动马达本质上也是传感器系统中的一员——它负责输出触觉信号,是"输出型传感器"的代表。
理解 Kit 的划分规则有助于在庞大的 API 海洋中快速定位:
- 需要管理设备的休眠状态?→
@kit.BasicServicesKit - 需要感知键盘、鼠标、手柄的连接?→
@kit.InputKit - 需要振动、陀螺仪、加速度计?→
@kit.SensorServiceKit
实际应用场景
场景 1:表单验证
提交表单时用触感反馈验证结果:
async function onSubmitSuccess() {
await vibrator.startVibration(
{
type: 'preset',
effectId: 'haptic.notice.success',
intensity: 80
},
{ usage: 'physicalFeedback' }
);
// 显示成功提示
}
async function onSubmitError() {
await vibrator.startVibration(
{
type: 'preset',
effectId: 'haptic.notice.fail',
intensity: 100
},
{ usage: 'physicalFeedback' }
);
// 显示错误提示
}
场景 2:游戏中的触感特效
赛车游戏用振动序列模拟引擎:
function createEngineHaptic(): vibrator.VibrateFromPattern {
const builder = new vibrator.VibratorPatternBuilder();
for (let i = 0; i < 10; i++) {
builder.addContinuousEvent(i * 200, 150);
}
return { type: 'pattern', pattern: builder.build() };
}
vibrator.startVibration(
createEngineHaptic(),
{ usage: 'media' }
);
场景 3:定时器倒计时
结合 TextTimer 实现震动倒计时:
function onTimerTick(remainingSeconds: number) {
if (remainingSeconds <= 3 && remainingSeconds > 0) {
// 最后 3 秒每秒振动一次
vibrator.startVibration(
{ type: 'time', duration: 200 },
{ usage: 'alarm' }
);
} else if (remainingSeconds === 0) {
// 到达时连续振动
vibrator.startVibration(
{ type: 'time', duration: 2000 },
{ usage: 'alarm' }
);
}
}
场景 4:AR/VR 触感模拟
在 AR 场景中模拟触感:
// 模拟接触到虚拟物体的触感
vibrator.startVibration(
{
type: 'preset',
effectId: 'haptic.effect.soft',
intensity: 40
},
{ usage: 'simulateReality' }
);
注意事项
-
模拟器无法测试:振动马达是物理硬件,模拟器上
startVibration()的 Promise 会正常 resolve 但不会有实际振动。所有振动测试需要在真机上进行。Demo 中通过"振动中指示器"和操作日志来验证代码逻辑。 -
权限声明是必须的:虽然
VIBRATE是普通权限(用户安装时自动授予),但不声明权限会导致startVibration()全部 reject。isHdHapticSupported()和isSupportEffect()不需要权限。 -
页面销毁时停止振动:振动是硬件操作,页面关闭后马达不会自动停止。始终在
aboutToDisappear()中调用stopVibrationSync():
aboutToDisappear(): void {
try {
vibrator.stopVibrationSync();
} catch (e) {
// 降级处理
}
}
-
过度振动可能影响体验:虽然 API 没有振动频率限制,但频繁的振动会让用户烦躁甚至关闭应用通知。触感是"锦上添花"而非"雪中送炭"——好的触感用户感觉不到它的存在,坏的触感用户只想关掉它。
-
Usage 不只是文档:
VibrateAttribute中的usage字段确实影响系统行为。在"勿扰"或"省电"模式下,系统会根据 usage 值选择性抑制振动。正确分类振动用途能确保你的振动在关键场景下不被误杀。 -
HD 触感不等于所有设备都支持:
isHdHapticSupported()返回 false 时,intensity参数可能被忽略,VibratePreset中的精细效果可能退化为基础振动。始终做好降级方案。 -
VibratorPatternBuilder 链式调用:
addContinuousEvent()和addTransientEvent()返回的是VibratorPatternBuilder自身,可以先链式构建再调用build()。构建后 Pattern 不可修改。
总结
本文深入讲解了 HarmonyOS NEXT 中 @ohos.vibrator 模块的设计思路和实战应用:
-
四种振动形态:
VibrateTime(简单时长)、VibratePreset(预设触感,6 种内置效果)、VibrateFromFile(触感文件)、VibrateFromPattern(振动序列编程)——从简单到复杂逐级递进。 -
八种 Usage 分类:
alarm/ring/notification/communication/touch/media/physicalFeedback/simulateReality——不仅影响系统策略,也让振动的意图一目了然。 -
HD 触感:新一代马达技术,让振动不再是简单的开关,而是连续的强度-频率曲线。
isHdHapticSupported()让开发者知道何时可以发挥这种能力。 -
振动器管理:
getVibratorInfoSync()(API 19+)返回所有振动器信息,on('vibratorStateChange')(API 19+)监听振动器上线/下线——为多设备、多振动器场景提供完整的管理框架。 -
权限设计:
VIBRATE权限保护振动操作,但查询 API 全部免权限——与runningLock的RUNNING_LOCK权限模式一致。 -
第三个 Kit:
@kit.SensorServiceKit——继@kit.BasicServicesKit和@kit.InputKit之后,本系列进入了传感器服务领域。振动马达作为"输出型传感器",是整个传感器 Kit 的重要组成部分。
掌握 @ohos.vibrator,让你的应用不再只有视觉和听觉的反馈——触感会为你打开与用户交互的第三条通道。好的触感设计让 UI 从"可看可听"变成"可触可感",这在游戏、工具、辅助功能等场景中是决定性的体验差异。
更多推荐



所有评论(0)