Search code examples
javascripthtmlhtml5-canvasfabricjs

FabricJS: Always Center Object on Canvas


is it possible to ALWAYS center an object on a fabricjs canvas?

Background: I am building a webtool that makes it easy to create complex animations using fabricjs. I want to be able to set the canvas size to 100% for both width and height. Thus I want to place all my objects at the center and add an X/Y offset to it. When I resize the canvas later on I can readjust the objects from center using the x/y offset.

Is there such a build in function? Or should I simply add a property to the object and if the canvas is being resized - check all objects for that property and readjust the object's position from the new canvas' center?

Regards and Thanks Robert


Solution

  • Fabric objects have the following methods for centering:

    obj.center();  // Centers object vertically and horizontally on canvas to which is was added last
    obj.centerV(); // Centers object vertically on canvas to which it was added last
    obj.centerH(); // Centers object horizontally on canvas to which it was added last
    

    I don't see anything about offset in the docs.

    Something like the following would probably work

    var canvas = new fabric.Canvas('c');
    
    $(window).resize(function(){
    
         var w = $(window).width();
         var h = $(window).height();
         var center = {x:w / 2, y:h / 2);
    
         canvas.setDimensions({width:w,height:h});
         canvas.forEachObject(function(obj){
    
            obj.set({
                left : center.x + obj.offsetLeft,
                top : center.y + + obj.offsetTop,
            });
    
            obj.setCoords();
    
        });
    
    // need to call calcOffset whenever the canvas resizes
    canvas.calcOffset();
    canvas.renderAll();
    
    });