UX-Grundlagen für haptisches Framework

Alle Verbesserungen des Android-Frameworks, die sich um Haptik drehen, basieren auf einer Reihe von UX-Prinzipien, die sich in gleichem Maße weiterentwickeln. Die aktuellen Grundsätze sehen vor, buzzy vibration durch clear haptics zu ersetzen und rich haptics zu untersuchen.

UX-Grundsätze

Abbildung 1: Aktuelle Grundsätze

In der folgenden Tabelle sind alle verfügbaren Haptik-APIs aufgeführt:

API Methoden und Konstanten Hinzugefügt im Jahr
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • LONG_PRESS
Vor 2016
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • CONFIRM
  • REJECT
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.View
  • performHapticFeedback()
Vor 2016
android.os.Vibrator
  • vibrate()
  • hasVibrator()
Vor 2016
  • hasAmplitudeControl()
2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 (Android 11)
android.os.VibrationEffect
  • createOneShot()
  • createWaveform()
2017 (Android 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • createPredefined()
2019 (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • compose()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
2019 (Android 10)

Summende Vibration

Seit der Zeit von Pager und Feature-Phones werden vibrationsbasierte Benachrichtigungen mit ERM-Buzzer (Eccentric Rotating Mass) als Ersatz für das Klingeln im Lautlosmodus verwendet. Diese sind zwar nicht besonders hochwertig, aber energieeffizient. Die alten Hardwarekomponenten, die laute und unangenehme Geräusche erzeugen, können die haptische UX beeinträchtigen, da sie einen minderwertigen Eindruck vermitteln (z. B. bei einem billigen, defekten Smartphone).

Haptisches Feedback löschen

Deutliche Haptik unterstützt das Gefühl von diskreten Zustandsänderungen (z. B. binäre Änderungen während des Ein- und Ausschaltens). Aufgrund der diskreten Funktion werden klare haptische Signale als einzelne Einheit generiert (z. B. ein haptischer Effekt pro Eingabeereignis).

Android zielt darauf ab, klare Haptik mit starken, aber scharfen Empfindungen zu liefern, anstatt Empfindungen, die summend oder weich sind.

Vordefinierte haptische Konstanten, die für eine klare Haptik erstellt wurden, umfassen die folgenden Elemente.

In HapticFeedbackConstants:

  • CLOCK_TICK
  • CONFIRM
  • CONTEXT_CLICK
  • GESTURE_END
  • GESTURE_START
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • KEYBOARD_TAP
  • LONG_PRESS
  • REJECT
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY
  • VIRTUAL_KEY_RELEASE

In VibrationEffect:

  • EFFECT_CLICK
  • EFFECT_DOUBLE_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_TICK

Es ist wichtig, dass Gerätehersteller und Entwickler gemeinsames Wissen aufbauen, um die Qualität der Haptik im Android-Ökosystem insgesamt zu verbessern. Weitere Informationen zur haptischen Implementierung finden Sie in der grundlegenden Checkliste, der Hardware-Bewertung und dem CDD.

Drücken und loslassen

Abbildung 2: Drücken und Loslassen

Umfassende Haptik

Rich Haptics ist eine wachsende Kategorie von Haptik, die über einzelne impulsbasierte Effekte hinausgeht. Android unterstützt umfangreiche Haptik mit hoher Zusammensetzbarkeit und Anpassbarkeit mit feiner Granularität. Die folgenden Anwendungsfälle werden unter Android 11 oder niedriger unterstützt.

Erweiterte Haptik

Abbildung 3: Haptik mit gleitender Textur

Ziehen und Wischen

Abbildung 4: Ziehen und Wischen

Anwendungsfall 1: Gleitende Textur

Wenn ein haptischer Effekt wiederholt wird, während der Finger über eine Touch-Oberfläche gleitet (z. B. beim Ziehen, Wischen oder Erkunden der Oberfläche mit einer virtuellen haptischen Textur), sollten die wiederholten haptischen Effekte vorzugsweise deutlich und subtil sein.

Wenn der einzelne Effekt eher unruhig als klar ist, werden die Intervalle zwischen den Wiederholungen wahrscheinlich ausgelöscht. Das Ergebnis ist ein langer Buzz anstelle mehrerer diskreter Signale.

Wenn die Amplitude nicht subtil genug ist, baut sich die wahrgenommene haptische Energie durch die Wiederholung auf, was zu überwältigend starken Haptik-Effekten am Ende der Wiederholung führt.

Haptische Textur für Wisch- und Ziehgesten implementieren

Verwenden Sie CLOCK_TICK und TEXT_HANDLE_MOVE in HapticFeedbackConstants. Diese Konstanten definieren Merkmale von Wiederholung und Amplitude vor.

Eigenen Effekt erstellen

Wenn Sie einen eigenen Effekt erstellen möchten, müssen Sie ein Design aus einer Reihe von PRIMITIVE_CLICK- und PRIMITIVE_TICK-Sequenzen in VibrationEffect.Composition zusammenstellen. Mit addPrimitive(int primitiveID, float scale, int delay) können Sie die Eigenschaften der Wiederholung und der Amplitudenskalierung anpassen. Die Unterstützung hängt von der CAP_COMPOSE_EFFECTS-Funktion der Vibrator-HAL-Schnittstelle ab.

Anwendungsfall 2: Lange Vibration mit Ease-in-Effekt

Eine lange Vibration ist eine sanfte Amplitudenvibration, die von 0 zur Zielamplitude übergeht. Lange Vibrationen können wahrnehmbare haptische Signale erzeugen, die die Aufmerksamkeit lenken. Eine plötzliche lange Vibration kann Nutzer in einer ruhigen Umgebung jedoch erschrecken und erzeugt oft hörbare summende Geräusche. Um eine angenehmere lange Vibration zu erzeugen, wenden Sie den Ease-in-Effekt am Anfang der langen Vibration an. Dadurch wird ein sanfter Übergang zur Zielamplitude erreicht.

Ease-in-Effekt anwenden

  1. Prüfen Sie die Hardwarefunktionen für die Amplitudensteuerung mit android.os.Vibrator.hasAmplitudeControl().

    • Das Ergebnis muss true sein, um einen Ease-in-Effekt mit unterschiedlicher Amplitude zu erzeugen.
  2. Verwenden Sie VibrationEffect.createWaveform(timings[], amplitudes[], int repeat).

  3. Passen Sie die Reihen von timings[] und amplitudes[] an, um die Ease-in-Kurve zu generieren (siehe Abbildung 5).

Lange Vibration

Abbildung 5: Lange Ease-in-Kurve für Vibrationen.

Anwendungsfall 3: Audio-gekoppelte Haptik

Audio-gekoppelte Haptik sind haptische Muster, die mit dem Rhythmus des Audios gekoppelt sind, um die Aufmerksamkeit des Nutzers zu erregen.

Audio-gekoppelte Haptik: Vorteile

Um audiobasierte Haptik zu implementieren, kombinieren Sie deutliche Haptik mit langen Vibrationen. Die starken, aber kurzen haptischen Signale von Clear Haptics erzeugen diskrete rhythmische Muster. In Kombination mit den hohen Reizen, die durch lange Vibrationen erzeugt werden, wird die Aufmerksamkeit des Nutzers so sehr gut erregt.

Es ist wichtig, die rhythmischen Muster der Empfindungen zu berücksichtigen. Wenn es keinen Rhythmus gibt, nimmt der Nutzer die haptischen Signale als zufällige Vibrationen wahr und ignoriert sie eher.

Audio-Paar

Abbildung 6 Beispiel für die Kopplung von Audio und Haptik.

Audio-gekoppelte Haptik: Tipps zur Implementierung

Für die Implementierung von Audio-gekoppelter Haptik sind grundlegende Kenntnisse der Wiedergabe von Inhalten sowohl für Audio- als auch für Haptikkanäle erforderlich. Beachten Sie Folgendes:

  • Verwenden Sie die Klassen MediaPlayer oder SoundPool.

    • Assets im OGG-Format mit einem speziellen Metadatenschlüssel (ANDROID_HAPTIC gefolgt von einer Anzahl von haptischen Kanälen) weisen auf das Vorhandensein von Haptikdaten und die Wiedergabe mit MediaPlayer und SoundPool hin.
  • Geben Sie in audio_policy_configuration.xml an, dass Haptik und Audiowiedergabe unterstützt werden.

    • Verwende ein Ausgabeprofil mit einem Haptik-Channel AUDIO_CHANNEL_OUT_HAPTIC_A|B.
    • Bei einem Ausgabestream mit haptischen Channels werden haptische Channels als zusätzliche Channels in den Daten dargestellt.

    Beispiel

    Wenn die Channelmaske für den Ausgabestream so aussieht:

    AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A

    Jedes Beispiel sollte dann so aussehen:

    AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A

  • Ändern Sie AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted) in false, um den haptischen Kanal abzuspielen.

    • Standardmäßig sind haptische Kanäle stummgeschaltet (true).
    • Anwendungsfälle sind unter anderem Klingeltöne und UI-Sounds mit synchroner Haptik und Synchronisation.
  • Das Vibrator HAL muss die Unterstützung für die externe Steuerung implementieren.

Audio-gekoppelte Haptik

Abbildung 7. Audio-gekoppelte Haptik implementieren

Audio-gekoppelte Haptik: HapticGenerator

HapticGenerator ist ein Audioeffekt, der in Android 12 eingeführt wurde. Er kann Haptikdaten aus einem Audiochannel generieren und in Echtzeit als audiobasierte Haptik wiedergeben. Der Effekt wird auf AudioTrack angewendet, wie in Abbildung 8 dargestellt:

Architektur des Haptic Generator

Abbildung 8. Architektur des Haptic Generator.

Diese Architekturvisualisierung zeigt, wo der Haptic Generator auf den eingehenden Audio-Stream des Nutzers angewendet wird, bevor er an das Audio-HAL gesendet wird. Der Generator wird angewendet, nachdem AudioMixer die Audio- und Haptikdaten aufgeteilt hat und vor allen anderen Audioeffekten. Seine Ausgabe überschreibt alle vorherigen Haptikdaten im Stream.

Damit der Algorithmus zur Erstellung von Haptik hochwertiges Haptik erzeugt, müssen Sie ihn an den Vibrationsmotor des Geräts anpassen. Dazu passen Sie die Parameter an, mit denen die Filterkette konfiguriert wird, die auf Audio-Wellenformen angewendet wird. In diesem Abschnitt werden diese Parameter ausführlich beschrieben und es wird erläutert, wie Sie sie an Ihre Hardwarespezifikation anpassen.

  • Resonanzfrequenz für Bandpassfilter

    Die Resonanzfrequenz des Vibrators ist die Frequenz, bei der ein haptischer Aktuator die maximale Leistung erbringt. Mit diesem Parameter wird ein Antiresonator angepasst, um die Reaktionsübertragungsfunktion teilweise zu glätten und so eine größere Bandbreite zu erzielen. Das Android-Framework verknüpft diesen Wert automatisch mit der Ausgabe der Vibrator HAL-Methode IVibrator.getResonantFrequency.

    Der Standardwert für diesen Parameter ist 150 Hz. Sie können ihn im Code ändern.

  • Normalisierungskraft für langsamen Umschlag

    Dieser Parameter bestimmt den Exponenten in der partiellen Normalisierung (automatische Verstärkungsregelung). Der Standardwert ist -0.8. Das bedeutet, dass durch diesen Schritt der Verstärkungsregelung 80% der Variation des dynamischen Bereichs entfernt werden. Sie können dies im Code ändern.

  • Q-Faktor für Bandsperrfilter

    Der Gütefaktor des Vibrators wird durch zwei Parameter bestimmt:

    • Der Zero-Q-Faktor, der Qualitätsfaktor der Nullen im Bandsperrfilter, der die Resonanz teilweise aufhebt

    • Der Pol-Q-Faktor, der Qualitätsfaktor der Pole im Bandsperrfilter

    Das Verhältnis dieser beiden Werte begrenzt die Unterdrückung der Resonanz, um niedrigere Frequenzen zu verstärken und die Reaktion des Algorithmus zu erweitern. Die Standardwerte von 8 für die Zero-Güte und 4 für die Pol-Güte ergeben beispielsweise ein Verhältnis von 2, wodurch die Resonanzunterdrückung um den Faktor 2 (6 dB) begrenzt wird. Das Android-Framework verknüpft beide Werte mit der Ausgabe der Vibrator HAL-Methode IVibrator.getQFactor.

    Wenn die Standardwerte die Dämpfung der Motorleistung in Ihrem Gerät nicht berücksichtigen, empfehlen wir, beide Werte gleichzeitig zu ändern und entweder beide zu erhöhen oder beide zu verringern. Das Verhältnis von Nullstellen-Q zu Pol-Q sollte größer als 1 sein. Sie können dies im Code ändern.

  • Grenzfrequenz für Verzerrung

    Die Eckfrequenz wird von einem Tiefpassfilter angewendet, der Vibrationen auf niedriger Ebene unterdrückt und höhere Pegel mithilfe einer kubischen Verzerrung verstärkt. Der Standardwert ist 300 Hz. Sie können ihn im Code ändern.

  • Eingangsverstärkung und Grenzwert für den Cube für Verzerrung

    Diese Parameter werden von einem Filter für nichtlineare Verzerrung verwendet, der auf die Eingabe-Wellenform angewendet wird. Er dämpft die Amplitude der Signale mit niedrigeren Frequenzen und erhöht die Amplitude der Signale mit höheren Frequenzen.

    • Der Standardwert für den Eingabeverstärkungsfaktor ist 0,3.
    • Der Standardwert für den Cube-Grenzwert ist 0,1.

    Wir empfehlen, beide Werte gemeinsam zu ändern. Sie finden sie im Code.

    Weitere Informationen zur Funktion, die von diesem Filter angewendet wird, finden Sie in der Implementierung im Code.

    Um mehr darüber zu erfahren, wie sich diese beiden Parameter auf die Ausgabe auswirken, empfehlen wir, die Frequenzgänge der Filter zu zeichnen und zu beobachten, wie sich die Frequenzgänge bei unterschiedlichen Parameterwerten ändern.

  • Ausgangsverstärkung für Verzerrung

    Mit diesem Parameter wird die endgültige Vibrationsamplitude gesteuert. Dies ist eine endgültige Verstärkung, die nach einem Soft Limiter angewendet wird, der die Vibrationsamplituden auf weniger als 1 begrenzt. Der Standardwert ist 1, 5.Sie können ihn im Code ändern.

    Wenn die Vibration zu schwach ist, erhöhe den Wert. Wenn Sie hören, dass die Aktuatorhardware rattert, verringern Sie den Wert.