📳 LSPosed / LibXposed 模块 | 为 微信输入法、豆包输入法、讯飞输入法、Gboard 提供更丰富的震动选项。
我很喜欢 vivo 输入法那个双段震动,遂制作此模块给别的输入法也弄一个两段震动。
需要 LibXposed API 102(LSPosed 1.9.3 及以上),以及 Android 13(API 33)及以上。
-
作者只有一部 vivo 手机开发与测试,因此当你的设备没有生效时欢迎带日志反馈(issue/酷安)。
-
酷安在这,有问题欢迎。
-
个人仓库,这边更新也许更及时一点。
-
频道链接,感觉做个模块频道有一种很有模块感觉的感觉所以建了一个频道。
-
觉得高兴可以喂作者一口🫣
- 部分ROM对输入法的震动反馈有特调震动,例如对于作者的设备微信输入法和gboard都在此白名单中,导致输入法发出的震动不能被原样播放。该问题本模块目前无法通过操作模块与宿主绕过。因此如果在您的设备上也出现了部分输入法有两段震动但震动降级/与配置不一致请考虑此限制。未来可能通过Hook系统框架解决,免root框架暂时无解决方案。
- 通过 LSP仓库/本仓库 下载模块并安装。在 LSPosed 管理器中启用模块、勾选作用域(微信输入法 / 豆包输入法 / 讯飞输入法 / Gboard)后,重启一次目标应用即可。讯飞的定制版(
.oem/.miui)不在默认作用域里,需要手动勾选对应应用。此后更新模块本体不需要再重启输入法(走 API 102 热重载,若设置页正在前台会推迟到关闭后)。 - 模块鲁棒性还行,兼容其他模块和部分修改版。但对于***“共存版”、“改包名版”***,因包名改变会导致无法使用,可拉取源码自行编译。
-
打开输入法的设置页,点击屏幕侧边悬浮的圆形按钮进入模块设置。模块没有桌面图标。
-
根级底栏为「首页 / 配置 / 设置」三项:
- 首页:框架连接状态、版本信息、宿主概览、注入状态;
- 配置:按下震动、抬起震动、恢复默认配置、重载输入法;
- 设置:颜色模式、配置导入 / 导出、调试日志、帮助文档、关于(仓库 / 酷安 / 频道 / 赞助)。
-
- 无震动:顾名思义
- 系统预设:Android 系统中现有的最多 20 种震动风格
- 简单自定义:自定义震动时长与强度的震动
- 自定义波形:自定义具体震动曲线的高级震动,参阅 高级配置
-
- 配置导入 / 导出:导出为 JSON 文件,或从文件选择器导入;导入时校验格式,非法文件会被拒绝
- 调试日志:调试输出开关、清除日志、打包导出
-
重载输入法: 用于在重启输入法后才能生效的场景(例如更换了震动目标类)。需授予宿主 root 权限。
-
配置保存在各输入法自己的数据目录:
/sdcard/Android/data/<宿主包名>/files/haostoo/config/state.json,各宿主独立保存但结构相同。可用「导出配置」备份。
自定义波形可直接在设置页图形化编辑:在「配置」页将按下/抬起风格选为自定义波形后,点击 设置波形 进入编辑器。
点击某方向的「设置波形」只会编辑该方向(按下或抬起)的波形。编辑器包含:
- 有效波段数(2~8):该卡片唯一的波段数量来源;
- 曲线预览:平滑拟合曲线(仅作视觉预览,实际震动按符合牛顿定律的离散数值执行),点击曲线节点可打开该波段的底部调整面板;
- 波段编辑行:按有效波段数生成,逐段填写时长(ms)与强度(0~255);第 1 段时长依 Android 文档固定为 0 且只读。
默认预填一套四段波形。缩小波段数后再放大,会保留本次编辑中隐藏的波段值;新增波段按当前曲线插值生成非零初值,不会补零。点击保存才写入配置并生效;取消或返回不会写入。
当震动风格为自定义波形时,对应的按下(Down)或抬起(Up)震动将根据此配置震动。通过自定义曲线理论上可以模拟绝大多数应用和系统触觉反馈的震动风格,包括但不限于部分定制输入法提供的模拟机械键盘震动。
导出的配置文件形如:
{
"schema": 3,
"host": "com.bytedance.android.doubaoime",
"state": {
"settings": { "down_mode": 1, "up_mode": 0 },
"waveform": {
"down": { "timings": [0, 10, 40], "amplitudes": [0, 140, 60] },
"up": { "timings": [0, 40], "amplitudes": [0, 120] }
}
}
}down: 按键按下时触发的震动波形。
up: 按键抬起时触发的震动波形。
timings: 震动时间数组,单位为毫秒(ms)。数组中的每个元素表示该阶段持续的时间。
amplitudes: 震动强度数组。取值范围:0 ~ 255。数值越大,震感越强。
"timings": [0, 6, 6],
"amplitudes": [0, 140, 60]表示:
| 阶段 | 时长 | 强度 |
|---|---|---|
| 0 | 立即开始 | 开始 |
| 1 | 持续 6ms | 140 |
| 2 | 持续 6ms | 60 |
正确:
{
"timings": [0, 6, 6],
"amplitudes": [0, 140, 60]
}错误:
{
"timings": [0, 6, 6],
"amplitudes": [0, 140]
}正确:
"timings": [0, 6, 6]错误:
"timings": [5, 6, 6]正确:
"amplitudes": [0, 120, 255]错误:
"amplitudes": [0, 300, -1]错误:
"timings": []-
不同设备的马达性能不同,相同配置的实际震感可能存在 巨大差异。想获得较正常的体验至少需要线性马达。转子马达难以高精度控制,效果很差。
-
不同系统对于震动调用的频率和精度也有限制。因此 timings 分段不建议过短过复杂,过于复杂精细的曲线可能被系统截断或降级,导致实际震动效果与配置效果有出入。
-
因此总时长控制在几十毫秒,分 2~4 段是比较甜点的选择。
自定义波形震动基于 VibrationEffect.createWaveform() 实现。
本项目基于 Apache License 2.0 开源。