Ctx2d.strokeStyle = '#00cc00'; Ctx2d.lineWidth = 5; Ctx2d.rect(40, 20, 100, 80); Ctx2d.fillStyle = 'blue'; Ctx2d.fill(); Ctx2d.beginPath() Ctx2d.arc(40, 20, 15, 0, 2 * Math.PI, false); Ctx2d.stroke(); Ctx2d.beginPath(); Ctx2d.arc(40, 100, 15, 0, 2 * Math.PI, false); Ctx2d.stroke(); Ctx2d.beginPath(); Ctx2d.arc(150, 60, 36, 0, 2 * Math.PI, false); Ctx2d.stroke(); |
clip()
des Zeichenkontextes sorgt dafür, dass der Pfad, zu dem
clip()
gehört, die Maske bildet (clip region).
Wir setzen clip()
an das Ende des ersten Pfads.
Ctx2d.strokeStyle = '#00cc00'; Ctx2d.lineWidth = 5; Ctx2d.rect(40, 20, 100, 80); Ctx2d.fillStyle = 'blue'; Ctx2d.fill(); Ctx2d.clip(); Ctx2d.beginPath() Ctx2d.arc(40, 20, 15, 0, 2 * Math.PI, false); Ctx2d.stroke(); Ctx2d.beginPath(); Ctx2d.arc(40, 100, 15, 0, 2 * Math.PI, false); Ctx2d.stroke(); Ctx2d.beginPath(); Ctx2d.arc(150, 60, 36, 0, 2 * Math.PI, false); Ctx2d.stroke(); |
normalweiterzeichnen wollen, also auch außerhalb des Clip-Bereichs? Leider gibt es eine Methode wie
unclip()nicht, aber es gibt eine Lösung.
save()
speichert fast alle Einstellungen des Zeichenkontextes. An späterer Stelle kann man mit restore()
die Einstellungen zurückholen. save()
an einer Stelle, an der es noch keine Clip-Region gab.
Ctx2d.strokeStyle = '#00cc00'; Ctx2d.lineWidth = 5; Ctx2d.save(); Ctx2d.rect(40, 20, 100, 80); Ctx2d.fillStyle = 'blue'; Ctx2d.fill(); Ctx2d.clip(); Ctx2d.beginPath() Ctx2d.arc(40, 20, 15, 0, 2 * Math.PI, false); Ctx2d.stroke(); Ctx2d.beginPath(); Ctx2d.arc(40, 100, 15, 0, 2 * Math.PI, false); Ctx2d.stroke(); Ctx2d.restore(); Ctx2d.beginPath(); Ctx2d.arc(150, 60, 36, 0, 2 * Math.PI, false); Ctx2d.stroke(); |
restore()
holen wir die früheren Einstellungen zurück
und überschreiben damit die aktuellen Einstellungen, auch die
Clip-Region. Und so können wir nach einer maskierten Darstellung
auf der ganzen Canvas weiterzeichnen.