【问题标题】:KineticJS: Defining offset and rotation using anchorsKineticJS:使用锚定义偏移和旋转
【发布时间】:2014-01-27 12:20:06
【问题描述】:

我是 KineticJS 的新手,我正在尝试使用锚点来围绕中心点旋转和成像,该中心点是使用单独的锚点定义的。

我有旋转工作和定义旋转中心也工作。但是,当用户拖动锚点来定义旋转中心时,我使用 setOffset() 函数,它会导致图像移动而不是锚点。

我想知道是否有一种方法可以让用户拖动锚点并且锚点移动并设置偏移量,而不是用户拖动锚点并且图像移动?

更新函数如下

function update(group, activeAnchor) {
var topLeft = group.get(".topLeft")[0];
var topRight = group.get(".topRight")[0];
var bottomRight = group.get(".bottomRight")[0];
var bottomLeft = group.get(".bottomLeft")[0];
var centre = group.get(".centre")[0];
var image = group.get(".image")[0];

var anchorX = activeAnchor.getX();
var anchorY = activeAnchor.getY();

var centreX = group.getOffsetX();
var centreY = group.getOffsetY();

var width = group.getWidth();
var height = group.getHeight();
// update anchor positions
switch (activeAnchor.getName()) {
     case 'topLeft':
          topRight.setY(anchorY);
          bottomLeft.setX(anchorX);
          centreX = topLeft.getX()/2;
          centreY = topLeft.getY()/2;
          break;

    case 'topRight':
          topLeft.setY(anchorY);
          bottomRight.setX(anchorX);
          centreX = topRight.getX()/2;
          centreY = topRight.getY()/2;
          break;

    case 'bottomRight':
          bottomLeft.setY(anchorY);
          topRight.setX(anchorX);
          break;

    case 'bottomLeft':
          bottomRight.setY(anchorY);
          topLeft.setX(anchorX);

          centre.setX(centreX);
          centre.setY(centreY);
          break;

    case "centre":
          var absolute = group.getPosition();
          group.setOffset(anchorX, anchorY);
          group.setPosition(absolute);
  }

image.setPosition(topLeft.attrs.x, topLeft.attrs.y);

var width = topRight.attrs.x - topLeft.attrs.x;
var height = bottomLeft.attrs.y - topLeft.attrs.y;
if(width && height) {
    image.setSize(width, height);
 }
}

我还尝试在拖动时在调整大小时更新图像的四个角的旋转中心。知道怎么做吗?

提前谢谢你。

更新

Fiddle:http://jsfiddle.net/njPdr/(在这里可能无法正常工作,但您可以在这里看到我正在尝试做的事情)

【问题讨论】:

    标签: kineticjs


    【解决方案1】:

    您正在设置图像的位置:image.setPosition(topLeft.attrs.x, topLeft.attrs.y);

    如果您将其替换为image.setOffset(youroffsetx, youroffsety);,图像将不再移动,您将按照自己的意愿设置偏移量。 关于第二个问题,请记住偏移量是旋转中心。

    如 cmets 中所述进行编辑:

    case "centre":
              var absolute = group.getPosition();
              group.setOffset(anchorX, anchorY);
              group.setPosition({x:absolute.x + group.getOffsetX(), y:absolute.y + group.getOffsetY()});
      }
    

    【讨论】:

    • 嗨。感谢您的帮助,但不幸的是它不起作用。图像是组的一部分,并且需要 image.setPosition 使图像在组内(四个锚点)才能调整大小。如果 image.setPosition 被移除并替换为 image.setOffset,则在拖动组时图像仍保留在舞台的左上角。
    • 嗨,你可以给我发一个 jsfiddle 让我看看问题吗?
    • jsfiddle.net/njPdr/3 这是一个完整的实现。它可能无法在小提琴中正常工作,但你会看到我正在尝试做什么。编码或任何东西都不起作用。 js 的副本位于 javascript 部分,但 js 在我的网站上外部使用,可以在 dynamic.js 的外部资源下的 html 中看到
    • 我看到您正在设置偏移量,然后您将图像位置设置为之前的位置,但随后图像移动了。这里有一个解释:当你在 KineticJS 中设置一个元素的 x 和 y 位置时,你设置了它的偏移位置。这意味着如果您更改此偏移量并希望图像保持在同一位置,则必须将偏移量添加到之前的位置。如果'中心'试试这个:group.setPosition({x:absolute.x + group.getOffsetX(), y:absolute.y + group.getOffsetY()});
    • 我已经在小提琴 jsfiddle.net/njPdr/5 中反映了您的更改,并且我对其进行了更新,因此现在可以在 javascript 部分进行编辑。我将您的代码添加到我的本地副本中,但它说绝对是未定义的,我从组中获得了 x 和 y 绝对坐标并使用了这些,但图像只是跳到舞台的左上角并且不再可拖动。
    猜你喜欢
    • 2014-10-28
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    相关资源
    最近更新 更多