Start · Sprachen · JavaScript · Referenz · Touch.azimuthAngle

Touch.azimuthAngle

Eigenschaft

Liefert den Azimutwinkel eines Stifts in Radiant (0 bis 2π), also die Richtung, in die der Stift auf der Bildschirmebene geneigt ist.

seit JavaScript Experimentell: Safari iOS/iPadOS 10+, kaum sonstig Kategorie: webapi

Signatur

Touch.azimuthAngle

Beschreibung

Die schreibgeschützte Eigenschaft azimuthAngle eines Touch-Objekts gibt den Azimutwinkel des Eingabegeräts (Transducer), etwa eines Stifts, in Radiant an. Der Wert liegt im Bereich 0 bis 2π. Bei 0 zeigt das hintere Ende des Stifts in Richtung wachsender X-Werte, bei π/2 in Richtung wachsender Y-Werte (nach unten). Der Winkel dreht sich im Uhrzeigersinn.

Zusammen mit Touch.altitudeAngle (Neigung gegenüber der Bildschirmoberfläche) lässt sich die Ausrichtung des Stifts im Raum vollständig beschreiben. Das braucht man vor allem für Zeichen- und Handschrift-Apps: Pinselspitzen, Schattierungen oder kalligrafische Striche können dann je nach Stiftneigung anders aussehen.

Die Eigenschaft ist nur dann aussagekräftig, wenn Touch.touchType den Wert "stylus" hat. Bei Fingereingaben ("direct") oder auf Geräten, die den Winkel nicht erkennen, ist der Wert 0.

Rückgabewert

Typ
number
Beschreibung
Azimutwinkel in Radiant im Bereich 0 bis 2π. 0, wenn das Gerät den Wert nicht liefert. In nicht unterstützenden Browsern ist die Eigenschaft undefined.

Beispiele

Stiftausrichtung beim Zeichnen auslesen

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

canvas.addEventListener('touchmove', (event) => {
  event.preventDefault(); // Scrollen verhindern
  for (const touch of event.changedTouches) {
    if (touch.touchType !== 'stylus') continue;
    const grad = (touch.azimuthAngle * 180 / Math.PI).toFixed(1);
    console.log(`Azimut: ${grad}°, Höhe: ${touch.altitudeAngle.toFixed(2)} rad`);
  }
}, { passive: false });
Azimut: 135.0°, Höhe: 0.87 rad

Kalligrafie-Pinsel: Strichbreite abhängig von der Stiftrichtung

const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
let letzter = null;

canvas.addEventListener('touchstart', (e) => {
  const t = e.touches[0];
  letzter = { x: t.clientX, y: t.clientY };
});

canvas.addEventListener('touchmove', (e) => {
  e.preventDefault();
  const t = e.touches[0];
  const azimut = t.azimuthAngle ?? 0;
  // Breite Feder bei 45°: Strich wird breit, wenn Bewegungsrichtung quer zur Stiftrichtung steht
  const bewegung = Math.atan2(t.clientY - letzter.y, t.clientX - letzter.x);
  const breite = 2 + 10 * Math.abs(Math.sin(bewegung - azimut));

  ctx.lineWidth = breite;
  ctx.lineCap = 'round';
  ctx.beginPath();
  ctx.moveTo(letzter.x, letzter.y);
  ctx.lineTo(t.clientX, t.clientY);
  ctx.stroke();
  letzter = { x: t.clientX, y: t.clientY };
}, { passive: false });

Unterstützung prüfen und auf Pointer Events ausweichen

const unterstuetztTouchAzimut = 'Touch' in window && 'azimuthAngle' in Touch.prototype;
const unterstuetztPointerAzimut = 'PointerEvent' in window && 'azimuthAngle' in PointerEvent.prototype;

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

if (unterstuetztPointerAzimut) {
  ziel.addEventListener('pointermove', (e) => {
    if (e.pointerType === 'pen') console.log('Pointer-Azimut:', e.azimuthAngle);
  });
} else if (unterstuetztTouchAzimut) {
  ziel.addEventListener('touchmove', (e) => {
    console.log('Touch-Azimut:', e.touches[0].azimuthAngle);
  });
} else {
  console.log('Kein Azimutwinkel verfügbar');
}
Pointer-Azimut: 1.5707963267948966

// Wichtig · Fallstricke

  • Kompatibilität: Touch.azimuthAngle stammt aus dem Entwurf Touch Events Level 2 und wird praktisch nur von Safari auf iOS/iPadOS (Apple Pencil) unterstützt. Chrome und Firefox kennen die Eigenschaft nicht, dort ist sie undefined. Vor der Nutzung sollte man die Unterstützung immer prüfen.
  • Für neue Projekte ist PointerEvent.azimuthAngle die geräteübergreifende Alternative. Sie wird breiter unterstützt und gilt für Maus, Stift und Touch gleichermaßen.
  • Der Wert ist in Radiant angegeben, nicht in Grad. Umrechnen mit winkel * 180 / Math.PI.
  • Bei Fingereingaben ist der Wert immer 0. Ein Wert von 0 heißt also nicht zwingend, dass der Stift nach rechts zeigt. Deshalb zusätzlich touchType prüfen.
  • Steht der Stift senkrecht (altitudeAngle ≈ π/2), ist der Azimut kaum aussagekräftig und kann stark schwanken.
  • Um in touchmove-Handlern preventDefault() aufrufen zu können, muss der Listener mit { passive: false } registriert werden.