Alle Verbesserungen des Android-Frameworks, die auf Haptik basieren, werden von einer Reihe von UX-Prinzipien angetrieben, die sich mit der gleichen Geschwindigkeit weiterentwickeln. Die aktuellen Prinzipien umfassen das Ersetzen von summenden Vibrationen durch klare Haptiken und die Erforschung reichhaltiger Haptiken .
Abbildung 1. Aktuelle Prinzipien
Die folgende Tabelle listet alle verfügbaren Haptik-APIs auf.
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
Ausgehend von Pagern und Funktionstelefonen wurden minderwertige, aber energieeffiziente ERM -Summer-basierte Vibrationen als Ersatz für akustisches Klingeln im Stummmodus verwendet . Die alten Hardwarekomponenten, die laute und unangenehme hörbare Geräusche erzeugen, können die haptische UX beeinträchtigen, indem sie Eindrücke von geringer Qualität liefern (z. B. ein billiges, kaputtes Telefon).
Klare Haptik
Eine klare Haptik unterstützt die Wahrnehmung diskreter Zustandsänderungen (z. B. binäre Änderungen während des Ein-/Ausschaltvorgangs). Aufgrund der Natur des diskreten Angebots werden klare Haptiken als einzelne Einheit erzeugt (z. B. ein haptischer Effekt pro Eingabeereignis).
Android zielt darauf ab, eine klare Haptik mit starken, aber scharfen Empfindungen zu liefern, anstatt Empfindungen, die lebhaft oder matschig sind.
Zu den vordefinierten haptischen Konstanten, die erstellt werden, um eine klare Haptik zu unterstützen, 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 von gemeinsamem Wissen zwischen Geräteherstellern und Entwicklern ist der Schlüssel zur Verbesserung der Gesamtqualität der Haptik im Android-Ökosystem. Verwenden Sie die grundlegende Checkliste , Hardwarebewertung und CDD . um mehr über die haptische Umsetzung zu erfahren.
Abbildung 3. Drücken und Loslassen.
Reiche Haptik
Rich Haptics ist eine wachsende Haptik-Kategorie, die über einzelne impulsbasierte Effekte hinausgeht. Android zielt darauf ab, eine reichhaltige Haptik mit hoher Zusammensetzbarkeit und Anpassbarkeit mit einer feinen Granularität zu unterstützen. Die folgenden Anwendungsfälle werden in Android 11 oder niedriger unterstützt.
Abbildung 4. Satte Haptik mit gleitender Textur
Abbildung 5. Ziehen und Wischen
Anwendungsfall 1: Gleittextur
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 Phantomhaptiktextur), sind die sich wiederholenden haptischen Effekte vorzugsweise klar und subtil.
Wenn der einzelne Effekt eher brummig als knackig ist, werden die Intervalle zwischen den Wiederholungen wahrscheinlich ausgelöscht. Das Ergebnis ist ein langes Summen und nicht mehrere diskrete 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 einer einfachen haptischen Oberflächentextur für Wisch- und Ziehgesten
Verwenden Sie CLOCK_TICK
und TEXT_HANDLE_MOVE
in HapticFeedbackConstants
. Diese Konstanten definieren Eigenschaften von Wiederholung und Amplitude vor.
Erstellen 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 beruht auf der CAP_COMPOSE_EFFECTS
Fähigkeit der Vibrator-HAL-Schnittstelle .
Anwendungsfall 2: Lange Vibration mit Ease-in-Effekt
Lange Vibration ist eine sanfte Amplitudenvibration, die von 0 auf die Zielamplitude übergeht. Eine lange Vibration kann eine leicht wahrnehmbare Haptik der Aufmerksamkeit erzeugen. Eine plötzliche lange Vibration kann Benutzer in einer ruhigen Umgebung jedoch erschrecken und erzeugt oft hörbare Brummgeräusche. Um eine angenehmere lange Vibration zu erzeugen, wenden Sie den Ease-In-Effekt am Anfang der langen Vibration an. Dies erzeugt einen sanften Amplitudenübergang, der sich zur Zielamplitude hin aufbaut.
Anwenden des Ease-in-Effekts
Überprüfen Sie die Hardwarefähigkeiten der Amplitudensteuerung mit
android.os.Vibrator.hasAmplitudeControl()
.- Das Ergebnis muss
true
sein, um einen Ease-in-Effekt mit variierender 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 generieren, wie in Abbildung 6 dargestellt.
Abbildung 6. Ease-in-Kurve bei langen Vibrationen
Anwendungsfall 3: Audiogekoppelte Haptik
Audiogekoppelte Haptik sind haptische Muster, die mit dem Rhythmus des Audios gekoppelt sind, um die Aufmerksamkeit des Benutzers zu erregen.
Audiogekoppelte Haptik: Vorteile
Um eine audiogekoppelte Haptik zu implementieren, kombinieren Sie eine klare Haptik mit langen Vibrationen. Die starken, aber kurzen haptischen Empfindungen von Clear Haptics liefern diskrete rhythmische Muster. In Kombination mit den hohen Stimuli, die lange Vibrationen bieten, leistet dies hervorragende Arbeit, um die Aufmerksamkeit eines Benutzers zu erregen.
Es ist wichtig, die rhythmischen Empfindungsmuster 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 Haptikkanälen. Beachten Sie die folgenden Dinge.
Verwenden Sie die
MediaPlayer
oderSoundPool
Klassen.- Assets im OGG-Format mit einem speziellen Metadatenschlüssel (
ANDROID_HAPTIC
gefolgt von einer Reihe haptischer Kanäle) weisen auf das Vorhandensein von haptischen Daten und die Wiedergabe mitMediaPlayer
undSoundPool
.
- 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
AUDIO_CHANNEL_OUT_HAPTIC_A|B
. - Denken Sie bei einem Ausgabestream mit haptischen Kanälen daran, dass haptische Kanäle als zusätzliche Kanäle in den Daten dargestellt werden.
Beispiel
Wenn die Kanalmaske für den Ausgabestream so aussieht:
AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A
Dann sollte jede Probe so aussehen:
AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A
- Verwenden Sie ein Ausgabeprofil mit
Change
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)
auf
false
, um den haptischen Kanal abzuspielen.- Standardmäßig sind haptische Kanäle stummgeschaltet (
true
). - Zu den Anwendungsfällen gehören Klingeltöne und UI-Sounds mit synchroner Haptik und Feedback.
- Standardmäßig sind haptische Kanäle stummgeschaltet (
Der Vibrator HAL muss externe Steuerungsunterstützung 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. Implementieren von audiogekoppelter Haptik
Audiogekoppelte Haptik: Haptic Generator
Der HapticGenerator
ist ein in Android 12 eingeführter Audioeffekt , der haptische Daten aus einem Audiokanal generieren und in Echtzeit als audiogekoppelte Haptik abspielen kann. Der Effekt wird wie in Abbildung 9 beschrieben auf die AudioTrack
angewendet.
Abbildung 9. Architektur des haptischen Generators
Um sicherzustellen, dass Ihr haptischer Generatoralgorithmus qualitativ hochwertige Haptik erzeugt, stimmen Sie den Erzeugungsalgorithmus auf den Vibrationsmotor des Geräts ab, indem Sie die Parameter anpassen, die die Filterkette konfigurieren, die er auf Audiowellenformen anwendet. Dieser Abschnitt beschreibt diese Parameter im Detail und erklärt, wie Sie sie an Ihre Hardwarespezifikation anpassen können.
Resonanzfrequenz für Bandpassfilter
Die Vibratorresonanzfrequenz ist die Frequenz, bei der ein haptischer Aktuator seine maximale Ausgangsleistung hat. 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 partiellen Normalisierung (automatische Verstärkungsregelung). Sein Standardwert ist -0,8 , was bedeutet, dass 80 % der Schwankungen des Dynamikbereichs durch diesen Schritt der Verstärkungsregelung entfernt werden. Dies kann hier im Code geändert werden .
Q-Faktor für Bandsperrfilter
Der Qualitätsfaktor des Vibrators (Q-Faktor) wird durch zwei Parameter bestimmt:
Der Zero Q, der Qualitätsfaktor der Nullstellen im Bandsperrfilter, der die Resonanz teilweise aufhebt.
Der Pole Q, der Qualitätsfaktor der Pole im Bandsperrfilter.
Das Verhältnis dieser beiden Werte begrenzt die Resonanzunterdrückung, um niedrigere Frequenzen zu verstärken und die Algorithmusantwort zu erweitern. Beispielsweise erzeugen die Standardwerte von 8 für Zero Q und 4 für Pole 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 voreingestellten Werte 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 beide 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 niedrige Vibrationen unterdrückt und höhere Pegel durch eine kubische Verzerrung verstärkt. Es ist standardmäßig auf 300 Hz eingestellt . Dies kann hier im Code geändert werden .
Input Gain und Cube Threshold für Distortion
Diese Parameter werden von einem nichtlinearen Verzerrungsfilter verwendet, der auf die Eingangswellenform angewendet wird, die die Amplitude der niedrigeren Frequenzsignale dämpft und die höheren Frequenzen erhöht.
- Der Standardwert für den Eingangsverstärkungsfaktor ist 0,3 .
- Der Standardwert für den Cube-Schwellenwert ist 0,1 .
Wir empfehlen, beide Werte zusammen zu ändern. Sie sind hier im Code zu finden .
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 unterschiedlichen Parameterwerten ändern.
Ausgangsverstärkung für Verzerrung
Dieser Parameter steuert die endgültige Vibrationsamplitude. Es ist eine Endverstärkung, die nach einem Soft-Limiter angewendet wird, der Vibrationsamplituden auf weniger als 1 begrenzt. Sein Standardwert ist 1,5 und kann hier im Code geändert werden . Wenn die Vibration zu schwach ist, erhöhen Sie den Wert. Wenn Sie die Aktuator-Hardware klappern hören, verringern Sie den Wert.