UX-Grundlage für haptisches Framework

Alle Verbesserungen des Android-Frameworks rund um die Haptik basieren auf einer Reihe von UX-Prinzipien, die sich im gleichen Tempo weiterentwickeln. Die aktuellen Prinzipien bestehen darin, summende Vibrationen durch klare Haptiken zu ersetzen und reichhaltige Haptiken zu erforschen.

UX-Prinzipien

Abbildung 1. Aktuelle Prinzipien

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

API Methoden Jahr hinzugefügt
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • UHR_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • LANGE DRÜCKEN
Vor 2016
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • BESTÄTIGEN
  • ABLEHNEN
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.View
  • performHapticFeedback()
Vor 2016
android.os.Vibrator
  • vibrieren()
  • 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()
  • komponieren()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
2019 (Android 10)

Summende Vibration

Bereits bei Pagern und Feature-Phones wurden minderwertige, aber energieeffiziente ERM- Summer- Vibrationen als Ersatz für akustisches Klingeln im lautlosen Modus verwendet. Die veralteten Hardwarekomponenten, die laute und unangenehme hörbare Geräusche erzeugen, können das haptische UX beeinträchtigen, indem sie minderwertige Eindrücke vermitteln (z. B. ein billiges, kaputtes Telefon).

Klare Haptik

Eine klare Haptik unterstützt die Wahrnehmung diskreter Zustandsänderungen (zum Beispiel binäre Änderungen während des Ein-/Ausschaltvorgangs). Aufgrund der Art des diskreten Angebots werden klare Haptiken als eine einzelne Einheit erzeugt (z. B. ein haptischer Effekt pro Eingabeereignis).

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

Zu den vordefinierten Haptikkonstanten, die zur Unterstützung einer klaren Haptik erstellt werden, gehören die folgenden.

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

Im VibrationEffect :

  • EFFECT_CLICK
  • EFFECT_DOUBLE_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_TICK

Der Aufbau gemeinsamen Wissens zwischen Geräteherstellern und Entwicklern ist der Schlüssel zur Verbesserung der Gesamtqualität der Haptik im Android-Ökosystem. Verwenden Sie die grundlegende Checkliste , die Hardwarebewertung und das CDD . Erfahren Sie mehr über die haptische Umsetzung.

Drücken und Loslassen

Abbildung 3. Drücken und Loslassen.

Reichhaltige Haptik

Rich Haptics ist eine wachsende Haptikkategorie, die über einzelne impulsbasierte Effekte hinausgeht. Ziel von Android ist es, eine reichhaltige Haptik mit hoher Zusammensetzbarkeit und Anpassbarkeit sowie einer feinen Granularität zu unterstützen. Die folgenden Anwendungsfälle werden in Android 11 oder niedriger unterstützt.

Reichhaltige Haptik

Abbildung 4. Reichhaltige Haptik mit gleitender Textur

Ziehen und Wischen

Abbildung 5. Ziehen und Wischen

Anwendungsfall 1: Gleitende Textur

Wenn ein haptischer Effekt wiederholt wird, während der Finger über eine Berührungsoberfläche gleitet (z. B. Ziehen, Wischen, Erkunden der Oberfläche mit haptischer Phantomtextur), sind die sich wiederholenden haptischen Effekte vorzugsweise klar und subtil.

Wenn der einzelne Effekt eher lebhaft als knackig ist, werden die Intervalle zwischen den Wiederholungen wahrscheinlich ausgelöscht. Das Ergebnis ist ein einziges langes Summen und nicht mehrere einzelne Signale.

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

Implementieren Sie eine einfache haptische Oberflächentextur für Wisch- und Ziehgesten

Verwenden Sie CLOCK_TICK und TEXT_HANDLE_MOVE in HapticFeedbackConstants . Diese Konstanten legen die Wiederholungs- und Amplitudeneigenschaften fest.

Kreieren Sie Ihren eigenen Effekt

Um Ihren eigenen Effekt zu erzielen, erstellen Sie ein Design, indem Sie Sequenzen von PRIMITIVE_CLICK und PRIMITIVE_TICK in VibrationEffect.Composition aneinanderreihen. Sie können die Eigenschaften der Wiederholungs- und Amplitudenskala mit addPrimitive(int primitiveID, float scale, int delay) anpassen. Die Unterstützung basiert auf der CAP_COMPOSE_EFFECTS -Funktion der Vibrator-HAL-Schnittstelle .

