我一直在寻找很长一段时间,因为画布元素上的旋转矩形的绘制,擦除和重绘在Mac上的谷歌浏览器中不起作用。
我需要这个,因为我想在画布上渲染悬停叠加层。
我创建了一个代表我的代码的小提琴:link
HTML:
<canvas id="canvas" width="400" height="165" style="left: 0px; top: 0px; background-color:red;"></canvas>
Javascript:
var canvas =null;
var ctx;
var target;
$(function() {
canvas=document.getElementById('canvas');
ctx = canvas.getContext('2d');
target = { h:81, id:"i1_2", isempty:false, r:-11.64, w:60, x:143, y:19, zindex:2};
});
function drawRectangle() {
ctx.save();
ctx.translate(target.x, target.y);
ctx.fillStyle = "green";
ctx.strokeStyle = "blue";
ctx.globalAlpha = 0.40;
ctx.rotate(target.r / 180 * Math.PI); //NO Rotation => It works!
ctx.fillRect(0,0,target.w,target.h);
ctx.restore();
}
function clearRectangle() {
ctx.clearRect(0,0,400,165);
}
这适用于Windows和Mac上的所有浏览器,但Mac上的Chrome除外。
当我注释掉这行
时// ctx.rotate(angle);
在画布上绘制矩形。 (当然没有轮换)
我做错了什么吗?或者这可能是Chrome中的一个错误?
编辑:可能不是Chrome中的错误,因为此测试页在Mac上使用chrome:
http://www.html5canvastutorials.com/demos/advanced/html5_canvas_transform_rotate/
编辑2:我一直在对此进行更多研究,我发现此问题已记录:link
我带着测试小提琴,并使用旋转画布元素添加了一些测试:link 阅读那里的信息,当你在较小的画布上画画时,问题就会“解决”。
在这里看到我的小提琴的结果:
当我改变上面小提琴画布的大小时,使它们只小1像素。然后结果还可以。
最后的结论:似乎我可以画一次旋转的矩形。但是当我使用clearRect方法擦除画布时,我无法再次绘制矩形。仅当画布的大小足够大时才会发生这种情况。 (大于65600px)
你们有没有人知道这是一个解决方案所以我可以在Mac上使用chrome在画布上绘制和重绘矩形?
我对此感到疯狂。
答案 0 :(得分:1)
根据您所做的研究判断,您已经意识到这是一个浏览器错误,因此您无法自行修复它。但是,您可以通过使用彼此相邻的较小画布并使用不同的偏移绘制每个画布来解决问题,从而使形状的边缘对齐。
从代码的角度来看,这并不是很好,但在视觉上它看起来会一样,它应该可以解决这个问题。
我修改了你的小提琴来演示:http://jsfiddle.net/z8f2f/35/