最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Fabric js moving image with keyboard - Stack Overflow

programmeradmin1浏览0评论

Im creating simple tool with fabric.js and I need to add functionality to move object with keyboard.And I'm stuck.For the moment i log in to the console the keyboard events,so I know it works.but I don't know how to add this fucntionality to my canvas image.And help?

$(function(){
    var canvas = new fabric.Canvas('imageCanvas', {
        backgroundColor: 'rgba(255, 255, 255, 0)'
    });
    var imageLoader = document.getElementById('imageLoader');
    imageLoader.addEventListener('change', handleImage, false);

    function handleImage(e) {
        var reader = new FileReader();
        reader.onload = function (event) {
            var img = new Image();
            img.onload = function () {
                var imgInstance = new fabric.Image(img, {

                })
                canvas.add(imgInstance);
            }
            img.src = event.target.result;

        }
        reader.readAsDataURL(e.target.files[0]);
    }

    canvas.on('mouse:down', function(options) {
      console.log(options.e.clientX, options.e.clientY);
    });

    var canvasWrapper = document.getElementById('canvasWrapper');
    canvasWrapper.tabIndex = 1000;
    canvasWrapper.addEventListener("keydown", doKeyDown, false);

    function doKeyDown(e) {
        document.onkeydown = function(e) {
            switch (e.keyCode) {
                case 38:  /* Up arrow was pressed */
                    console.log('up works')
                  break;
                case 40:  /* Down arrow was pressed */
                    console.log('down works')
                  break;
                case 37:  /* Left arrow was pressed */
                    console.log('left works')
                  break;
                case 39:  /* Right arrow was pressed */
                   console.log('right works')
                  break;
              }
        }
    }

    var imageSaver = document.getElementById('imageSaver');
    imageSaver.addEventListener('click', imageBorder, false);
    imageSaver.addEventListener('click', saveImage, false);

    function imageBorder(e) {
        canvas.item(0).hasControls = canvas.item(0).hasBorders = false;
    }

    function saveImage(e) {
        this.href = canvas.toDataURL({
            format: 'png',
            quality: 1
        });
        this.download = 'test.png'
        if(saveImage) {
            location.reload();
        }else {
            alert('somtehing went wrong')
        }
    }

});

Im creating simple tool with fabric.js and I need to add functionality to move object with keyboard.And I'm stuck.For the moment i log in to the console the keyboard events,so I know it works.but I don't know how to add this fucntionality to my canvas image.And help?

$(function(){
    var canvas = new fabric.Canvas('imageCanvas', {
        backgroundColor: 'rgba(255, 255, 255, 0)'
    });
    var imageLoader = document.getElementById('imageLoader');
    imageLoader.addEventListener('change', handleImage, false);

    function handleImage(e) {
        var reader = new FileReader();
        reader.onload = function (event) {
            var img = new Image();
            img.onload = function () {
                var imgInstance = new fabric.Image(img, {

                })
                canvas.add(imgInstance);
            }
            img.src = event.target.result;

        }
        reader.readAsDataURL(e.target.files[0]);
    }

    canvas.on('mouse:down', function(options) {
      console.log(options.e.clientX, options.e.clientY);
    });

    var canvasWrapper = document.getElementById('canvasWrapper');
    canvasWrapper.tabIndex = 1000;
    canvasWrapper.addEventListener("keydown", doKeyDown, false);

    function doKeyDown(e) {
        document.onkeydown = function(e) {
            switch (e.keyCode) {
                case 38:  /* Up arrow was pressed */
                    console.log('up works')
                  break;
                case 40:  /* Down arrow was pressed */
                    console.log('down works')
                  break;
                case 37:  /* Left arrow was pressed */
                    console.log('left works')
                  break;
                case 39:  /* Right arrow was pressed */
                   console.log('right works')
                  break;
              }
        }
    }

    var imageSaver = document.getElementById('imageSaver');
    imageSaver.addEventListener('click', imageBorder, false);
    imageSaver.addEventListener('click', saveImage, false);

    function imageBorder(e) {
        canvas.item(0).hasControls = canvas.item(0).hasBorders = false;
    }

    function saveImage(e) {
        this.href = canvas.toDataURL({
            format: 'png',
            quality: 1
        });
        this.download = 'test.png'
        if(saveImage) {
            location.reload();
        }else {
            alert('somtehing went wrong')
        }
    }

});
Share Improve this question edited Mar 5, 2016 at 13:16 Haseeb 2,2341 gold badge22 silver badges43 bronze badges asked Jul 14, 2014 at 9:07 burakukulaburakukula 892 silver badges9 bronze badges
Add a comment  | 

2 Answers 2

Reset to default 11

Try for example on case 39:

canvas.getActiveObject().left += 5;

And then maybe canvas.renderAll()

Here is my working code:

HTML:

<div id="canvas-wrapper">
     <canvas id="c" width="900" height="600"></canvas>
</div>

JS:

var processKeys = function (evt) {
    evt = evt || window.event;

    var movementDelta = 2;

    var activeObject = canvas.getActiveObject();
    var activeGroup = canvas.getActiveGroup();

    if (evt.keyCode === 37) {
        evt.preventDefault(); // Prevent the default action
        if (activeObject) {
            var a = activeObject.get('left') - movementDelta;
            activeObject.set('left', a);
        }
        else if (activeGroup) {
            var a = activeGroup.get('left') - movementDelta;
            activeGroup.set('left', a);
        }

    } else if (evt.keyCode === 39) {
        evt.preventDefault(); // Prevent the default action
        if (activeObject) {
            var a = activeObject.get('left') + movementDelta;
            activeObject.set('left', a);
        }
        else if (activeGroup) {
            var a = activeGroup.get('left') + movementDelta;
            activeGroup.set('left', a);
        }

    } else if (evt.keyCode === 38) {
        evt.preventDefault(); // Prevent the default action
        if (activeObject) {
            var a = activeObject.get('top') - movementDelta;
            activeObject.set('top', a);
        }
        else if (activeGroup) {
            var a = activeGroup.get('top') - movementDelta;
            activeGroup.set('top', a);
        }

    } else if (evt.keyCode === 40) {
        evt.preventDefault(); // Prevent the default action
        if (activeObject) {
            var a = activeObject.get('top') + movementDelta;
            activeObject.set('top', a);
        }
        else if (activeGroup) {
            var a = activeGroup.get('top') + movementDelta;
            activeGroup.set('top', a);
        }
    }

    if (activeObject) {
        activeObject.setCoords();
        canvas.renderAll();
    } else if (activeGroup) {
        activeGroup.setCoords();
        canvas.renderAll();
    }
};

var canvasWrapper = document.getElementById('canvas-wrapper');
canvasWrapper.tabIndex = 1000;
canvasWrapper.addEventListener("keydown", processKeys, false);
canvasWrapper.style.outline = "none";  // remove the blue halo around canvas-wrapper
发布评论

评论列表(0)

  1. 暂无评论