Anwendungsfall 2: Lange Vibration mit Easy-in-Effekt

Eine lange Vibration ist eine Vibration mit gleichmäßiger Amplitude, die von 0 zur Zielamplitude übergeht. Lange Vibrationen können eine gut wahrnehmbare Aufmerksamkeitshaptik erzeugen. Allerdings kann eine plötzliche, lange Vibration den Benutzer in einer ruhigen Umgebung erschrecken und oft hörbare Summgeräusche erzeugen. Um eine angenehmere lange Vibration zu erzeugen, wenden Sie den Ease-in-Effekt zu Beginn der langen Vibration an. Dadurch entsteht ein sanfter Amplitudenübergang, der sich in Richtung der Zielamplitude aufbaut.

Wenden Sie den Ease-in-Effekt an

  1. Überprüfen Sie die Hardwarefähigkeiten der 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 Reihe von timings[] und amplitudes[] an, um die Ease-in-Kurve zu erzeugen, wie in Abbildung 6 dargestellt.

Lange Vibration

Abbildung 6. Lange Vibrations-Ease-in-Kurve

Anwendungsfall 3: Audiogekoppelte Haptik

Audiogekoppelte Haptiken sind haptische Muster, die mit dem Rhythmus des Audios gekoppelt sind, um die Aufmerksamkeit des Benutzers zu erregen.

Audiogekoppelte Haptik: Vorteile

Um audiogekoppelte Haptiken umzusetzen, kombinieren Sie klare Haptiken mit langen Vibrationen. Die starken, aber kurzen haptischen Empfindungen klarer Haptik liefern diskrete rhythmische Muster. In Kombination mit den starken Reizen, die durch lange Vibrationen entstehen, kann dies die Aufmerksamkeit des Benutzers hervorragend erregen.

Es ist wichtig, die rhythmischen Muster der Empfindung zu berücksichtigen. Wenn kein Rhythmusgefühl vorhanden ist, nimmt der Benutzer die haptischen Empfindungen als zufälliges Summen wahr und neigt dazu, sie zu ignorieren.

Audio-Paar

Abbildung 7. Beispiel für die Haptik eines Audiopaars

Audiogekoppelte Haptik: Tipps zur Umsetzung

Die Implementierung audiogekoppelter Haptik erfordert ein grundlegendes Verständnis der Inhaltswiedergabe sowohl von Audio- als auch von haptischen Kanälen. Beachten Sie die folgenden Dinge.

  • Verwenden Sie die Klassen MediaPlayer oder SoundPool .

    • Assets im OGG-Format mit einem speziellen Metadatenschlüssel ( ANDROID_HAPTIC gefolgt von einer Reihe haptischer Kanäle) zeigen das Vorhandensein von haptischen Daten und die Wiedergabe mit MediaPlayer und SoundPool an.
  • Geben Sie die Unterstützung von Haptik und Audiowiedergabe in audio_policy_configuration.xml an.

    • Verwenden Sie ein Ausgabeprofil mit dem Haptikkanal AUDIO_CHANNEL_OUT_HAPTIC_A|B .
    • Bedenken Sie bei einem Ausgabestream mit haptischen Kanälen, dass haptische Kanäle in den Daten als zusätzliche Kanäle dargestellt werden.

    Beispiel

    Wenn die Kanalmaske für den Ausgabestream so aussieht:

    AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A

    Dann sollte jedes Beispiel so aussehen:

    AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A

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

    • Haptische Kanäle sind standardmäßig stummgeschaltet ( true ).
    • Zu den Anwendungsfällen gehören Klingeltöne und UI-Sounds mit synchroner Haptik und Rückmeldung.
  • Der Vibrator HAL muss eine externe Steuerungsunterstützung implementieren.

Audiogekoppelte Haptik

Abbildung 8. Implementierung audiogekoppelter Haptik

Audiogekoppelte Haptik: Haptic Generator

