默认地图手势开关
SqsMap 使用 MapLibre 风格的 dragPan、scrollZoom 、doubleClickZoom 和 keyboard。当前实现四个默认导航开关;原生库、WASM 和脚本使用同一纯 Rust 策略。跨线程查询和写入使用 await,与 MapLibre 的同步方法有所区别。
import {map} from 'sqsmap';
await map.dragPan.disable();
await map.scrollZoom.enable();
await map.doubleClickZoom.enable();
const enabled = await map.dragPan.isEnabled();
const policy = await map.sqs.gesturesState();
export default {enabled, policy};
同一可运行脚本在独立原生一次性/持续 QuickJS 与网页脚本 Worker运行。完整 HTML/CSS 界面包含三组按钮、初始化状态、操作与销毁;使用方自己实现UI。独立 SDK 使用 view.dragPan 等同名方法及 view.gesturesState()。
禁用导航不关闭 mousedown/click 等指针事件或主动相机命令。禁用正在拖动的导航后,重新启用需要重新按下才能继续拖动。双击围绕点击位置放大一级,Shift 双击缩小一级。滚轮以逻辑像素归一化,保持光标对应地面位置;单指拖动与多指缩放是不同能力。
当前只接受无参数 enable/disable/isEnabled/isActive。未知手势、选项和额外参数明确拒绝,旧策略保留。策略快照只包含四个布尔开关,不报告活动手势;框选、旋转和双指手势继续实施,此页不承诺已经发布。
C 使用 sqsm_map_gesture_json,信封包含 method 和 args(空数组),例如 dragPan.disable 或 sqs.gesturesState。请求最多1KiB;写入在独立输出分配成功后提交,失败输出清零。能力位 SQSM_MAP_GESTURE_POLICY=32768,ABI仍为1。原生壳须按策略处理物理输入;离屏核心不包含窗口或系统权限。网页 capabilities.gesturePolicy 为实际 WASM 能力,旧 SDK/库不得假装支持。
Linux egui 输入帧与浏览器/Worker结果按本阶段验收记录;移动宿主、Windows/macOS、完整桌面GUI及硬件后端仍待验收。全屏/系统定位权限和按钮外观由宿主负责。
参考:MapLibre DragPanHandler、ScrollZoomHandler、DoubleClickZoomHandler。
开关变化事件
使用 map.on("sqs.gestureschange", event => ...) 更新自己的界面,event.gestures 为发生变化时的完整四开关快照。快照不可修改,后续操作不会改写旧事件。先监听,再查询初始化;事件不重放初始状态。有效状态改变一次通知一次,重复设置和失败不通知。
import {map} from 'sqsmap';
export const sessionMode = 'persistent';
const subscription = map.on('sqs.gestureschange', event => {
console.log('导航开关变化', event.gestures);
});
console.log('初始状态', await map.sqs.gesturesState());
export default {ready: true};
// 持续会话停止时释放监听;提前结束时 subscription.unsubscribe()。
同一事件验收脚本 在实际持续原生 QuickJS、网页主线程及严格Worker运行。可复制 HTML/CSS 包含按钮、外部写入后同步、监听和销毁。独立SDK使用 view.on('sqs.gestureschange', ...) 或 view.onGesturesChange(返回取消函数);脚本 map.on 返回带 unsubscribe() 的订阅。
C运行能力 SQSM_MAP_GESTURE_EVENTS=65536;现有事件轮询返回 gestureEvent.gestures。128条离散通知满时,继续改变开关返回RESOURCE_LIMIT且保留原状态;先轮询再重试。WASM/SDK的 capabilities.gestureEvents 反映实际支持。动态库缓冲在销毁后仍归调用者所有,释放一次。原生一次性脚本不提供持续监听;其余手势仍待实现。
实际活动状态
await map.dragPan.isActive()、await map.scrollZoom.isActive()、await map.doubleClickZoom.isActive() 不等同于isEnabled,也不把用户代码的相机动画算作物理手势。达到阈值后按住拖动为活动,松开、取消或丢失捕获后结束;禁用立即清除,重新启用不会恢复旧拖动。编辑/离线框选或被面板拦截的拖动不算默认导航活动。
网页/桌面当前滚轮与双击为瞬时处理,处理结束查询为false。与MapLibre某些持续或惯性识别行为有差异;SqsMap不通过固定延时冒充活动。相机动画状态应查询isMoving/isZooming等。查询需await且不接受参数,不改变地图、命令水位或政策通知。
import {map} from 'sqsmap';
const enabled = await map.dragPan.isEnabled();
const active = await map.dragPan.isActive();
export default {enabled, active};
同一可运行脚本 在原生一次性/持续QuickJS和网页主线程/严格Worker核对相同查询及动画区别。完整HTML/CSS 展示输入监听、主动查询、按钮与销毁。独立SDK使用view对应handler.isActive();WASM能力gestureActivity来自实际绑定。
C运行能力SQSM_MAP_GESTURE_ACTIVITY=131072,新的sqsm_map_gesture_input_json接受handler和active两个字段(最多1KiB),输出实际认可的handler/active。壳负责在真实识别后报告开始,并在释放、取消和失焦时报告结束;迟到的禁用handler开始确认false。它只记录输入,不操作相机,不引入窗口/UI。输出分配失败不改变活动,缓冲独立于地图生命周期。通过原sqsm_map_gesture_json查询handler.isActive,ABI仍为1。
本机桌面验收使用真实egui输入处理帧,网页使用实际CDP鼠标与UA捕获丢失。C验证的是宿主报告的输入,不能当作观察了操作系统触控。完整桌面GUI、Windows/macOS、移动与硬件设备保持待验收。旋转、框选和多指处理仍在后续任务。
有焦点的键盘导航
await map.keyboard.enable()/disable()/isEnabled()/isActive() 使用同一策略和历史变化事件。键盘指南 说明焦点、已接通的平移/缩放快捷键和 MapLibre 差异。Shift左右方向键旋转15度;enableRotation/disableRotation通过独立keyboardRotation选项控制所有方向键平移与旋转,缩放不受影响。Shift上下倾角、球面/三维仍待实现。