缩放和平移

地址
demo

  1. // 设置滚轮事件 控制zoom的大小
  2. canvas.on('mouse:wheel', function(opt) {
  3. var delta = opt.e.deltaY;
  4. var zoom = canvas.getZoom();
  5. zoom *= 0.999 ** delta;
  6. if (zoom > 20) zoom = 20;
  7. if (zoom < 0.01) zoom = 0.01;
  8. canvas.setZoom(zoom);
  9. opt.e.preventDefault();
  10. opt.e.stopPropagation();
  11. })
  12. canvas.on("mouse:down", function (opt) {
  13. var evt = opt.e;
  14. // 按下Alt键 拖拽
  15. if (evt.altKey === true) {
  16. this.isDragging = true;
  17. this.selection = false;
  18. this.lastPosX = evt.clientX;
  19. this.lastPosY = evt.clientY;
  20. }
  21. });
  22. canvas.on("mouse:move", function (opt) {
  23. // 拖拽
  24. if (this.isDragging) {
  25. var e = opt.e;
  26. var vpt = this.viewportTransform;
  27. vpt[4] += e.clientX - this.lastPosX;
  28. vpt[5] += e.clientY - this.lastPosY;
  29. this.requestRenderAll();
  30. this.lastPosX = e.clientX;
  31. this.lastPosY = e.clientY;
  32. }
  33. });
  34. canvas.on("mouse:up", function (opt) {
  35. // on mouse up we want to recalculate new interaction
  36. // for all objects, so we call setViewportTransform
  37. this.setViewportTransform(this.viewportTransform);
  38. this.isDragging = false;
  39. this.selection = true;
  40. });

空间变换 viewportTransform

newP = fabric.util.transformPoint(P, canvas.viewportTransform);

newP = fabric.util.transformPoint(P, object.calcTransformMatrix());