mrkai77/Subsurface
GitHub: mrkai77/Subsurface
Subsurface 是一个 Swift 库,为 macOS 应用提供对触控板原始多点触控数据、手势识别和触觉反馈的直接访问能力。
Stars: 2 | Forks: 0
Subsurface
适用于 macOS 的原始多点触控、手势和触觉反馈。
Subsurface 让 Swift 应用能够直接访问 Mac 的多点触控设备。它将 Apple 私有的 `MultitouchSupport.framework` 封装为更友好的 API,用于读取原始接触帧、追踪已连接的触控板、识别平移/捏合/旋转手势,以及触发 Force Touch 触觉反馈。
## 安装说明
要将 Subsurface 添加到你的 Xcode 项目中,你可以使用 Swift Package Manager (SPM)。请按照以下步骤操作:
1. 在 Xcode 中打开你的项目。
2. 前往 `File` > `Add Package Dependencies...`。
3. 输入此 URL:`https://github.com/mrkai77/Subsurface`
4. 将 `Subsurface` 库添加到你的 target 中。
Subsurface 目前的目标平台为 macOS 13 及更高版本。
## 用法
下面的示例展示了该包的主要层级。你可以直接操作单个设备、通过 monitor 进行全局监听、将接触帧提供给手势识别器,或者使用触控板执行器来获得触觉反馈。
### 从单个设备读取接触点
```
import Subsurface
guard let device = SubsurfaceDevice.defaultDevice else {
return
}
device.start()
for await contacts in device.contactFrames() {
for contact in contacts {
let position = contact.normalizedVector.position
print("finger \(contact.id): \(position.x), \(position.y)")
}
}
```
`MTContact` 暴露了接触状态、手指和手的分类、归一化位置、速度、压力、角度和触摸椭圆大小。这些值直接来自底层多点触控流,因此你可以决定要进行多少过滤或解释。
### 监控所有触控板
```
import Subsurface
let monitor = SubsurfaceMonitor()
monitor.start()
for await (device, contacts) in monitor.contacts() {
print("\(device.name): \(contacts.count) contacts")
}
```
monitor 会监视 IOKit 中多点触控设备的接入和移除。如果你想同时支持内置触控板和 Magic Trackpad,而又不想让调用者预先选择设备,它将非常有用。
### 识别手势
```
import Subsurface
let monitor = SubsurfaceMonitor()
let recognizer = SubsurfaceGestureRecognizer(fingerCount: 2)
monitor.start()
for await event in recognizer.events(from: monitor) {
switch event {
case let .pan(pan):
print("pan: \(pan.translation), velocity: \(pan.velocity)")
case let .pinch(pinch):
print("pinch: \(pinch.distance) from \(pinch.originDistance)")
case let .rotation(rotation):
print("rotation: \(rotation.rotation) radians")
case let .determining(centroid, fingerCount):
print("waiting on \(fingerCount) fingers at \(centroid)")
case let .unresolvedEnded(reason):
print("gesture ended before resolving: \(reason)")
}
}
```
识别器起始处于判定阶段,随后会锁定到第一个超过其阈值的手势上。首先是捏合,然后是旋转,最后是平移。一旦手势开始,只要表面上至少保留两根手指,它就会持续追踪,这与 macOS 系统手势的粘滞感相吻合。
你可以直接调整阈值:
```
recognizer.minimumPanTranslation = 0.08
recognizer.minimumPinchDistance = 0.1
recognizer.minimumRotation = 0.15
recognizer.inactivityTimeout = .milliseconds(250)
```
### 触觉反馈
```
import Subsurface
guard let actuator = SubsurfaceDevice.defaultDevice?.actuator else {
return
}
actuator.open()
actuator.actuate(pattern: .click, intensity: 0.8)
actuator.close()
```
Subsurface 包含了目前已被映射的内置反馈模式,如果你想构建自己的波形字典,它也支持自定义触觉模式。
## 可视化工具
`Visualizer` 文件夹包含一个小型的 SwiftUI 应用,用于查看原始触摸流。它可以显示接触椭圆,并可选择显示速度矢量、压力等接触元数据、手掌抑制、已连接的设备以及触觉反馈模式。在基于该库进行开发之前,这是检验你的触控板实际报告内容的最简单方法!
该可视化工具正被用于展示 Loop 的触控板手势。
## 许可证
Subsurface 采用 Apache-2.0 许可证发布。请查看仓库中的 [LICENSE](LICENSE) 文件以了解完整的许可证内容。
标签:Swift, 多点触控, 开发库, 手势识别, 触控板, 触觉反馈