Drag and zoom text with Kineticjs

风流意气都作罢 提交于 2019-12-24 19:14:41

问题


I am trying to zoom and pan a text which is draggable already. All the examples are on images or shapes and it seems I cannot adapt it to a text object. My questions are:

  1. Do I have to use the anchors or is any simpler way zoom a text with Kineticjs?

  2. I found an example regarding zooming a shape and the code crashes here:

      var layer = new Kinetic.Layer({
         drawFunc : drawTriangle  //drawTriangle is a function defined already
      });
    

Can we call a function while we are creating a layer? I usually create a layer and then add the outcome of the function in it. Any idea would be great, thanks.


回答1:


I thought of many ways you could do this but this is the one I ended up implementing: jsfiddle

Basically, you have an anchor (which doesn't always have to be there, you can hide and show it if you would like. Let me know if you need help with that) and if you drag the anchor down it increases the fontSize, and if you drag the anchor up it decreases the fontSize.

I followed the exact same anchor tutorial but instead I added a dragBoundFunc to limit dragging to the Y-axis:

var anchor = new Kinetic.Circle({
    x: x,
    y: y,
    stroke: '#666',
    fill: '#ddd',
    strokeWidth: 2,
    radius: 8,
    name: name,
    draggable: true,
    dragOnTop: false,
    dragBoundFunc: function (pos) {
        return {
            x: this.getAbsolutePosition().x,
            y: pos.y
        };
    }
});

And then I updated the updateAnchor() function to only detect the single anchor I added to the group named sizeAnchor:

var mY = 0;

function update(activeAnchor, event) {
  var group = activeAnchor.getParent();
  var sizeAnchor = group.get('.sizeAnchor')[0];
  var text = group.get('.text')[0];

  if (event.pageY < mY) {
    text.setFontSize(text.getFontSize()-1);
  } else {
    text.setFontSize(text.getFontSize()+1);
  }

  sizeAnchor.setPosition(-10, 0);

  mY = event.pageY;
}

Basically mY is used compared to the e.PageY to see if the mouse is moving up or down. Once we can determine the mouse direction, then we can decide if we should increase or decrease the fontSize!

Alternatively, you can use the mousewheel to do the exact same thing! I didn't implement it myself but it's definitely doable. Something like:

  1. Mousewheel down and the fontSize decreases
  2. Mousewheel up and the fontSize increases

Hopefully this emulates "Zooming" a text for you. And I guess being able to drag the text acts as "panning" right?

UPDATE (based on comment below)

This is how you would limit dragging to the Y-Axis using dragBoundFunc:

var textGroup = new Kinetic.Group({
    x: 100,
    y: 100,
    draggable: true,
    dragBoundFunc: function (pos) {
        return {
            x: this.getAbsolutePosition().x,
            y: pos.y
        };
    }
});

See the updated jsfiddle (same jsfiddle as above)



来源:https://stackoverflow.com/questions/17545365/drag-and-zoom-text-with-kineticjs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!