2016-04-04 24 views

答えて

1
Here you can find solution : 
On this solution I had included corner size to avoid object placed out of canvas while dragging, scaling. 

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/

+0

感謝をキャンバス領域とクリップ領域を見ることができますが、私は矩形キャンバスの面積を取得getBoundingRectあなたに頼むが、私をこの画像で

クリップエリアは形ですので、このコードで形状を実装することが可能です – Rajiv

+0

こんにちはRajiv、あなたのサンプルのフィドルがありますか? – Mullainathan