Alle Verbesserungen am Android-Framework, die sich um die Haptik drehen, basieren auf einer Reihe von UX-Prinzipien, die sich in gleichem Maße weiterentwickeln. Die aktuellen Prinzipien umfassen den Ersatz von vibrationsbasierten Benachrichtigungen durch klare haptische Benachrichtigungen und die Erforschung von umfassenden haptischen Benachrichtigungen.
Abbildung 1 : Aktuelle Prinzipien
In der folgenden Tabelle sind alle verfügbaren Haptik-APIs aufgeführt:
| API | Methoden und Konstanten | Jahr der Einführung |
|---|---|---|
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) |
Vibrationsbasierte Benachrichtigungen
Seit der Einführung von Pagern und Feature-Phones werden vibrationsbasierte Benachrichtigungen mit exzentrischen rotierenden Massen (ERM) als Ersatz für das Klingeln im Lautlos-Modus verwendet. Diese sind zwar energieeffizient, aber von geringer Qualität. Die älteren Hardwarekomponenten, die laute und unangenehme Geräusche erzeugen, können die haptische UX beeinträchtigen, da sie einen Eindruck von geringer Qualität vermitteln (z. B. ein billiges, kaputtes Smartphone).
Klare haptische Benachrichtigungen
Klare haptische Benachrichtigungen unterstützen die Wahrnehmung von diskreten Zustandsänderungen (z. B. binäre Änderungen beim Ein- und Ausschalten). Aufgrund der Natur der diskreten Affordance werden klare haptische Benachrichtigungen als einzelne Einheit erzeugt (z. B. ein haptischer Effekt pro Eingabeereignis).
Android zielt darauf ab, klare haptische Benachrichtigungen mit starken, aber scharfen Empfindungen zu liefern, anstatt mit Empfindungen, die vibrieren oder verschwommen sind.
Zu den vordefinierten haptischen Konstanten, die zur Unterstützung klarer haptischer Benachrichtigungen erstellt wurden, gehören die folgenden Elemente.
CLOCK_TICKCONFIRMCONTEXT_CLICKGESTURE_ENDGESTURE_STARTKEYBOARD_PRESSKEYBOARD_RELEASEKEYBOARD_TAPLONG_PRESSREJECTTEXT_HANDLE_MOVEVIRTUAL_KEYVIRTUAL_KEY_RELEASE
In
VibrationEffect:
EFFECT_CLICKEFFECT_DOUBLE_CLICKEFFECT_HEAVY_CLICKEFFECT_TICK
Gemeinsames Wissen zwischen Geräteherstellern und Entwicklern ist entscheidend, um die Gesamtqualität der Haptik im Android-Ökosystem zu verbessern. Weitere Informationen zur haptischen Implementierung finden Sie in der grundlegenden Checkliste, der Hardwarebewertung und der CDD.
Abbildung 2 : Drücken und Loslassen
Umfassende haptische Benachrichtigungen
Umfassende haptische Benachrichtigungen sind eine wachsende Kategorie von haptischen Benachrichtigungen, die über einzelne impulsbasierte Effekte hinausgeht. Android zielt darauf ab, umfassende haptische Benachrichtigungen mit hoher Zusammensetzbarkeit und Anpassbarkeit mit einem feinen Detaillierungsgrad zu unterstützen. Die folgenden Anwendungsfälle werden in Android 11 oder niedriger unterstützt.
Abbildung 3 : Umfassende haptische Benachrichtigungen mit gleitender Textur
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. Ziehen, Wischen, Erkunden der Oberfläche mit einer Phantom-Haptik-Textur), sollten die wiederholten haptischen Effekte möglichst klar und subtil sein.
Wenn der einzelne Effekt eher vibrierend als klar ist, werden die Intervalle zwischen den Wiederholungen wahrscheinlich ausgelöscht. Das Ergebnis ist ein langes Vibrieren anstelle mehrerer diskreter Signale.
Wenn die Amplitude nicht subtil genug ist, baut sich die wahrgenommene haptische Energie durch die Wiederholung auf, was am Ende der Wiederholung zu überwältigend starken haptischen Benachrichtigungen führt.
Haptische Textur für Wisch- und Ziehgesten implementieren
Verwenden Sie CLOCK_TICK und TEXT_HANDLE_MOVE in HapticFeedbackConstants.
Diese Konstanten definieren die Merkmale von Wiederholung und Amplitude vor.
Eigenen Effekt erstellen
Wenn Sie einen eigenen Effekt erstellen möchten, setzen Sie ein Design zusammen, 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 Merkmale der Wiederholung und der Amplitudenskala 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 auf die Zielamplitude übergeht. Eine lange Vibration kann wahrnehmbare haptische Benachrichtigungen erzeugen, die die Aufmerksamkeit auf sich ziehen. Eine plötzliche lange Vibration kann Nutzer in einer ruhigen Umgebung jedoch erschrecken und erzeugt oft hörbare Geräusche. Um eine angenehmere lange Vibration zu erzeugen, wenden Sie den Ease-in-Effekt am Anfang der langen Vibration an. So entsteht ein sanfter Übergang der Amplitude, der sich zur Zielamplitude hin aufbaut.
Ease-in-Effekt anwenden
Prüfen Sie die Hardwarefunktionen der Amplitudensteuerung mit
android.os.Vibrator.hasAmplitudeControl().- Das Ergebnis muss
truesein, um einen Ease-in-Effekt mit variabler Amplitude zu erzeugen.
- Das Ergebnis muss
Verwenden Sie
VibrationEffect.createWaveform(timings[], amplitudes[], int repeat).Passen Sie die Reihenfolge von
timings[]undamplitudes[]an, um die Ease-in-Kurve zu erzeugen, wie in Abbildung 5 dargestellt.
Abbildung 5 : Ease-in-Kurve für lange Vibration
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 audio-gekoppelte Haptik zu implementieren, kombinieren Sie klare haptische Benachrichtigungen mit langen Vibrationen. Die starken, aber kurzen haptischen Empfindungen von klaren haptischen Benachrichtigungen liefern diskrete rhythmische Muster. In Kombination mit den hohen Reizstufen, die eine lange Vibration bietet, ist dies eine gute Möglichkeit, die Aufmerksamkeit eines Nutzers zu erregen.
Es ist wichtig, die rhythmischen Muster der Empfindungen zu berücksichtigen. Wenn es keinen Rhythmus gibt, nimmt der Nutzer die haptischen Empfindungen als zufällige Vibrationen wahr und ignoriert sie in der Regel.
Abbildung 6 : Beispiel für audio-gekoppelte Haptik
Audio-gekoppelte Haptik: Tipps zur Implementierung
Für die Implementierung von audio-gekoppelter Haptik sind grundlegende Kenntnisse der Wiedergabe von Inhalten sowohl auf Audio- als auch auf Haptik-Kanälen erforderlich. Beachten Sie Folgendes:
Verwenden Sie die
MediaPlayeroderSoundPoolKlassen.- Assets im OGG-Format mit einem speziellen Metadatenschlüssel (
ANDROID_HAPTICgefolgt von einer Anzahl von Haptik-Kanälen) weisen auf das Vorhandensein von Haptik-Daten und die Wiedergabe mitMediaPlayerundSoundPoolhin.
- Assets im OGG-Format mit einem speziellen Metadatenschlüssel (
Geben Sie die Unterstützung für Haptik und Audiowiedergabe in
audio_policy_configuration.xmlan.- Verwenden Sie ein Ausgabeprofil mit dem Haptik-Kanal
AUDIO_CHANNEL_OUT_HAPTIC_A|B. - Bei einem Ausgabestream mit Haptik-Kanälen werden Haptik-Kanäle als zusätzliche Kanäle in den Daten dargestellt.
Beispiel
Wenn die Kanalmaske für den Ausgabestream so aussieht:
AUDIO_CHANNEL_OUT_STEREO_HAPTIC_ADann sollte jede Stichprobe so aussehen:
AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A- Verwenden Sie ein Ausgabeprofil mit dem Haptik-Kanal
Ändern Sie
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)infalse, um den Haptik-Kanal abzuspielen.- Standardmäßig sind Haptik-Kanäle stummgeschaltet (
true). - Anwendungsfälle sind z. B. Klingeltöne und UI-Sounds mit synchroner Haptik und Feedback.
- Standardmäßig sind Haptik-Kanäle stummgeschaltet (
Die Vibrator HAL muss die Unterstützung für die externe Steuerung 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 7 : Audio-gekoppelte Haptik implementieren
Audio-gekoppelte Haptik: HapticGenerator
HapticGenerator ist ein Audioeffekt, der in Android 12 eingeführt wurde und
haptische Daten aus einem Audiokanal generieren und in Echtzeit als
audio-gekoppelte Haptik wiedergeben kann. Der Effekt wird auf AudioTrack angewendet, wie
in Abbildung 8 dargestellt:

Abbildung 8 : Architektur des HapticGenerator
Diese Architekturvisualisierung zeigt, wo der HapticGenerator auf den eingehenden Audio-Stream des Nutzers angewendet wird, bevor er an die Audio HAL gesendet wird. Der Generator wird angewendet, nachdem AudioMixer die Audio- und Haptik-Daten aufgeteilt hat und vor jedem anderen Audioeffekt. Seine Ausgabe überschreibt alle vorherigen Haptik-Daten im Stream.
Damit der Algorithmus des HapticGenerator hochwertige haptische Benachrichtigungen erzeugt, müssen Sie den Algorithmus für den Vibratormotor des Geräts optimieren. Dazu passen Sie die Parameter an, die die Kette der Filter konfigurieren, die auf Audio-Wellenformen angewendet werden. In diesem Abschnitt werden diese Parameter im Detail beschrieben und es wird erklärt, 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 Anti-Resonator angepasst, um die Übertragungsfunktion der Antwort 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 diesen im Code ändern.
Normalisierungsleistung für langsame Hüllkurve
Dieser Parameter bestimmt den Exponenten in der teilweisen Normalisierung (automatische Verstärkungsregelung). Der Standardwert ist -0,8.Das bedeutet, dass 80% der Variation des Dynamikbereichs durch diesen Schritt der Verstärkungsregelung entfernt werden. Sie können ihn im Code ändern.
Q-Faktor für Bandsperrfilter
Der Qualitätsfaktor (Q-Faktor) des Vibrators wird durch zwei Parameter bestimmt:
Der Zero Q, der Qualitätsfaktor der Nullen 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 Unterdrückung der Resonanz, um niedrigere Frequenzen zu verstärken und die Reaktion des Algorithmus zu erweitern. Die Standardwerte von 8 für den Zero Q und 4 für den Pole Q 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 Zero Q zu Pole Q sollte größer als 1 sein. Sie können ihn im Code ändern.
Eckfrequenz für Verzeichnung
Die Eckfrequenz wird von einem Tiefpassfilter angewendet, der Vibrationen auf niedriger Ebene unterdrückt und höhere Ebenen mithilfe einer kubischen Verzerrung verstärkt. Der Standardwert ist 300 Hz. Sie können ihn im Code ändern.
Eingangsverstärkung und Würfelschwellenwert für Verzerrung
Diese Parameter werden von einem nichtlinearen Verzerrungsfilter verwendet, der auf die Eingangswellenform angewendet wird. Er 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ürfelschwellenwert 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
Dieser Parameter steuert die endgültige Vibrationsamplitude. Es 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 subtil ist, erhöhen Sie den Wert. Wenn Sie hören können, wie die Aktuatorhardware rattert, verringern Sie den Wert.