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.
Abbildung 1. Aktuelle Prinzipien
In der folgenden Tabelle sind alle verfügbaren Haptik-APIs aufgeführt.
API | Methoden | Jahr hinzugefügt |
---|---|---|
android.view.HapticFeedbackConstants |
| Vor 2016 |
| 2017 (Android 8) | |
| 2020 (Android 11) | |
android.View |
| Vor 2016 |
android.os.Vibrator |
| Vor 2016 |
| 2017 (Android 8) | |
| 2020 (Android 11) | |
android.os.VibrationEffect |
| 2017 (Android 8) |
| 2019 (Android 10) | |
android.os.VibrationEffect.Composition |
| 2020 (Android 11) |
android.media.AudioAttributes.Builder |
| 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.
-
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.
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.
Abbildung 4. Reichhaltige Haptik mit gleitender Textur
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
Ü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.
- Das Ergebnis muss
Verwenden Sie
VibrationEffect
.createWaveform(timings[], amplitudes[], int repeat)
.Passen Sie die Reihe von
timings[]
undamplitudes[]
an, um die Ease-in-Kurve zu erzeugen, wie in Abbildung 6 dargestellt.
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.
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
oderSoundPool
.- 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 mitMediaPlayer
undSoundPool
an.
- Assets im OGG-Format mit einem speziellen Metadatenschlüssel (
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
- Verwenden Sie ein Ausgabeprofil mit dem Haptikkanal
Ändern Sie
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)
auffalse
, 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.
- Haptische Kanäle sind standardmäßig stummgeschaltet (
Der Vibrator HAL muss eine externe Steuerungsunterstützung implementieren.
- Für HIDL-Implementierungen verwenden Sie
setExternalControl(bool enabled) generates (Status status)
. - Verwenden Sie für AIDL-Implementierungen
void setExternalControl(in boolean enabled)
.
- Für HIDL-Implementierungen verwenden Sie
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.
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.
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.
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.
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.
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.
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.
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.