You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AngularJS中基于Two.js的多边形拖拽功能故障排查求助

嘿,我帮你梳理下这段拖拽代码里的问题,应该能解决你的困扰:

代码里的核心问题点
  • 事件属性大小写错误:event.ClientX/Y 得改成小写的 event.clientX/clientY,DOM事件对象的属性都是小写开头的,大写会取不到值。
  • 缺失初始偏移量计算:你代码里的offset变量完全没定义,拖拽时必须先在鼠标按下时算出「鼠标相对于多边形锚点的偏移量」,不然拖拽会出现瞬移,位置完全不对。
  • 函数名不匹配:你解绑时用的drag和dragEnd,和定义的$scope._Drag、$scope._DragEnd名字对不上,导致绑定/解绑逻辑完全失效。
  • 缺少拖拽触发入口:拖拽的完整流程是「鼠标按下→绑定移动/结束事件→移动时更新位置→松开解绑」,你现在没处理最关键的mousedown触发逻辑。
  • 未刷新Two.js画布:修改多边形位置后,必须调用two.update()才能让画布渲染新位置。
修正后的完整拖拽函数
// 注意要传入Two.js实例和需要拖拽的图形
$scope.DragAndDrop = function(shape, twoInstance) {
    let offset = { x: 0, y: 0 };

    // 鼠标按下时初始化拖拽逻辑
    const startDrag = function(event) {
        // 计算鼠标相对于多边形当前位置的偏移量
        const currentPos = shape.translation;
        offset.x = event.clientX - currentPos.x;
        offset.y = event.clientY - currentPos.y;

        // 绑定移动和结束事件
        $window.bind('mousemove', $scope._Drag);
        $window.bind('mouseup', $scope._DragEnd);
    };

    $scope._Drag = function(event) {
        // 计算多边形新位置:鼠标位置减去偏移量
        const newX = event.clientX - offset.x;
        const newY = event.clientY - offset.y;
        // 更新多边形的平移坐标
        shape.translation.set(newX, newY);
        // 强制Two.js刷新画布
        twoInstance.update();
    };

    $scope._DragEnd = function(event) {
        // 解绑事件,结束拖拽状态
        $window.unbind('mousemove', $scope._Drag);
        $window.unbind('mouseup', $scope._DragEnd);
    };

    // 给Two.js图形绑定鼠标按下事件(需要通过它的DOM渲染元素绑定)
    shape._renderer.elem.addEventListener('mousedown', startDrag);
};
额外注意事项
  • 确保你的AngularJS控制器已经注入了$window服务,不然无法绑定全局鼠标事件。
  • 调用这个函数时,要把你的Two.js实例(比如初始化时的const two = new Two(...))传进去,用来触发画布更新。
  • 如果拖拽的是Group分组元素,逻辑完全通用,translation.set()同样能修改整个分组的位置。

内容的提问来源于stack exchange,提问作者sani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:35:12