引言

你有没有注意过——当你长按一个 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 权限。与 RunningLockRUNNING_LOCK 权限类似,这是系统普通权限——用户安装时自动授予,但需要在 module.json5 中声明:

"requestPermissions": [
  {
    "name": "ohos.permission.VIBRATE",
    "reason": "$string:vibrate_reason",
    "usedScene": {
      "abilities": ["EntryAbility"],
      "when": "inuse"
    }
  }
]

不需要权限的 APIisHdHapticSupported()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' }
);

注意事项

  1. 模拟器无法测试:振动马达是物理硬件,模拟器上 startVibration() 的 Promise 会正常 resolve 但不会有实际振动。所有振动测试需要在真机上进行。Demo 中通过"振动中指示器"和操作日志来验证代码逻辑。

  2. 权限声明是必须的:虽然 VIBRATE 是普通权限(用户安装时自动授予),但不声明权限会导致 startVibration() 全部 reject。isHdHapticSupported()isSupportEffect() 不需要权限。

  3. 页面销毁时停止振动:振动是硬件操作,页面关闭后马达不会自动停止。始终在 aboutToDisappear() 中调用 stopVibrationSync()

aboutToDisappear(): void {
  try {
    vibrator.stopVibrationSync();
  } catch (e) {
    // 降级处理
  }
}
  1. 过度振动可能影响体验:虽然 API 没有振动频率限制,但频繁的振动会让用户烦躁甚至关闭应用通知。触感是"锦上添花"而非"雪中送炭"——好的触感用户感觉不到它的存在,坏的触感用户只想关掉它。

  2. Usage 不只是文档VibrateAttribute 中的 usage 字段确实影响系统行为。在"勿扰"或"省电"模式下,系统会根据 usage 值选择性抑制振动。正确分类振动用途能确保你的振动在关键场景下不被误杀。

  3. HD 触感不等于所有设备都支持isHdHapticSupported() 返回 false 时,intensity 参数可能被忽略,VibratePreset 中的精细效果可能退化为基础振动。始终做好降级方案。

  4. VibratorPatternBuilder 链式调用addContinuousEvent()addTransientEvent() 返回的是 VibratorPatternBuilder 自身,可以先链式构建再调用 build()。构建后 Pattern 不可修改。

总结

本文深入讲解了 HarmonyOS NEXT 中 @ohos.vibrator 模块的设计思路和实战应用:

  1. 四种振动形态VibrateTime(简单时长)、VibratePreset(预设触感,6 种内置效果)、VibrateFromFile(触感文件)、VibrateFromPattern(振动序列编程)——从简单到复杂逐级递进。

  2. 八种 Usage 分类alarm/ring/notification/communication/touch/media/physicalFeedback/simulateReality——不仅影响系统策略,也让振动的意图一目了然。

  3. HD 触感:新一代马达技术,让振动不再是简单的开关,而是连续的强度-频率曲线。isHdHapticSupported() 让开发者知道何时可以发挥这种能力。

  4. 振动器管理getVibratorInfoSync()(API 19+)返回所有振动器信息,on('vibratorStateChange')(API 19+)监听振动器上线/下线——为多设备、多振动器场景提供完整的管理框架。

  5. 权限设计VIBRATE 权限保护振动操作,但查询 API 全部免权限——与 runningLockRUNNING_LOCK 权限模式一致。

  6. 第三个 Kit@kit.SensorServiceKit——继 @kit.BasicServicesKit@kit.InputKit 之后,本系列进入了传感器服务领域。振动马达作为"输出型传感器",是整个传感器 Kit 的重要组成部分。

掌握 @ohos.vibrator,让你的应用不再只有视觉和听觉的反馈——触感会为你打开与用户交互的第三条通道。好的触感设计让 UI 从"可看可听"变成"可触可感",这在游戏、工具、辅助功能等场景中是决定性的体验差异。


Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