Start · Sprachen · JavaScript · Referenz · DelegatedInkTrailPresenter.presentationArea

DelegatedInkTrailPresenter.presentationArea

Eigenschaft

Schreibgeschützte Eigenschaft, die das Element liefert, auf dessen Fläche die vom Betriebssystem vorgezeichneten Tintenstriche begrenzt sind, oder <code>null</code> für den Viewport.

seit JavaScript Experimentell: Chrome/Edge 94+ (Chromium), nicht i Kategorie: webapi

Signatur

DelegatedInkTrailPresenter.presentationArea

Beschreibung

Die Eigenschaft presentationArea gehört zur Ink API. Diese API verringert die spürbare Verzögerung beim Zeichnen mit Stift, Finger oder Maus: Der Browser übergibt das Zeichnen der letzten Strichsegmente an den Compositor bzw. an das Betriebssystem. So erscheint die Tinte schon, bevor die eigene Anwendung den Frame fertig gerendert hat.

Das Presenter-Objekt erzeugt man mit navigator.ink.requestPresenter({ presentationArea: element }). Das dort übergebene Element, meist ein <canvas>, legt fest, wo die vorgezeichnete Tinte sichtbar sein darf. Striche außerhalb seiner Rahmenbox werden abgeschnitten. presentationArea gibt genau dieses Element zurück. Wurde keines angegeben, ist der Wert null, und die Tinte ist auf den Viewport des Dokuments begrenzt.

Die Eigenschaft ist schreibgeschützt. Um den Bereich zu ändern, fordert man einen neuen Presenter an. In der Praxis nutzt man presentationArea, um zu prüfen, zu welcher Zeichenfläche ein Presenter gehört, zum Beispiel wenn eine Anwendung mehrere Canvas-Elemente hat oder den Presenter zentral in einer Hilfsklasse speichert.

Rückgabewert

Typ
Element | null
Beschreibung
Das Element, auf dessen Fläche die vorgezeichnete Tinte begrenzt ist, oder null, wenn beim Anfordern des Presenters kein presentationArea angegeben wurde. Dann gilt der Viewport als Grenze.

Beispiele

Presenter für ein Canvas anfordern und Bereich prüfen

const canvas = document.querySelector('#zeichenflaeche');

const initInk = async () => {
  if (!('ink' in navigator)) {
    console.log('Ink API wird nicht unterstützt');
    return null;
  }
  const presenter = await navigator.ink.requestPresenter({ presentationArea: canvas });
  console.log(presenter.presentationArea === canvas);
  console.log(presenter.presentationArea.id);
  return presenter;
};

initInk();
true zeichenflaeche

Ohne presentationArea: Begrenzung auf den Viewport

const presenter = await navigator.ink.requestPresenter();

if (presenter.presentationArea === null) {
  console.log('Tinte ist auf den Viewport begrenzt');
}
Tinte ist auf den Viewport begrenzt

Tintenspur beim Zeichnen mit pointermove aktualisieren

const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
const presenter = await navigator.ink.requestPresenter({ presentationArea: canvas });
const stil = { color: 'rgb(0, 0, 200)', diameter: 4 };

canvas.addEventListener('pointermove', (event) => {
  if (event.buttons !== 1) return;
  // Sicherheitsprüfung: Das Event muss aus dem Bereich des Presenters stammen
  if (!presenter.presentationArea.contains(event.target)) return;

  const rect = canvas.getBoundingClientRect();
  ctx.fillStyle = stil.color;
  ctx.beginPath();
  ctx.arc(event.clientX - rect.left, event.clientY - rect.top, stil.diameter / 2, 0, Math.PI * 2);
  ctx.fill();

  // Der Browser zeichnet die Spur ab diesem Punkt vor, bis der nächste Frame fertig ist
  presenter.updateInkTrailStartPoint(event, stil);
});

// Wichtig · Fallstricke

  • Experimentell: Die Ink API gibt es nur in Chromium-Browsern (Chrome/Edge ab 94). Firefox und Safari unterstützen sie nicht. Prüfen Sie deshalb immer vorher mit 'ink' in navigator und sehen Sie normales Canvas-Zeichnen als Ausweichlösung vor.
  • Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wird ignoriert, im Strict Mode löst sie einen TypeError aus. Für einen anderen Bereich fordern Sie einen neuen Presenter an.
  • Die Begrenzung richtet sich nach der Rahmenbox (border box) des Elements zum Zeitpunkt des Zeichnens. Wird das Element per CSS verschoben oder in der Größe geändert, wird die Tinte am neuen Rahmen abgeschnitten.
  • Ist presentationArea kein gültiges, im Dokument eingebundenes Element, wird das Promise von requestPresenter() abgelehnt.
  • Die vorgezeichnete Tinte ist nur eine kurzlebige Vorschau. Den eigentlichen Strich muss die Anwendung weiterhin selbst zeichnen, sonst verschwindet er im nächsten Frame.