SnapToGridPlugin
网格吸附插件, 拖拽节点结束时自动将节点位置吸附到最近的网格点, 实现精确对齐。
基本使用
import { CanvasEngine, SnapToGridPlugin } from '@fnt-agilejs/core';
const engine = new CanvasEngine({
container: document.getElementById('canvas-container')!,
});
// 使用简化配置
engine.plugins.use(new SnapToGridPlugin(20));
// 或使用完整配置
engine.plugins.use(new SnapToGridPlugin({
size: 20,
requireModifier: 'cmdOrCtrl'
}));
engine.start();
配置与交互
配置选项
interface SnapToGridOptions {
size?: number; // 网格大小, 默认 20
requireModifier?: Modifier; // 修饰键要求, 默认 'cmdOrCtrl'
}
type Modifier =
| 'none' // 总是吸附
| 'shift' // 需要按住 Shift
| 'alt' // 需要按住 Alt
| 'meta' // 需要按住 Meta (Mac Cmd)
| 'ctrl' // 需要按住 Ctrl
| 'cmdOrCtrl'; // 需要按住 Cmd 或 Ctrl (默认)
// 示例
engine.plugins.use(new SnapToGridPlugin({
size: 20,
requireModifier: 'none' // 总是吸附
}));
功能特性
拖拽结束吸附:
- 只在鼠标释放时执行吸附
- 不影响拖拽过程中的流畅性
修饰键控制:
none: 总是吸附shift: 按住 Shift 时吸附cmdOrCtrl: 按住 Cmd/Ctrl 时吸附(默认)
吸附算法:
const snappedX = Math.round(x / size) * size;
const snappedY = Math.round(y / size) * size;
API与事件
插件ID
readonly id = "snap-to-grid"
构造函数
// 简化形式
constructor(size: number)
// 完整形式
constructor(options: SnapToGridOptions)
生命周期方法
setup(engine: CanvasEngine): void
设置插件, 监听鼠标事件。
dispose(): void
清理插件, 移除事件监听。
常见问题
Q: 为何有时不吸附?
A: 检查:
- 是否按住了所需的修饰键
- 是否在拖拽结束时(不是拖拽过程中)
- DragPlugin 是否正确安装
Q: 如何禁用吸附?
A: 移除插件:
engine.plugins.eject('snap-to-grid');
Q: 如何与 GridPlugin 配合使用?
A: 确保两个插件的 size 配置相同:
engine.plugins.use(new GridPlugin({ size: 20 }));
engine.plugins.use(new SnapToGridPlugin(20));
相关内容
- GridPlugin - 网格显示
- GuidesPlugin - 对齐参考线