2013-04-16 21 views
6

Gurus,bounding box ngoại hình - điều khiển tùy biến với fabricjs

Tôi muốn biết có cách nào để thay đổi biểu tượng hộp bounding, tôi đọc mã nguồn trong fabric.js, nó tạo ra hộp vuông cho hộp bounding, nhưng Tôi muốn thay đổi nó thành vòng tròn hoặc thay đổi để apearence tùy chỉnh của tôi. bạn có thể tư vấn cho tôi không?

Cảm ơn rất nhiều!

Lindy

+0

tôi biết điều này câu hỏi là rất cũ và có lẽ ngoài tầm quan tâm của bạn bây giờ, nhưng xin vui lòng có được một cái nhìn và phê duyệt nó để người dùng khác có thể hưởng lợi từ điều này – AndreaBogazzi

Trả lời

4

Kiểm tra các ví dụ:

http://fabricjs.com/customization/

Ví dụ 2:

var canvas = new fabric.Canvas('c3'); 
    canvas.add(new fabric.Circle({ radius: 30, fill: '#f55', top: 100, left: 100 })); 

    canvas.item(0).set({ 
    borderColor: 'red', 
    cornerColor: 'green', 
    cornerSize: 6, 
    transparentCorners: false 
    }); 
    canvas.setActiveObject(canvas.item(0)); 
+0

Xin lỗi, đây không phải là câu trả lời cho câu hỏi của tôi. – Lindy

+0

Tôi cần tùy chỉnh 9 hộp nhỏ của hộp giới hạn, tôi muốn vòng tròn thay vì hình vuông nhỏ – Lindy

+2

Không, không có hỗ trợ tích hợp để thay đổi hình dạng của điều khiển đối tượng tại thời điểm này. Bạn có thể có thể hack thứ gì đó lên hàng đầu. – kangax

7

Cách nhanh nhất để tùy chỉnh các điều khiển là viết _drawControl chức năng riêng của bạn và làm cho nó tương thích với fabricjs tiêu chuẩn để ghi đè lên nó. Hãy nhớ rằng chức năng này được gọi là 9 lần cho mỗi lần render, vì vậy hãy cố gắng ở mức thấp với mã và bản vẽ. Ngoài ra, nếu bạn sửa đổi ngữ cảnh (ctx), hãy nhớ sử dụng .save.restore để không làm lộn xộn đường dẫn dựng hình.

FabricJs sẽ gọi hàm với topleft sẵn sàng cho một hình chữ nhật, vì vậy góc sẽ có mặt tại top + size/2left + size/2, trong đó kích thước là this.cornerSize

function newControls(control, ctx, methodName, left, top) { 
    if (!this.isControlVisible(control)) { 
     return; 
     } 
     var size = this.cornerSize; 
     isVML() || this.transparentCorners || ctx.clearRect(left, top, size, size); 
     ctx.arc(left + size/2, top + size/2, size/2, 0, 2 * Math.PI, false); 
     ctx.stroke(); 
} 

fabric.Object.prototype._drawControl = newControls; 

function newControls(control, ctx, methodName, left, top) { 
 
    if (!this.isControlVisible(control)) { 
 
     return; 
 
     } 
 
     var size = this.cornerSize; 
 
     this.transparentCorners || ctx.clearRect(left, top, size, size); 
 
     ctx.beginPath(); 
 
     ctx.arc(left + size/2, top + size/2, size/2, 0, 2 * Math.PI, false); 
 
     ctx.stroke(); 
 
} 
 

 
fabric.Object.prototype._drawControl = newControls; 
 
fabric.Object.prototype.cornerSize = 15; 
 
var canvas = new fabric.Canvas('c'); 
 

 

 
canvas.add(new fabric.Rect({width:100, height:100, top:50, left:50})); 
 
canvas.setActiveObject(canvas.getObjects()[0]);
<script type ="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js"></script> 
 
<canvas id="c" width="400" height="400" style="border:1px solid #ccc"></canvas>

+0

Đây phải là câu trả lời được chấp nhận – Horacio

+0

Tôi đã phát hiện ra sự cố. Có thể được thực hiện của tôi, nhưng các góc tròn được bên trong một hộp, tôi đoán góc ban đầu. Có cách nào để ngăn chặn điều đó không? mẫu: https://jsfiddle.net/hello_world/gxbhjyzg/7/ Cảm ơn! Lý tưởng nhất sẽ chỉ là một vòng tròn (cùng màu tô và viền) – Horacio

+0

Bạn không nên xóa hộp vẽ (clearRect) beforw. Nếu bạn muốn vòng tròn màu trắng, làm đột quỵ và điền vào. điền với màu trắng. – AndreaBogazzi

Các vấn đề liên quan