Преобразование (перемещение/масштабирование/поворот) фигур с помощью KineticJS

Я пытаюсь создать диспетчер преобразований для KineticJS, который будет создавать ограничивающую рамку и позволит пользователям масштабировать, перемещать и поворачивать изображение на своем холсте. Меня сбивает с толку логика якорных точек.

http://jsfiddle.net/mharrisn/whK2M/

Я просто хочу, чтобы пользователь мог пропорционально масштабировать свое изображение из любого угла, а также вращать его, удерживая и перетаскивая опорную точку.

Может ли кто-нибудь помочь мне в правильном направлении?

Спасибо!


person ChickensDontClap    schedule 06.09.2012    source источник
comment
Если вам нужны учебные пособия, перейдите сюда: html5canvastutorials.com/kineticjs ; Вы действительно хотите повернуть изображение, когда пользователь перетаскивает якорь (я думаю, один из синих квадратов в каждом углу)? выглядит запутанно, возможно, вам следует разрешить пользователю выбирать между контекстами преобразования/масштабирования/поворота (вы знаете блендер?)   -  person fableal    schedule 19.09.2012
comment
Глядя на эту скрипку, вы можете использовать пятый якорь, который будет управлять вращением, а четыре других якоря будут управлять масштабированием.   -  person SoluableNonagon    schedule 10.01.2013
comment
Вращение с помощью «dragstart», «dragend» и «dragmove» будет рассчитываться путем получения начальных и конечных/текущих точек положения мыши для расчета угла с учетом центра изображения. Это было бы похоже на добавление вашей фотографии в Microsoft Word или PowerPoint.   -  person SoluableNonagon    schedule 10.01.2013
comment
вы вообще обновили скрипку?   -  person SoluableNonagon    schedule 10.01.2013


Ответы (3)


Вот доказательство концепции ротационного управления, которое я сделал: http://codepen.io/ArtemGr/pen/ociAD

Пока элемент управления перетаскивается, функция dragBoundFunc используется для поворота содержимого рядом с ним:

controlGroup.setDragBoundFunc (function (pos) {
  var groupPos = group.getPosition()
  var rotation = degrees (angle (groupPos.x, groupPos.y, pos.x, pos.y))
  status.setText ('x: ' + pos.x + '; y: ' + pos.y + '; rotation: ' + rotation); layer.draw()
  group.setRotationDeg (rotation); layer.draw()
  return pos
})
person ArtemGr    schedule 22.02.2013

Я делаю то же самое, и я разместил вопрос, который почти одинаков, но я нашел ссылку, где у вас есть готовый инструмент изменения размера и перемещения. Так что я использовал то же самое. Однако он не содержит инструмента поворота, но это тоже может быть хорошим началом для вас, это очень просто и логично. Вот ссылка: http://www.html5canvastutorials.com/labs/html5-canvas-drag-and-drop-resize-and-invert-images/

Я также вернусь с инструментом вращения, если мне удастся заставить его работать идеально.

person Ervin    schedule 26.11.2013

Надеюсь, я еще не опоздал с публикацией этого фрагмента кода, который я сделал. У меня была такая же проблема с вами, ребята, занимающиеся такой задачей. Прошло 3 дня с тех пор, как я пробовал так много обходных путей, чтобы имитировать возможности фреймворка Fabricjs при работе с изображениями и объектами. Я мог бы использовать Fabricjs, но кажется, что Kineticjs более быстрый/последовательный для работы с html5.

К счастью, у нас уже есть плагин/инструмент, который мы могли бы легко реализовать вместе с kineticjs, и это инструмент преобразования jQuery. АВТОРУ ЭТОГО СУПЕР СПАСИБО! Просто найдите это в Google и скачайте.

Я надеюсь, что приведенный ниже код, который я создал, поможет многим разработчикам, которые рвут на себе волосы, чтобы решить такого рода задачи.

$(функция() {

    //Declare components STAGE, LAYER and TEXT
    var _stage = null;
    var _layer = null;
    var simpleText = null;
    _stage = new Kinetic.Stage({
        container: 'canvas',
        width: 640,
        height: 480
    });
    _layer = new Kinetic.Layer();

    simpleText = new Kinetic.Text({
            x: 60,
            y: 55,
            text: 'Simple Text',
            fontSize: 30,
            fontFamily: 'Calbiri',
            draggable: false,
            name:'objectInCanvas',
            id:'objectCanvas',
            fill: 'green' 
          });
     //ADD LAYER AND TEXT ON STAGE     
    _layer.add(simpleText);
    _stage.add(_layer);
    _stage.draw();

    //Add onclick event listener to the Stage to remove and add transform tool to the object 
    _stage.on('click', function(evt) {

        //Remove all objects' transform tool inside the stage 
        removeTransformToolSelection(); 

        // get the shape that was clicked on
        ishape = evt.targetNode;

        //Add and show again the transform tool to the selected object and update the stage layer
        $(ishape).transformTool('show');
        ishape.getParent().moveToTop();
        _layer.draw();

    });

    function removeTransformToolSelection(){
        //Search all objects inside the stage or layer who has the name of "objectInCanvas" using jQuery iterator and hide the transform tool. 
        $.each(_stage.find('.objectInCanvas'), function( i, child ) {
                $(child).transformTool('hide');
        });
    }

    //Event listener/Callback when selecting image using file upload element
    function handleFileSelect(evt) {

           //Remove all objects' transform tool inside the stage 
           removeTransformToolSelection(); 

           //Create image object for selected file
           var imageObj = new Image();
           imageObj.onload = function() {
                    var myImage = new Kinetic.Image({
                    x: 0,
                    y: 0,
                    image: imageObj,
                    name:'objectInCanvas',
                    draggable:false,
                    id:'id_'
             });
             //Add to layer and add transform tool
             _layer.add(myImage);
             $(myImage).transformTool();
             _layer.draw();

            }  

          //Adding source to Image object.
          var f = document.getElementById('files').files[0];
          var name = f.name;
          var url = window.URL;
          var src = url.createObjectURL(f);
          imageObj.src = src;
    }
    //Attach event listener to FILE element
    document.getElementById('files').addEventListener('change', handleFileSelect, false);

});
person Ryan Niño G. Dizon    schedule 06.02.2014
comment
ой, я забыл элемент HTML. ‹div id=canvas›‹/div› ‹тип ввода=идентификатор файла=имя файла=файлы[] несколько /› - person Ryan Niño G. Dizon; 06.02.2014
comment
какой существующий плагин? - person Sahar Ch.; 31.03.2014