HapticGenerator ist ein in Android 12 eingeführter Audioeffekt , der haptische Daten aus einem Audiokanal generieren und diese in Echtzeit als audiogekoppelte Haptiken abspielen kann. Der Effekt wird auf den AudioTrack angewendet, wie in Abbildung 9 beschrieben.

Haptic Generator architecture

Abbildung 9. Haptic Generator-Architektur

Um sicherzustellen, dass Ihr Haptikgenerator-Algorithmus hochwertige Haptiken erzeugt, stimmen Sie den Generierungsalgorithmus auf den Vibrationsmotor des Geräts ab, indem Sie die Parameter anpassen, die die Filterkette konfigurieren, die er auf Audiowellenformen anwendet. In diesem Abschnitt werden diese Parameter ausführlich beschrieben und erklärt, wie Sie sie an Ihre Hardwarespezifikation anpassen können.

  1. Resonanzfrequenz für Bandpassfilter

    Die Resonanzfrequenz des Vibrators ist die Frequenz, bei der ein haptischer Aktor seine maximale Leistung erbringt. Dieser Parameter passt einen Antiresonator an, um die Antwortübertragungsfunktion teilweise abzuflachen, um eine größere Bandbreite zu erhalten. 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 . Dies kann hier im Code geändert werden.

  2. Normalisierungsleistung für langsame Hüllkurve

    Dieser Parameter bestimmt den Exponenten bei der Teilnormalisierung (automatische Verstärkungsregelung). Sein Standardwert ist -0,8 , was bedeutet, dass 80 % der Dynamikbereichsschwankung durch diesen Verstärkungsregelungsschritt entfernt werden. Dies kann hier im Code geändert werden.

  3. Q-Faktor für Bandsperrfilter

    Der Gütefaktor des Vibrators (Q-Faktor) wird durch zwei Parameter bestimmt:

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

    • Der Pole Q, der Gütefaktor der Pole im Bandsperrfilter.

    Das Verhältnis dieser beiden Werte begrenzt die Resonanzunterdrückung, um niedrigere Frequenzen zu verstärken und die Reaktion des Algorithmus zu verbreitern. Beispielsweise ergeben die Standardwerte 8 für Null-Q und 4 für Pol-Q 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 Motorstärke in Ihrem Gerät nicht berücksichtigen, empfehlen wir, beide Werte gleichzeitig zu ändern und entweder beide zu erhöhen oder zu verringern. Das Verhältnis von Null-Q zu Pol-Q sollte größer als 1 sein. Dies kann hier im Code geändert werden.

  4. Eckfrequenz für Verzerrung

    Die Eckfrequenz wird von einem Tiefpassfilter angelegt, der Vibrationen bei niedrigen Pegeln unterdrückt und höhere Pegel durch eine kubische Verzerrung verstärkt. Die Standardeinstellung ist 300 Hz . Dies kann hier im Code geändert werden.

  5. Eingangsverstärkung und Würfelschwelle für Verzerrung

    Diese Parameter werden von einem nichtlinearen Verzerrungsfilter verwendet, der auf die Eingangswellenform angewendet wird und die Amplitude der Signale mit niedrigerer Frequenz dämpft und die Amplitude der Signale mit höherer Frequenz erhöht.

    • Der Standardwert für den Eingangsverstärkungsfaktor beträgt 0,3 .
    • Der Standardwert für den Cube-Schwellenwert ist 0,1 .

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

    Weitere Informationen zu der von diesem Filter angewendeten Funktion finden Sie in der hier verfügbaren Implementierung. Um mehr darüber zu erfahren, wie diese beiden Parameter die Ausgabe beeinflussen, empfehlen wir, die Frequenzgänge der Filter aufzuzeichnen und zu beobachten, wie sich die Frequenzgänge bei verschiedenen Parameterwerten ändern.

  6. Ausgangsverstärkung für Verzerrung

    Dieser Parameter steuert die endgültige Schwingungsamplitude. Es handelt sich um eine Endverstärkung, die nach einem Soft-Limiter angewendet wird, der die Schwingungsamplituden auf weniger als 1 begrenzt. Der Standardwert ist 1,5 und kann hier im Code geändert werden. Wenn die Vibration zu subtil ist, erhöhen Sie den Wert. Wenn Sie ein Klappern der Aktuator-Hardware hören, verringern Sie den Wert.