Alle Verbesserungen des Android-Frameworks im Hinblick auf Haptik basieren auf einer Reihe von UX-Prinzipien, die sich im gleichen Maße weiterentwickeln. Die aktuellen Prinzipien beinhalten das Ersetzen von summenden Vibrationen durch deutliche Haptik und die Erforschung von ausdrucksstarker Haptik.
Abbildung 1: Aktuelle Grundsätze
In der folgenden Tabelle sind alle verfügbaren Haptik-APIs aufgeführt.
API | Methoden | Jahr der Aufnahme |
---|---|---|
android.view.HapticFeedbackConstants |
|
Bis 2016 |
|
2017 (Android 8) | |
|
2020 (Android 11) | |
android.View |
|
Vor 2016 |
android.os.Vibrator |
|
Bis 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) |
Brummende Vibration
Schon bei Pagern und Feature Phones wurden minderwertige, aber energieeffiziente ERM-Vibrationen als Ersatz für das akustische Klingeln im Lautlos-Modus verwendet. Alte Hardwarekomponenten, die laute und unangenehme Geräusche verursachen, können die haptische Nutzererfahrung beeinträchtigen, da sie einen minderwertigen Eindruck vermitteln (z. B. ein billiges, kaputtes Smartphone).
Haptik löschen
Klare Haptik unterstützt das Gefühl von diskreten Statusänderungen, z. B. binäre Änderungen beim Ein- und Ausschalten. Aufgrund der Natur der diskreten Aufforderung werden klare Haptikeffekte als einzelne Entität generiert (z. B. ein haptischer Effekt pro Eingabeereignis).
Android-Geräte sollen eine klare Haptik mit starken, aber klaren Vibrationen bieten, anstatt ein Summen oder ein schwammiges Gefühl.
Zu den vordefinierten haptischen Konstanten, die für eine klare Haptik entwickelt wurden, gehören:
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
Um die Gesamtqualität der Haptik im Android-Ökosystem zu steigern, ist es wichtig, ein gemeinsames Wissen zwischen Geräteherstellern und Entwicklern aufzubauen. Weitere Informationen zur haptischen Implementierung finden Sie in der Grundlegenden Checkliste, der Hardwarebewertung und der CDD.
Abbildung 3 Drücken und loslassen.
Ausgefeilte Haptik
Rich Haptics ist eine wachsende Haptikkategorie, die über einzelne impulsbasierte Effekte hinausgeht. Android soll eine umfassende Haptik mit hoher Kompositionsfähigkeit und Anpassungsfähigkeit mit hoher Detailgenauigkeit unterstützen. Die folgenden Anwendungsfälle werden unter Android 11 oder niedriger unterstützt.
Abbildung 4 Ausgeprägte 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 Touchoberfläche gleitet (z. B. beim Ziehen, Wischen oder Erkunden der Oberfläche mit einer Phantom-Haptik), sollten die sich wiederholenden haptischen Effekte möglichst klar und dezent sein.
Wenn der einzelne Effekt eher brummend als klar ist, werden die Intervalle zwischen den Wiederholungen wahrscheinlich ausgelöscht. Das Ergebnis ist ein langes Summen, anstatt mehrerer einzelner Signale.
Wenn die Amplitude nicht subtil genug ist, baut sich die wahrgenommene haptische Energie durch die Wiederholung auf, was zu übermäßig starken Haptik am Ende der Wiederholung führt.
Implementieren Sie eine einfache haptische Textur für Wisch- und Ziehbewegungen.
Verwende CLOCK_TICK
und TEXT_HANDLE_MOVE
in HapticFeedbackConstants
.
Mit diesen Konstanten werden die Wiederholungs- und Amplitudeneigenschaften vordefiniert.
Eigenen Effekt erstellen
Wenn Sie einen eigenen Effekt erstellen möchten, können Sie ein Design erstellen, indem Sie Sequenzen von PRIMITIVE_CLICK
und PRIMITIVE_TICK
in VibrationEffect.Composition
aneinanderreihen.
Mit addPrimitive(int primitiveID, float scale, int delay)
können Sie die Eigenschaften der Wiederholungs- und Amplitudenskala anpassen. Zur Unterstützung ist die CAP_COMPOSE_EFFECTS
-Funktion der Vibrator HAL-Schnittstelle erforderlich.
Anwendungsfall 2: Lange Vibration mit Einschwingeffekt
Eine lange Vibration ist eine gleichmäßige Amplitudenvibration, die von 0 auf die Zielamplitude übergeht. Eine lange Vibration kann eine leicht wahrnehmbare haptische Aufmerksamkeitsfunktion erzeugen. Eine plötzliche, lange Vibration kann Nutzer in einer ruhigen Umgebung jedoch erschrecken und erzeugt oft hörbare Brummgeräusche. Wenn Sie eine angenehmere lange Vibration erzeugen möchten, wenden Sie den Effekt „Einstieg“ am Anfang der langen Vibration an. Dies führt zu einem reibungslosen Amplitudenübergang, der sich auf die Zielamplitude zubewegt.
Effekt „Einblenden“ anwenden
Prüfe die Hardwarefunktionen der Amplitudenregelung mit
android.os.Vibrator.hasAmplitudeControl()
.- Das Ergebnis muss
true
sein, um einen stufenweisen Einblendungseffekt mit variabler Amplitude zu erzielen.
- Das Ergebnis muss
Verwende
VibrationEffect
.createWaveform(timings[], amplitudes[], int repeat)
.Passen Sie die Reihe von
timings[]
undamplitudes[]
an, um die Einblendungskurve zu generieren, wie in Abbildung 6 dargestellt.
Abbildung 6 Lange Vibrationskurve
Anwendungsfall 3: Audiogekoppelte Haptik
Audiogekoppelte Haptik sind haptische Muster, die mit dem Rhythmus des Audiosignals gekoppelt sind, um die Aufmerksamkeit des Nutzers zu erregen.
Haptik mit Audiokopplung: Vorteile
Wenn Sie haptisches Feedback mit Audio kombinieren möchten, kombinieren Sie deutliche haptische Rückmeldungen mit langen Vibrationen. Die starken, aber kurzen haptischen Eindrücke durch die klare Haptik liefern diskrete rhythmische Muster. In Kombination mit den hohen Reizen, die lange Schwingungen erzeugen, wird die Aufmerksamkeit der Nutzer hervorragend geweckt.
Es ist wichtig, die empfindenden rhythmischen Muster zu berücksichtigen. Wenn es keinen Rhythmus gibt, nimmt der Nutzer die haptischen Empfindungen als zufälliges Summen wahr und ignoriert sie in der Regel.
Abbildung 7. Beispiel für die Haptik bei Audiopaaren
Audiogekoppelte Haptik: Tipps zur Implementierung
Für die Implementierung von audiogekoppelten Haptikfunktionen sind grundlegende Kenntnisse zur Wiedergabe von Inhalten sowohl über Audio- als auch über haptische Kanäle erforderlich. Beachten Sie dabei Folgendes:
Verwenden Sie die Klassen
MediaPlayer
oderSoundPool
.- Assets im OGG-Format mit einem speziellen Metadatenschlüssel (
ANDROID_HAPTIC
gefolgt von einer Reihe von haptischen Kanälen) geben an, dass Haptikdaten vorhanden sind und die Wiedergabe mitMediaPlayer
undSoundPool
erfolgt.
- Assets im OGG-Format mit einem speziellen Metadatenschlüssel (
Gibt 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
. - Bei einem Ausgabestream mit haptischen Kanälen werden diese als zusätzliche Kanäle in den Daten dargestellt.
Beispiel
Die Kanalmaske für den Ausgabestream sieht so aus:
AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A
Dann sollte jede Stichprobe wie folgt aussehen:
AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A
- Verwenden Sie ein Ausgabeprofil mit dem Haptikkanal
Ändere
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)
zufalse
, um den haptischen Kanal wiederzugeben.- Haptische Kanäle sind standardmäßig stummgeschaltet (
true
). - Anwendungsfälle sind Klingeltöne und UI-Töne mit synchroner Haptik und Feedback.
- Haptische Kanäle sind standardmäßig stummgeschaltet (
Der Vibrator HAL muss die Unterstützung externer Steuerungen implementieren.
- Verwenden Sie für HIDL-Implementierungen
setExternalControl(bool enabled) generates (Status status)
. - Verwenden Sie für AIDL-Implementierungen
void setExternalControl(in boolean enabled)
.
- Verwenden Sie für HIDL-Implementierungen
Abbildung 8. Audiogekoppelte Haptik implementieren
Audiogekoppelte Haptik: Haptikgenerator
HapticGenerator
ist ein in Android 12 eingeführter Audioeffekt, mit dem haptische Daten aus einem Audiokanal generiert und in Echtzeit als audiogekoppelte Haptik wiedergegeben werden können.
Der Effekt wird auf die AudioTrack
angewendet, wie in Abbildung 9 beschrieben.
Abbildung 9. Haptische Generator-Architektur
Damit der Algorithmus des haptischen Generators hochwertige Haptik erzeugt, passen Sie den Generatoralgorithmus an den Vibrationsmotor des Geräts an. Dazu passen Sie die Parameter an, mit denen die Filterkette konfiguriert wird, die auf Audiowellenformen 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 einen Bandpassfilter
Die Resonanzfrequenz des Vibrators ist die Frequenz, bei der ein haptischer Aktor die maximale Leistung hat. Mit diesem Parameter wird ein Antiresonator so eingestellt, dass die Antwortübertragungsfunktion teilweise abgeflacht wird, um eine größere Bandbreite zu erhalten. Das Android-Framework verknüpft diesen Wert automatisch mit der Ausgabe der HAL-Methode „Vibrator“
IVibrator.getResonantFrequency
.Der Standardwert für diesen Parameter ist 150 Hz. Das kann in diesem Code geändert werden.
Normalisierungsfaktor für langsame Envelope
Dieser Parameter bestimmt den Exponenten bei der teilweisen Normalisierung (automatische Verstärkungsregelung). Der Standardwert ist −0,8.Das bedeutet, dass durch diesen Schritt der Verstärkungsregelung 80% der Dynamikbereichsvariation entfernt werden. Dies kann hier im Code geändert werden.
Q-Faktor für Sperrfilter
Der Qualitätsfaktor des Vibrators (Q-Faktor) wird durch zwei Parameter bestimmt:
Der Null-Q-Wert, der Qualitätsfaktor der Nullstellen im Sperrfilter, der die Resonanz teilweise aufhebt.
Der Pol Q, der Qualitätsfaktor der Pole im Sperrfilter.
Das Verhältnis dieser beiden Werte begrenzt die Unterdrückung von Resonanz, um niedrigere Frequenzen zu verstärken und die Antwort des Algorithmus zu erweitern. Die Standardwerte von 8 für den Nullpunkt Q und 4 für den Pol Q ergeben beispielsweise ein Verhältnis von 2, was die Resonanzunterdrückung um den Faktor 2 (6 dB) begrenzt. Das Android-Framework verknüpft beide Werte mit der Ausgabe der HAL-Methode
IVibrator.getQFactor
des Vibrators.Wenn die Standardwerte die Dämpfung der Motorleistung Ihres Geräts nicht berücksichtigen, empfehlen wir, beide Werte gleichzeitig zu ändern und entweder beide zu erhöhen oder beide zu verringern. Das Verhältnis von Null-Q zu Pol-Q sollte größer als 1 sein. Das kann in diesem Code geändert werden.
Eckenfrequenz für Verzerrung
Die Grenzfrequenz wird durch einen Tiefpassfilter angewendet, der Vibrationen bei niedrigen Pegeln unterdrückt und höhere Pegel mithilfe einer kubischen Verzerrung verstärkt. Die Standardeinstellung ist 300 Hz. Das kann in diesem Code geändert werden.
Eingabeverstärkung und Würfelgrenzwert für Verzerrung
Diese Parameter werden von einem nichtlinearen Verzerrungsfilter verwendet, der auf die Eingangswellenform angewendet wird. Dieser Filter dämpft die Amplitude der Signale mit niedrigerer Frequenz und erhöht die Amplitude der Signale mit höherer Frequenz.
- Der Standardwert für den Eingangsverstärkungsfaktor ist 0,3.
- Der Standardwert für den Würfelgrenzwert ist 0,1.
Wir empfehlen, beide Werte zusammen zu ändern. Sie finden sie hier im Code.
Weitere Informationen zur Funktion, die mit diesem Filter angewendet wird, finden Sie in der Implementierung. Wenn Sie mehr darüber erfahren möchten, wie sich diese beiden Parameter auf die Ausgabe auswirken, empfehlen wir, die Frequenzantworten der Filter zu zeichnen und zu beobachten, wie sich die Frequenzantworten bei verschiedenen Parameterwerten ändern.
Ausgangsverstärkung für Verzerrung
Mit diesem Parameter wird die endgültige Vibrationsamplitude gesteuert. Es ist eine endgültige Verstärkung, die nach einem weichen Limiter angewendet wird, der die Vibrationsamplituden auf weniger als 1 begrenzt. Der Standardwert ist 1, 5.Er kann im Code hier geändert werden. Wenn die Vibration zu schwach ist, erhöhen Sie den Wert. Wenn Sie das Rasseln der Aktor-Hardware hören, verringern Sie den Wert.