我正在尝试使用Fabricjs在图像上绘制椭圆,用户也可以放大/缩小并绘制进一步保存到服务器以便在Android应用中看到。
但是我无法将正确的坐标保存到服务器。
假设用户放大到某种程度,比如scaleX @ 1.5并在图像上绘制一个椭圆,然后尝试保存。
如何根据图像@ scaleX为1.0获取椭圆的左侧和顶部,因为Android遵循它们的宽高比并始终将1.0视为良好的比例值,并且可以轻松地绘制与1.0相关的坐标Android,而scaleX@1.5完全扰乱了椭圆的位置。
这是Fiddle,您可以放大/缩小以在画布下查看日志(坐标)作为HTML内容。 您可以使用鼠标自由绘制椭圆(缩放以查看更改的日志)。
代码:
//Please check Fiddle
答案 0 :(得分:2)
http://jsfiddle.net/h2zvj3un/28/
不要尝试编写自己的缩放功能,您正在使用的库已经有一个,并允许您使用普通坐标而不使用任何缩放因子。
function _zoom(e, dragDelta) {
var evt=window.event || e;
var delta = (dragDelta == undefined) ? evt.detail? evt.detail*(-120) : evt.wheelDelta : dragDelta;
var curZoom = canvas.getZoom(), newZoom = curZoom - delta / 400,
x = e.offsetX, y = e.offsetY;
var objects = canvas.getObjects();
//applying zoom values.
canvas.zoomToPoint({ x: x, y: y }, newZoom);
var ellipse = objects[1];
var image = objects[0];
var ix = image.left;
var iy = image.top;
var ex = ellipse.left;
var ey = ellipse.top;
document.getElementById("logs").innerHTML = "Circle Left : " + ex + "<br/>" + "Circle Top : " + ey + "<br/>Image Left : " + ix + "<br/>" + "Image Top : " + iy + "<br/> Image ScaleX : " + image.scaleX + "<br/>Circle ScaleX" + ellipse.scaleX + "<br/> Expected data coordinates to be sent to server is (last left - new left/new scale, last top - last top/new scale) -> (" + (ex - ix) + ", " + (ey - iy) + ")";
canvas.renderAll();
e.preventDefault();
return false;
}
使用canvas.zoomToPoint,您可以随意缩放,而不必担心更改对象的坐标和比例因子。