Move object within canvas boundary limit

前端 未结 6 1632
野性不改
野性不改 2020-12-08 00:58

I am trying to limit the moving object within the canvas but i am getting some difficulty to moving object with limit area on top and left side and when i scale the object w

6条回答
  •  青春惊慌失措
    2020-12-08 01:46

    Here you can find solution:-

    var canvas = window._canvas = new fabric.Canvas('c');
    canvas.selection = false;
    
    fabric.Object.prototype.set({
        transparentCorners: false,
        cornerColor: 'red',
        cornerSize: 12,
        padding: 0
    });
    text = new fabric.Text('Sample',{
        top: canvas.height/2,
        left: canvas.width/2,
        fill: '#000000'
    });
    
    canvas.add(text);
    canvas.setActiveObject(text);
    
    canvas.observe('object:scaling', function (e) {
        var obj = e.target;
      if(obj.getHeight() > obj.canvas.height || obj.getWidth() > obj.canvas.width){
        obj.setScaleY(obj.originalState.scaleY);
        obj.setScaleX(obj.originalState.scaleX);        
      }
      obj.setCoords();
      if(obj.getBoundingRect().top - (obj.cornerSize / 2) < 0 || 
         obj.getBoundingRect().left -  (obj.cornerSize / 2) < 0) {
        obj.top = Math.max(obj.top, obj.top-obj.getBoundingRect().top + (obj.cornerSize / 2));
        obj.left = Math.max(obj.left, obj.left-obj.getBoundingRect().left + (obj.cornerSize / 2));    
      }
      if(obj.getBoundingRect().top+obj.getBoundingRect().height + obj.cornerSize  > obj.canvas.height || obj.getBoundingRect().left+obj.getBoundingRect().width + obj.cornerSize  > obj.canvas.width) {
    
        obj.top = Math.min(obj.top, obj.canvas.height-obj.getBoundingRect().height+obj.top-obj.getBoundingRect().top - obj.cornerSize / 2);
        obj.left = Math.min(obj.left, obj.canvas.width-obj.getBoundingRect().width+obj.left-obj.getBoundingRect().left - obj.cornerSize /2);    
      }
    });
    
    canvas.observe('object:moving', function (e) {
        var obj = e.target;
      if(obj.getHeight() > obj.canvas.height || obj.getWidth() > obj.canvas.width){
        obj.setScaleY(obj.originalState.scaleY);
        obj.setScaleX(obj.originalState.scaleX);        
      }
      obj.setCoords();
      if(obj.getBoundingRect().top - (obj.cornerSize / 2) < 0 || 
         obj.getBoundingRect().left -  (obj.cornerSize / 2) < 0) {
        obj.top = Math.max(obj.top, obj.top-obj.getBoundingRect().top + (obj.cornerSize / 2));
        obj.left = Math.max(obj.left, obj.left-obj.getBoundingRect().left + (obj.cornerSize / 2));    
      }
      if(obj.getBoundingRect().top+obj.getBoundingRect().height + obj.cornerSize  > obj.canvas.height || obj.getBoundingRect().left+obj.getBoundingRect().width + obj.cornerSize  > obj.canvas.width) {
    
        obj.top = Math.min(obj.top, obj.canvas.height-obj.getBoundingRect().height+obj.top-obj.getBoundingRect().top - obj.cornerSize / 2);
        obj.left = Math.min(obj.left, obj.canvas.width-obj.getBoundingRect().width+obj.left-obj.getBoundingRect().left - obj.cornerSize /2);    
      }
    });
    

    http://jsfiddle.net/jw1827fm/1/

提交回复
热议问题