Thông thường vị trí của đối tượng liên quan đến canvas có thể được lấy từ các thuộc tính .left
và .top
của chúng, nhưng chúng trở nên tương đối so với nhóm nếu đối tượng nằm trong một nhóm/lựa chọn. Có cách nào để có được vị trí của họ liên quan đến canvas không?Làm thế nào để có được vị trí tương đối canvas của một đối tượng trong một nhóm?
Trả lời
Khi một đối tượng là bên trong một nhóm, tọa độ của nó tương đối so với vải sẽ phụ thuộc vào nguồn gốc của nhóm (và nguồn gốc của đối tượng là tốt).
Cho phép nói rằng chúng tôi có mã này có hình tròn và hình tròn được thêm vào một nhóm.
var canvas = new fabric.Canvas(document.getElementById('c'));
var rect = new fabric.Rect({
width: 100,
height: 100,
left: 50,
top: 50,
fill: 'rgba(255,0,0,0.5)'
});
var circle = new fabric.Circle({
radius: 50,
left: 175,
top: 75,
fill: '#aac'
});
var group = new fabric.Group([rect, circle],{
originX: 'center',
originY: 'center'
});
canvas.add(group);
canvas.renderAll();
Dưới đây là ba trường hợp có thể căn giữa đối tượng nhóm:
xứ của nhóm thiết đến trung tâm (như trong đoạn code trên):
Như thể hiện trong hình bên dưới,
rect.left
cho chúng ta khoảng cách trái của đối tượng từ trung tâm của nhóm.rect.group.left
cho chúng ta khoảng cách giữa nhóm từ bên trái của canvas.Vì vậy, khoảng cách của rect từ bên trái của vải =
rect.left + rect.group.left
(http://jsfiddle.net/uue3hcj6/3/)xứ của nhóm được thiết lập để đầu/trái (cũng là thiết lập mặc định)
rect.left
cho chúng ta khoảng cách bên trái của đối tượng từ trung tâm của nhóm.rect.group.left
cho chúng ta khoảng cách bên trái của nhóm từ bên trái của canvas. Bây giờ để tính toán khoảng cách còn lại, chúng ta phải thêm một nửa chiều rộng của nhóm.Vì vậy, khoảng cách của rect từ bên trái của vải =
rect.left + rect.group.left
+rect.group.width/2
(http://jsfiddle.net/uue3hcj6/6/)xứ của nhóm được thiết lập để dưới/phải
rect.left
cho chúng ta khoảng cách bên trái của đối tượng từ trung tâm của nhóm.rect.group.left
cho chúng ta khoảng cách bên phải của nhóm từ bên trái của canvas. Bây giờ để tính tổng khoảng cách, chúng ta phải trừ đi một nửa chiều rộng của nhóm.Vì vậy, khoảng cách của rect từ bên trái của vải =
rect.left + rect.group.left
-rect.group.width/2
(http://jsfiddle.net/uue3hcj6/7/)
Lưu ý: trường hợp tương tự có thể xảy ra cho đối tượng là tốt.
Tuyệt vời, cảm ơn @SwapnilJain –
Cuối cùng, ai đó đã giải thích tất cả "ma thuật" của fabricjs, cảm ơn. – Kath
Tôi không hiểu điều gì đó. Trong ví dụ đầu tiên của bạn nếu chúng ta thay đổi bên trái của vòng tròn, ví dụ, và thêm góc vào nhóm, vị trí của hình chữ nhật cũng thay đổi! Tôi đang cố gắng sửa tất cả các đối tượng bên trong nhóm và xoay nhóm xung quanh tâm của nó, nhưng vì một lý do nào đó tất cả các đối tượng chuyển động không cố định và tôi không thể hiểu tại sao. – Kath
Giải pháp là tính đến chiều rộng nhóm. Các object.left
là liên quan đến trung tâm của nhóm, không nó trái phía, vì vậy chúng ta hãy group.width/2
:
var canvas = new fabric.Canvas(document.getElementById('c'));
var rect = new fabric.Rect({
width: 100,
height: 100,
left: 50,
top: 50,
fill: 'rgba(255,0,0,0.5)'
});
var circle = new fabric.Circle({
radius: 50,
left: 150,
top: 75,
fill: '#aac'
});
canvas.add(rect);
canvas.add(circle);
canvas.renderAll();
function getPOS(){
var group = canvas.getActiveGroup();
if (group == null) {
var pos = rect.left;
}
else {
var pos = rect.group.left + rect.group.width/2 + rect.left;
}
alert("Position of rect from left:"+pos);
}
Đã phải giải quyết vấn đề này với cách tiếp cận khác ... Tôi đã phải tìm hình ảnh trong dữ liệu canvas JSON, do đó, mã của tôi là:
let findItemByType = function(source, type, rX, rY)
{
rX = rX ? rX : 0;
rY = rY ? rY : 0;
let objs = [];
source.forEach(function(item){
if (item.type === type){
item.rX = rX + item.left;
item.rY = rY + item.top;
objs.push(item);
}
else {
if (item.objects)
{
item.rX = rX;
item.rY = rY;
let subresult = findItemByType(item.objects,
type,
item.rX + item.left + item.width/2,
item.rY + item.top + item.height/2);
if (subresult){
objs = objs.concat(subresult);
}
}
}
});
return objs;
}
let images = findItemByType(canvas.toJSON().objects, "image", 0, 0);
Mã này nên mang theo một mảng của tất cả các đối tượng hình ảnh và họ nên có thuộc tính rX và rY là vị trí tương đối của hình ảnh.
- 1. Làm thế nào để có được vị trí tuyệt đối của một đỉnh trong ba.js?
- 2. Làm thế nào để trao đổi vị trí của hai đối tượng trong một ArrayList?
- 3. Làm thế nào để có được vị trí toàn cầu/thế giới của một đối tượng con?
- 4. Làm thế nào để có được vị trí của một trận đấu Regex trong một chuỗi?
- 5. Tọa độ của đối tượng được nhấp tương ứng với cùng một đối tượng được nhấp
- 6. Định vị tuyệt đối bên trong vị trí tương đối?
- 7. làm thế nào để có được vị trí tuyệt đối của một tiêu đề phần trong tableview?
- 8. sắp xếp một mảng theo vị trí tương đối
- 9. jquery: tôi có thể animate vị trí: tuyệt đối với vị trí: tương đối không?
- 10. Làm thế nào để có được vị trí màn hình của một yếu tố Swing?
- 11. firefox vị trí tuyệt đối bên trong một vấn đề chứa tương đối
- 12. Làm cách nào để sử dụng mô-đun Perl từ một vị trí tương đối?
- 13. Làm thế nào để tạo một mảng ô của k đối tượng tương tự trong Matlab?
- 14. .NET: Làm thế nào để bạn có được kiểu của một đối tượng null?
- 15. Làm thế nào để sắp xếp một mảng các đối tượng bằng một thuộc tính của các đối tượng?
- 16. Trong một makefile, làm thế nào để có được đường dẫn tương đối từ một đường dẫn tuyệt đối khác?
- 17. Làm thế nào để nhóm một mảng đối tượng javascript bởi nhiều thuộc tính của nó?
- 18. Sử dụng convertPoint để lấy vị trí tương đối bên trong một phụ huynh UIView
- 19. Làm thế nào để cà ri một đối số ... theo vị trí trong R?
- 20. Có cách nào trong Box2dWeb xuất vị trí.x của một đối tượng đến console.log() không?
- 21. Làm thế nào để có được số lượng các nhóm trong một đối tượng groupby trong gấu trúc?
- 22. làm thế nào để có được iterator đến một vị trí đặc biệt của một vector
- 23. HTML5 Xóa đối tượng được vẽ trước đó trong canvas
- 24. Làm thế nào để vượt qua một đối tượng duy nhất [] để một đối tượng params []
- 25. Làm thế nào để bạn nhận hoặc tạo URL cho đối tượng trong một nhóm?
- 26. Làm thế nào để biết một đối tượng là một đối tượng RegExp?
- 27. Làm thế nào để nhóm nhiều đối tượng cho mục đích quay chúng như một đơn vị?
- 28. Căn chỉnh với vị trí tương đối và tuyệt đối
- 29. Vị trí của tiêu đề trục trong ggplot, vị trí tương đối?
- 30. Làm thế nào để có được một đối tượng đã được thay đổi trong angularjs?
Đây có phải là những gì bạn đang tìm kiếm không? http://jsfiddle.net/uue3hcj6/3/ Như bạn đã nói chúng trở nên tương đối so với nhóm, bạn có thể sử dụng trái và trên của nhóm để tìm vị trí tuyệt đối trên canvas. –
Điều này dường như không hoạt động với các lựa chọn: http://jsfiddle.net/uue3hcj6/4/ –
@SwapnilJain Bạn có biết tại sao các giá trị trong giá trị thứ hai không hoạt động? –