javascriptdrag-and-dropresizeeaseljs

Resize a draggable fill with EaselJS


I've got a project where I'm using EaselJS to create a fill (rectangle) and text over it inside a container. My objective is to make this rectangle and text draggable to move it over the canvas. This is already done and working well.

My problem is when I try to resize the rectangle using scaleX and scaleY using a onMouseOver handler. This is indeed done, BUT the rectangle just moves away from it's initial point to some other location.

I've read I need to use the regX and regY properties to override this, but in the context of my code I just can't. What am I doing wrong?

Here's my Javascript code:

(function(){
    var stage, myCanvas;
    var update = true;
 
    this.init = function() {
        myCanvas = document.getElementById("stageCanvas");
        stage = new createjs.Stage(myCanvas);
        stage.enableMouseOver();
        stage.mouseEnabled = true;
        stage.mouseMoveOutside = true;
        
        // Reference Shape
        var rectFijo0 = new createjs.Shape();
        rectFijo0.graphics.beginFill("#DCD8D4").rect(140,160,78,35);
        stage.addChild(rectFijo0);
        
        // Shape
        var rectOpt0 = new createjs.Shape();
        rectOpt0.graphics.beginFill("#C51A76").rect(140,160,78,35);
        
        txtOpt0 = new createjs.Text("TEST","bold 20px","#FFF");
        txtOpt0.textAlign ="center";
        txtOpt0.x = 50;
        txtOpt0.y = 50;
        
        // Container
        var containerOpt0= new createjs.Container();
        containerOpt0.mouseEnabled = true;
        //#######
        // Probably here is my problem. I don't understand why if I use regX and regY the rectangle moves the lower right corner to the center, instead of just using this point as a registration point. Why? What I am not understanding?
        //containerOpt0.regX = 78/2;
        //containerOpt0.regY = 35/2;
        //#######
        containerOpt0.onPress = pressHandler;
        containerOpt0.onMouseOver = mouseOverHandler;
        containerOpt0.addChild(rectOpt0, txtOpt0);
        
        stage.addChild(containerOpt0);
        stage.update();
        createjs.Ticker.setFPS(60);
        createjs.Ticker.addEventListener("tick", tick);
    }
    
    function pressHandler(e){
    // onPress Handler to drag
        var offset = {x:e.target.x-e.stageX, y:e.target.y-e.stageY};
        e.onMouseMove = function(ev) {
            e.target.x = ev.stageX+offset.x;
            e.target.y = ev.stageY+offset.y;
            update = true;
        }
    }
    
    function mouseOverHandler(e){
        e.target.scaleX = .5;
        e.target.scaleY = .5;
        update = true;
    }
    
    function tick() {
    if (update) {
            update = false;
            stage.update();
        }
    }

    window.onload = init();
}());

Here's my JS Fiddle example so you can see exactly what's going on. Just drag the mouse over the rectangle to see what I mean. It must be something easy to achieve but I'm not certain how.


Solution

  • You issue is, that you are drawing your rects not at 0|0, the "standard" way is to draw your shape starting at 0|0 and then position the shape itself somewhere through .x and .y

    rectOpt0.graphics.beginFill("#C51A76").rect(140,160,78,35);
    => changed to
    rectOpt0.graphics.beginFill("#C51A76").rect(0,0,78,35);
    

    and additionally I then placed the container at 140|160 + the regX/Y offset:

    containerOpt0.regX = 78/2; //regX/Y to have is scale to the center point
    containerOpt0.regY = 35/2;
    containerOpt0.x = 140 + 78/2;  //placement + regX offset/correction
    containerOpt0.y = 160 + 35/2;
    

    here's the updated fiddle: http://jsfiddle.net/WfMGr/2/