logo

G

  • 教程
  • API
  • 示例
  • 插件
  • 所有产品antv logo arrow
  • 6.1.26
  • 画布
    • 简介
    • 初始化参数
    • 场景图能力与生命周期
    • 内置对象
    • 坐标系
    • 画布事件
    • OffscreenCanvas 和服务端渲染
    • CustomElementRegistry
    • 常见问题
  • 渲染器
    • 简介
    • Canvas 渲染器
    • Canvaskit 渲染器
    • SVG 渲染器
    • WebGL 渲染器
    • WebGPU 渲染器
    • 自定义渲染器
  • 相机
    • 简介
    • 相机参数
    • 相机动作
    • 相机动画
  • 事件
    • 简介
    • 事件对象
    • 手势和拖放
    • 常见问题
  • 动画
    • Web Animations API
    • Lottie 动画
  • 基础图形
    • 基础概念
    • DisplayObject
    • Group 图形分组
    • Text 文本
    • Circle 圆形
    • Ellipse 椭圆
    • Rect 矩形
    • Image 图片
    • Line 直线
    • Polygon 多边形
    • Polyline 折线
    • Path 路径
    • HTML 内容
  • 样式系统
    • 简介
    • 继承机制
    • CSS Typed OM
    • CSS Properties & Values API
    • CSS Layout API
    • Pattern
    • Gradient
  • 三维世界
    • 材质
    • 几何
    • 光源
    • Mesh
    • 雾
    • 交互
  • 内置对象
    • EventTarget
    • Node
    • Element
    • Document
    • MutationObserver
    • 工具方法
  • GPGPU
    • 简介
    • 编程模型
    • Kernel API
    • 经典 GPGPU 的实现原理
    • webgpu-graph
  • 声明式用法
    • 使用 Web Components
  • 开发调试工具
    • G 开发者工具
    • 内置的渲染统计信息
    • 第三方开发调试工具

手势和拖放

上一篇
事件对象
下一篇
常见问题

资源

Ant Design
Galacea Effects
Umi-React 应用开发框架
Dumi-组件/文档研发工具
ahooks-React Hooks 库

社区

体验科技专栏
seeconfSEE Conf-蚂蚁体验科技大会

帮助

GitHub
StackOverflow

more products更多产品

Ant DesignAnt Design-企业级 UI 设计语言
yuque语雀-知识创作与分享工具
EggEgg-企业级 Node 开发框架
kitchenKitchen-Sketch 工具集
GalaceanGalacean-互动图形解决方案
xtech蚂蚁体验科技
© Copyright 2025 Ant Group Co., Ltd..备案号:京ICP备15032932号-38

Loading...

当我们想实现除基础事件之外的某些“高级事件”时,例如常见的手势和拖拽,可以通过组合这些基础事件实现。得益于场景图对于 DOM API 的兼容,我们也可以直接使用已有生态,让这些库以为仍然在操作 DOM。

直接使用 Hammer.js

以 Hammer.js 这样的手势库为例,由于完全兼容 DOM API,我们可以直接把 DisplayObject 传入。另外需要通过 inputClass 告知 Hammer.js 我们的输入事件为 PointerEvent,无需考虑例如 TouchEvent 等交互事件,示例:

import Hammer from 'hammerjs';
const hammer = new Hammer(circle, {
inputClass: Hammer.PointerEventInput, // 告知 Hammer.js 我们的输入事件为 PointerEvent
});
hammer.on('press', (e) => {
console.log("You're pressing me!");
console.log(e.target); // circle
});

使用 PointerEvents 实现 Pinch 手势

在该示例中实现了 Pinch 手势,参考 https://developer.mozilla.org/en-US/docs/Web/API/Pointer_events/Pinch_zoom_gestures

核心思路是无需关心 Mouse/TouchEvent,通过监听 PointerEvents 根据事件对象上的 pointerId 跟踪管理屏幕上的触控点。

直接使用 Interact.js

Interact.js 是一个包含了 Drag&Drop,Resize,手势等功能的交互库。

以拖拽为例:

import interact from 'interactjs';
interact(
circle, // 待拖拽对象
{
context: canvas.document, // 将画布 document 传入
},
).draggable({
startAxis: 'xy', // 允许水平垂直两个方向的拖拽
lockAxis: 'start', // 锁定拖拽方向为初始设定
onmove: function (event) {
const { dx, dy } = event; // interact.js 将 dx/dy 挂载在事件对象上
circle.translateLocal(dx, dy); // 移动该对象
},
});
示例

使用 g-plugin-dragndrop

如果觉得 interact.js 太重,可以选择使用我们提供的简单拖放插件:g-plugin-dragndrop。

该插件完全基于 PointerEvents 实现拖放功能。在该示例中,我们监听了足球的 drag 事件,用以移动它到正确的位置,同时监听了球门的 dragover 事件,当足球划过球门区域时改变透明度:

dragndrop

实现简单的拖拽

除了使用以上现成的库,我们还可以通过组合监听 PointerEvents 实现简单的拖拽效果,g-plugin-dragndrop 内部就是这么实现的,参考了 Drag'n'Drop with mouse events:

ball.addEventListener('pointerdown', function (event) {
let shiftX = event.clientX - ball.getBoundingClientRect().left;
let shiftY = event.clientY - ball.getBoundingClientRect().top;
moveAt(event.canvasX, event.canvasY);
function moveAt(canvasX, canvasY) {
ball.style.x = canvasX - shiftX + 'px';
ball.style.y = canvasY - shiftY + 'px';
}
async function onMouseMove(event) {
moveAt(event.canvasX, event.canvasY);
}
canvas.document.addEventListener('pointermove', onMouseMove);
ball.addEventListener(
'pointerup',
function () {
canvas.document.removeEventListener('pointermove', onMouseMove);
},
{ once: true },
);
});
示例