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
相关产品推荐
相关产品推荐

