Вы должны повторно инициализировать свой контекст globalCompositeOperation
до значения по умолчанию: source-over
.
Обратите внимание, что вам также может понадобиться сбросить матрицу преобразования контекста на ее значение по умолчанию, это можно сделать с помощью *Метод 1005 * и единичная матрица 1, 0, 0, 1, 0, 0
.
Единственное, что теперь может помешать правильной работе нашего clearRect, - это активное правило отсечения.Поэтому, когда вы используете clip()
, убедитесь, что вы всегда вызывали ctx.save()
до, а затем - ctx.restore()
после, чтобы отключить область отсечения (или вообще не использовать clip
).
const ctx = canvas.getContext('2d');
draw_btn.onclick = drawStuffs;
simpleclear_btn.onclick = brokenClear;
better_btn.onclick = betterClear;
drawStuffs();
function drawStuffs() {
ctx.fillStyle = 'rgba(0,34,123, .75)';
ctx.fillRect(0,0,45,45);
ctx.globalCompositeOperation = 'source-atop';
ctx.fillStyle = "red";
ctx.translate(25, 25);
ctx.fillRect(0,0,45,45);
}
function brokenClear() {
ctx.clearRect(0,0,canvas.width,canvas.height);
}
function betterClear() {
ctx.globalCompositeOperation = 'source-over';
ctx.setTransform(1,0,0,1,0,0);
ctx.clearRect(0,0,canvas.width,canvas.height);
}
<button id="draw_btn">draw stuff</button>
<button id="simpleclear_btn">simple clear (broken)</button>
<button id="better_btn">better clear</button>
<canvas id="canvas"></canvas>