다음 코드의 문제점을 알고있는 사람이 있습니까?Canvas putImageData iPad에서만 XOR 문제가 발생했습니다.
데모 : http://jsbin.com/xecicovi/1/
그것은 창에 벌금과 안드로이드 실행되지만 커서가 일관성 아이 패드에 약간의 흔적 라인을 남긴다. getImageData를 사용하고 비트 및 XOR을 사용하여 직사각형 커서 블록을 그리고 지우려면 putImageData를 사용하고 있습니다.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title> New Document </title>
<script src="jquery-1.11.0.js"></script>
<script language="javascript">
var m_ctx;
var m_canvas;
var m_bCursorOn = false;
var m_nXpos = 0;
function DrawCursor()
{
var nCellY = 10;
var nCellH = 24;
var nCellX = m_nXpos;
var nCellW = 13;
m_bCursorOn = !m_bCursorOn;
// XOR the cursor location image to draw/erase the cursor
var imgData = m_ctx.getImageData(nCellX, nCellY, nCellW, nCellH);
var data = imgData.data;
for(var i = 0; i < data.length; i += 4)
{
data[i] ^= 255;
data[i + 1] ^= 255;
data[i + 2] ^= 255;
}
m_ctx.putImageData(imgData, nCellX, nCellY);
}
function MoveCursor()
{
if (m_bCursorOn)
DrawCursor();
m_nXpos += 13;
if (m_nXpos >1000)
m_nXpos = 0;
DrawCursor();
}
window.onload = function()
{
m_canvas = $('#myCanvas')[0];
m_ctx = m_canvas.getContext("2d");
m_canvas.width = window.innerWidth;
m_canvas.height = window.innerHeight;
m_ctx.fillStyle = "black";
m_ctx.fillRect(0, 0, m_canvas.width, m_canvas.height);
setInterval(function(){ DrawCursor();}, 301); // cursor blink
setInterval(function(){ MoveCursor();}, 501);
};
</script>
</head>
<body >
<canvas id="myCanvas" width="800" height="600"></canvas>
</body>
</html>
잘 모르겠지만, 서브 픽셀 스무딩의 문제가 될 수 있다고 생각합니다. 기본적으로 사각형을 원형 숫자로 그립니다.하지만 여기서는 반으로, 반은 그려야 할 브라우저를 의미합니다. 그 approximations 뒤에 떠나는 오래된 커서를 삭제합니다. .5 숫자 (예 : 200.5, 157.5, ...)로 정사각형을 그려보고 해결하는지 확인하십시오. –
조나스에게 신속한 답변을 해주십시오. 그러나 서브 픽셀 스무딩 (sub-pixel smoothing)이 있다면 다른 방법이 될 것이라고 생각합니다. 내 말은 정수를 지정하면 특정 픽셀이어야한다는 뜻입니다. 당신이 말하는 것을 할 필요가있는 10 진수를 지정했을 때만, 맞습니까? –
캔버스 요소에서 이런 식으로 작동하지 않습니다. –