我正在执行对2D画布的旋转,这在桌面上工作得非常好,但在移动端有一个小问题。下面是一个放大的截图:
缩略图图像在500毫秒内旋转约0.2弧度。我认为所有相关的代码都嵌入在下面。正如你所看到的,每个图像顶部角落留下了某种“痕迹”。
var duration = 500;
var start = 0;
var stop = 0.287554326;
var step = (stop - start) / 10;
var steps = (stop - start) / step;
var current = 0;
var delay = duration / steps;
var first = true;
if (navigator.userAgent.match(/iP(hone|[ao]d)|android/i)) step *= 1.5;
var rotate_int = setInterval(function() {
if (current >= stop) {
clearInterval(rotate_int);
callback && callback();
return;
}
ctx.clearRect(0, 0, cvs.width, cvs.height);
ctx.translate(cvs.width / 2, cvs.height / 2);
ctx.rotate(step);
current += step;
ctx.translate(cvs.width / -2, cvs.height / -2);
ctx.drawImage(i, 0, 0);
if (first) {
first = false;
thumb.hide();
}
}, delay);
注释:
- 该代码在桌面端表现非常好(最新版本的Firefox,Chrome,Safari,Opera甚至IE)
- 我已经测试了以下设备和浏览器:
- iPhone 3GS: Safari, Opera Mini
- iPhone 4S: Safari
- iPad (1st gen): Safari
- Android Galaxy S (with gingerbread): default browser, Firefox mobile
- Motorola Droid X (with gingerbread): default browser, Firefox mobile
- 我没有找到支持
<canvas>
的桌面浏览器会出现这种情况 - 我没有找到任何一个移动设备不会出现这种情况
- 发布的图片是从iPad放大的截图
- 如果有影响,
<canvas>
(旋转时)正在通过jQuery进行动画处理,以横跨其后面的图像并停止,这在截图中可见。 - 页面上还有第二个
<canvas>
。它使用相同的大拇指.png,并使用上面发布的相同代码旋转,并且也被动画处理以横跨不同的背景图像(但在相反的方向,即一个"赞"向西北移动,而另一个向东南移动),轨迹也出现在那里,相对于画布上下文的位置相同。
根据 @GGG 的另一条评论,我去编辑图片以添加一些透明数据,试图找到一个合适的解决方法。我看到的是该图片紧贴着画布的顶部和左侧边缘(这是“Photoshop 画布”的边缘,而不是“HTML5
<canvas>
”的边缘)。当我在顶部和左侧添加相等的透明数据填充时,条纹问题消失了。以下是原始 PSD 文件(未添加额外间距之前):
clearRect()
没有按预期工作?那不应该消除画布范围内的所有内容吗?如果是这样,为什么它会留下这几个像素?==编辑3==
经过一些研究,发现Cairo被几个主要的渲染引擎(至少是WebKit和Gecko)广泛使用。正如@JonasWielicki最初建议的那样,当Cairo库针对移动执行进行优化时,它是否有点过度热衷?