更新记录
1.1.1(2026-10-31)
支持蒸汽模式
平台兼容性
uni-app(5.26)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| × | √ | × | × | √ | × | - | - | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(5.26)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | - | - | × | × |
其他
| 多语言 | 暗黑模式 | 宽屏模式 | 蒸汽模式 |
|---|---|---|---|
| × | × | × | √ |
UTS 震动触感反馈(自定义节奏、强度、滑动刻度)
Android / iOS 原生触感插件,用于按钮点击、操作结果、滑动选值和节奏提醒。业务代码使用同一套 API,具体能力通过返回字段判断。
| 能力 | 使用场景 |
|---|---|
| 常见触感预设 | 点击、成功、警告、错误、轻重反馈 |
| 自定义时长与节奏 | 连续两下、不同级别提醒,自定义强度与锐度 |
| 滑动刻度 | 音量、价格、时间等选择器,跨刻度反馈,同刻度去重、连续触发限频 |
| 全局设置 | 接入 App 的触感开关和整体强度 |
| 有限循环与停止 | Android 循环提醒,到时自动停止,也可主动取消 |
HBuilderX 5.26+;版本 1.1.1;插件 ID:austin-haptic-x。
| 项目 | Android | iOS | 演示文件 |
|---|---|---|---|
| uni-app x · Vapor | 6.0+ | 15.0+ | index.uvue |
| uni-app x · VDOM | 5.0+ | 13.0+ | index.uvue |
| uni-app · Vue3 | 5.0+ | 13.0+ | index.vue |
不支持 Web、小程序、鸿蒙和 nvue。iOS 需要具备触感硬件的设备;iPad、模拟器等设备可能返回不支持。模拟器可验证页面、参数和返回结果,无法验证真实震感。
第 1 步:放入插件
完整目录放到 你的项目/uni_modules/austin-haptic-x/。uni_modules 与项目的 manifest.json、pages.json 同级。
项目 manifest.json 无需为本插件额外配置权限或模块。
- Android:打包时自动合并插件内的
android.permission.VIBRATE普通权限,不需要运行时申请授权。 - iOS:无需额外权限或用途说明。插件不依赖第三方 SDK。
保留插件内的 utssdk 等全部文件,无需将插件的 AndroidManifest.xml 复制到项目根目录。
第 2 步:注册演示页
在项目 pages.json 的 pages 数组中追加:
{
"path": "uni_modules/austin-haptic-x/index",
"style": { "navigationBarTitleText": "震动触感反馈", "disableScroll": true }
}
在已有页面点击按钮时打开:
uni.navigateTo({ url: '/uni_modules/austin-haptic-x/index' })
uni-app x 自动使用 index.uvue,普通 uni-app Vue3 使用 index.vue。要把演示改成业务页面,可复制相应文件到 pages/haptics/index.uvue 或 pages/haptics/index.vue,注册新路径并保留插件目录;页面中的根目录导入路径无需修改。
第 3 步:制作并运行自定义基座
- HBuilderX 选中项目,进入 发行 → 原生 App 云打包,选择 Android 或 iOS,勾选 制作自定义调试基座。
- Android 填写应用包名与签名信息;iOS 真机填写与 Bundle ID 匹配的 P12、密码和
.mobileprovision,调试描述文件需包含测试设备的 UDID。 - 完成打包后安装新基座,在 运行 菜单选择 自定义基座,再运行项目。
首次导入、更新原生代码后需要重新制作基座;只改页面、参数或文档不需要。使用 HBuilderX 支持的本地模拟器运行方式时,可直接编译到模拟器,无需为模拟器申请真机签名。
第 4 步:打开页面体验
- 点 按钮点击 / 操作成功 / 警告提醒 / 操作失败,更多预设在“更多触感”中展开。
- 调整 整体强度,再点反馈按钮;关闭触感开关后不再提交播放。
- 拖动 滑动刻度,每跨过 10 个数值反馈一次。
- 选择 连续两下 / 告警节奏,点 播放节奏;也可修改毫秒数组或按时长播放。
- Android 可选择 循环提醒,本页最多循环 3 秒;点 停止 可提前结束。
页面底部显示本次结果、跳过原因或错误码。离页会停止播放,清理演示刻度状态,并恢复进入前的全局设置。iOS 模拟器显示“不支持”属于预期结果,不代表真机播放失败。
业务代码怎么调用
统一从插件根目录 @/uni_modules/austin-haptic-x 导入。 @/ 表示项目源码目录,对应的实际目录为 你的项目/uni_modules/austin-haptic-x/,不直接导入 utssdk/app-ios 或 utssdk/app-android。
uni-app x 的 <script setup lang="uts">:
import { onShow, onHide, onUnload } from '@dcloudio/uni-app'
import {
vibrate, cancelVibration, configureHaptics,
selectionChanged, resetSelectionHaptics,
VibrateOptions, SelectionHapticsOptions,
} from '@/uni_modules/austin-haptic-x'
function onButtonTap(): void {
const options: VibrateOptions = { type: 'light' }
const result = vibrate(options)
console.log(result.ok, result.skipped, result.errCode, result.errMsg)
}
function onPatternTap(): void {
const options: VibrateOptions = {
pattern: [0, 120, 80, 120], intensity: 0.7, sharpness: 0.5,
}
vibrate(options)
}
// 先用实际起始值记录选择器,滑动时再传最新值。
let priceValue = 50
const priceOptions: SelectionHapticsOptions = { key: 'price', step: 10 }
onShow(() => { selectionChanged(priceValue, priceOptions) })
function onPriceChange(value: number): void {
priceValue = value
selectionChanged(value, priceOptions)
}
function updatePreference(enabled: boolean, intensity: number): void {
const settings = configureHaptics({ enabled: enabled, intensity: intensity, minIntervalMs: 40 })
if (!settings.ok) console.log(settings.errCode, settings.errMsg)
}
function cleanup(): void {
resetSelectionHaptics('price')
cancelVibration()
}
onHide(() => { cleanup() })
onUnload(() => { cleanup() })
按钮点击时调用 onButtonTap() 或 onPatternTap();滑动时将当前数值传给 onPriceChange(value);偏好设置变更时调用 updatePreference(enabled, intensity)。普通 uni-app Vue3 使用相同函数调用,去掉类型标注和类型导入即可。
全局设置仅保存在当前进程,不会自动写入磁盘。需要记住用户偏好时,由业务保存并在下次启动时调用 configureHaptics()。同一进程共用设置;业务页面临时调整后,应恢复原设置。
API
| 方法 | 参数 | 返回 | 说明 |
|---|---|---|---|
vibrate(options?) |
VibrateOptions 或 null |
VibrateResult |
播放预设、时长或单次节奏;默认短反馈 |
cancelVibration() |
无 | boolean |
请求停止正在播放的触感;系统瞬时预设可能已经结束 |
isVibrationSupported() |
无 | boolean |
当前设备是否具备可用震动硬件 |
getHapticsCapabilities() |
无 | HapticsCapabilities |
查询平台、模拟器和各项能力 |
configureHaptics(options?) |
HapticsConfigOptions 或 null |
HapticsSettings |
更新全局偏好;不传或 null 只读取;无效参数返回 ok=false、32003 与说明,原设置不变 |
getHapticsSettings() |
无 | HapticsSettings |
读取当前全局偏好 |
selectionChanged(value, options?) |
有限数字、SelectionHapticsOptions 或 null |
VibrateResult |
记录刻度并按变化触发选择反馈 |
resetSelectionHaptics(key?) |
字符串,默认 default |
void |
清除指定选择器的起点与限频记录 |
prepareHaptics() |
无 | boolean |
提前准备原生引擎,适合交互开始时调用;不会播放震动 |
ok=true 表示本次调用被接受;是否实际提交播放还需检查 skipped。系统、马达和设备设置仍会影响最终震感。
可选字段省略或传 null 时使用默认值(配置更新时保留原值);pattern 数组中的每一项仍须为有效数字。
VibrateOptions
所有字段可选。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
type |
string |
short |
支持 short、long、light、medium、heavy、soft、rigid、success、warning、error、selection |
duration |
number |
不设置 | 自定义时长,1~10000 的整数毫秒;不能与 pattern 同时设置 |
pattern |
number[] |
不设置 | 2~64 项,依次为等待、震动、等待、震动毫秒数;每项为 0~10000 的整数,总时长不超过 10000,至少一段震动大于 0 |
repeatIndex |
number |
-1 |
-1 单次;循环时填 pattern 中的有效索引,索引之后必须还有有效震动段;仅支持 Android,iOS 返回 32007 |
intensity |
number |
1 |
0~1 的有限数字,乘以全局强度得到请求强度;0 时跳过播放 |
sharpness |
number |
0.5 |
0~1 的有限数字;iOS 自定义触感锐度,越大越清脆;Android 忽略非默认值并通过 degraded/note 说明 |
maxDurationMs |
number |
10000 |
循环播放的停止上限,1~60000 的整数毫秒;到时自动停止,避免遗留无限循环 |
设置 duration 或 pattern 后使用自定义播放,type 仅作默认预设,不会叠加播放。部分 iOS 系统预设无法独立调节强度或锐度;Android 无振幅控制的设备使用系统强度。请检查能力及 degraded/note,不要假定不同手机震感一致。
Android 循环示例:
vibrate({ pattern: [0, 120, 80, 120], repeatIndex: 0, maxDurationMs: 3000 })
VibrateResult
| 字段 | 类型 | 说明 |
|---|---|---|
ok |
boolean |
调用被接受;跳过时也可能为 true |
supported |
boolean |
设备是否具备可用硬件,与本次播放结果分开判断 |
platform |
string |
android、ios 或 other |
degraded |
boolean |
是否按设备能力调整、忽略部分参数或使用近似效果 |
usedType |
string |
实际请求类型;自定义返回 duration 或 pattern |
skipped |
boolean |
是否未向原生端提交播放 |
skipReason |
string |
disabled 全局关闭、zero-intensity 强度为 0、initial 首次记录起点、unchanged 同一刻度、throttled 触发过快;未跳过时为空 |
engine |
string |
当前平台引擎标识,作为诊断信息 |
effectiveIntensity |
number |
单次强度乘全局强度后的请求值,范围 0~1;不代表设备实际振幅 |
errCode |
number |
0 无调用错误,其他值见错误码 |
errMsg |
string |
错误说明,无错误时为空 |
note |
string |
本次播放或能力调整说明 |
HapticsConfigOptions / HapticsSettings
配置参数均可选;enabled 不传或传 null 时保留当前开关。读取与配置结果均包含下列设置值和状态字段。
| 字段 | 类型 | 初始值 | 说明 |
|---|---|---|---|
enabled |
boolean(配置可传 null) |
true |
全局开关;关闭时停止当前播放,后续请求返回 skipped=true |
intensity |
number |
1 |
后续请求的全局强度,0~1 的有限数字;设为 0 会停止当前播放 |
minIntervalMs |
number |
40 |
两次已提交播放之间的最小间隔,0~1000 的整数毫秒;限制 vibrate() 与选择器的实际播放频率 |
| 结果字段 | 类型 | 说明 |
|---|---|---|
ok |
boolean |
读取或更新成功为 true;无效配置为 false |
errCode |
number |
成功为 0,无效配置为 32003 |
errMsg |
string |
无效配置的具体说明,成功时为空 |
configureHaptics() 只更新传入字段,先完整校验;无效配置返回原设置值与错误状态,不会部分生效。getHapticsSettings() 读取时返回 ok=true、errCode=0、errMsg=''。
SelectionHapticsOptions
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
key |
string |
default |
选择器标识,去除首尾空白后 1~64 个字符;不同控件使用不同 key |
step |
number |
1 |
大于 0、不超过 1000000000 的有限数字;按 Math.floor(value / step) 划分刻度 |
minIntervalMs |
number |
40 |
此选择器两次播放的最小间隔,0~1000 的整数毫秒;同时受全局间隔限制 |
intensity |
number |
1 |
此选择器强度,0~1 的有限数字,再乘以全局强度 |
value 必须为有限数字,除以 step 后的刻度需在安全整数范围内。首次调用仅建立起点;同刻度不重复播放,快速跨多个刻度也只尝试当前反馈,不补播历史刻度。进程内最多保存 32 路选择器,超出时移除最早建立的一路;离页调用 resetSelectionHaptics(key) 清理自己使用的 key。
HapticsCapabilities
| 字段 | 类型 | 说明 |
|---|---|---|
supported |
boolean |
是否存在可用震动硬件 |
platform |
string |
android、ios 或 other |
supportsPreset |
boolean |
是否支持预设反馈 |
supportsDuration |
boolean |
是否支持自定义时长 |
supportsPattern |
boolean |
是否支持单次自定义节奏 |
supportsRepeat |
boolean |
是否支持循环节奏;iOS 为 false |
supportsCancel |
boolean |
是否可请求停止正在播放的触感 |
supportsIntensity |
boolean |
是否具备强度调节能力;个别系统预设仍有独立限制 |
supportsSharpness |
boolean |
是否支持自定义锐度;Android 为 false |
isSimulator |
boolean |
是否为模拟器环境 |
engine |
string |
平台引擎标识 |
notes |
string |
设备能力与使用说明 |
错误码与使用边界
| 错误码 | 说明 | 处理 |
|---|---|---|
0 |
无调用错误 | 同时检查 skipped 与 degraded |
10001 |
当前平台不支持 | 使用 Android / iOS App |
32001 |
原生上下文不可用 | 在前台页面调用,检查参数与基座版本 |
32002 |
无可用触感硬件 | 检查设备能力;iOS 模拟器会返回此状态 |
32003 |
参数校验失败 | 按字段范围修正参数,检查返回的 ok 与 errMsg |
32004 |
原生播放失败 | 查看 errMsg,停止后重试 |
32006 |
App 不在前台 | 回到前台,由用户交互触发 |
32007 |
当前平台不支持循环 | iOS 改用单次 pattern,或先检查 supportsRepeat |
仅用于前台交互反馈。业务页面应在 onHide / onUnload 调用 cancelVibration();演示页已接好。iOS 系统中断或切后台会停止当前触感,Android 循环会在设定时限自动停止。新播放会替换此前播放,同一进程不同时播放多组节奏。
iPhone 无震感时,检查 设置 → 辅助功能 → 触控 → 振动 与 设置 → 声音与触感 → 系统触感;Android 检查系统震动设置及设备是否有震动马达。播放返回成功表示已向系统提交,不是对物理马达状态的检测。

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 642
赞赏 4
下载 12730598
赞赏 1959
赞赏
京公网安备:11010802035340号