Alle Verbesserungen des Android-Frameworks, die sich um Haptik drehen, basieren auf einer Reihe von UX-Prinzipien, die sich in gleichem Maße weiterentwickeln. Die aktuellen Grundsätze sehen vor, buzzy vibration durch clear haptics zu ersetzen und rich haptics zu untersuchen.
Abbildung 1: Aktuelle Grundsätze
In der folgenden Tabelle sind alle verfügbaren Haptik-APIs aufgeführt:
API | Methoden und Konstanten | Hinzugefügt im Jahr |
---|---|---|
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
Seit der Zeit von Pager und Feature-Phones werden vibrationsbasierte Benachrichtigungen mit ERM-Buzzer (Eccentric Rotating Mass) als Ersatz für das Klingeln im Lautlosmodus verwendet. Diese sind zwar nicht besonders hochwertig, aber energieeffizient. Die alten Hardwarekomponenten, die laute und unangenehme Geräusche erzeugen, können die haptische UX beeinträchtigen, da sie einen minderwertigen Eindruck vermitteln (z. B. bei einem billigen, defekten Smartphone).
Haptisches Feedback löschen
Deutliche Haptik unterstützt das Gefühl von diskreten Zustandsänderungen (z. B. binäre Änderungen während des Ein- und Ausschaltens). Aufgrund der diskreten Funktion werden klare haptische Signale als einzelne Einheit generiert (z. B. ein haptischer Effekt pro Eingabeereignis).
Android zielt darauf ab, klare Haptik mit starken, aber scharfen Empfindungen zu liefern, anstatt Empfindungen, die summend oder weich sind.
Vordefinierte haptische Konstanten, die für eine klare Haptik erstellt wurden, umfassen die folgenden Elemente.
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
Es ist wichtig, dass Gerätehersteller und Entwickler gemeinsames Wissen aufbauen, um die Qualität der Haptik im Android-Ökosystem insgesamt zu verbessern. Weitere Informationen zur haptischen Implementierung finden Sie in der grundlegenden Checkliste, der Hardware-Bewertung und dem CDD.
Abbildung 2: Drücken und Loslassen
Umfassende Haptik
Rich Haptics ist eine wachsende Kategorie von Haptik, die über einzelne impulsbasierte Effekte hinausgeht. Android unterstützt umfangreiche Haptik mit hoher Zusammensetzbarkeit und Anpassbarkeit mit feiner Granularität. Die folgenden Anwendungsfälle werden unter Android 11 oder niedriger unterstützt.
Abbildung 3: Haptik 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. beim Ziehen, Wischen oder Erkunden der Oberfläche mit einer virtuellen haptischen Textur), sollten die wiederholten haptischen Effekte vorzugsweise deutlich und subtil sein.
Wenn der einzelne Effekt eher unruhig als klar ist, werden die Intervalle zwischen den Wiederholungen wahrscheinlich ausgelöscht. Das Ergebnis ist ein langer Buzz anstelle mehrerer diskreter Signale.
Wenn die Amplitude nicht subtil genug ist, baut sich die wahrgenommene haptische Energie durch die Wiederholung auf, was zu überwältigend starken Haptik-Effekten am Ende der Wiederholung führt.
Haptische Textur für Wisch- und Ziehgesten implementieren
Verwenden Sie CLOCK_TICK
und TEXT_HANDLE_MOVE
in HapticFeedbackConstants
.
Diese Konstanten definieren Merkmale von Wiederholung und Amplitude vor.
Eigenen Effekt erstellen
Wenn Sie einen eigenen Effekt erstellen möchten, müssen Sie ein Design aus einer Reihe von PRIMITIVE_CLICK
- und PRIMITIVE_TICK
-Sequenzen in VibrationEffect.Composition
zusammenstellen.
Mit addPrimitive(int primitiveID, float scale, int delay)
können Sie die Eigenschaften der Wiederholung und der Amplitudenskalierung 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 zur Zielamplitude übergeht. Lange Vibrationen können wahrnehmbare haptische Signale erzeugen, die die Aufmerksamkeit lenken. Eine plötzliche lange Vibration kann Nutzer in einer ruhigen Umgebung jedoch erschrecken und erzeugt oft hörbare summende Geräusche. Um eine angenehmere lange Vibration zu erzeugen, wenden Sie den Ease-in-Effekt am Anfang der langen Vibration an. Dadurch wird ein sanfter Übergang zur Zielamplitude erreicht.
Ease-in-Effekt anwenden
Prüfen Sie die Hardwarefunktionen für die 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 Reihen von
timings[]
undamplitudes[]
an, um die Ease-in-Kurve zu generieren (siehe Abbildung 5).
Abbildung 5: Lange Ease-in-Kurve für Vibrationen.
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 audiobasierte Haptik zu implementieren, kombinieren Sie deutliche Haptik mit langen Vibrationen. Die starken, aber kurzen haptischen Signale von Clear Haptics erzeugen diskrete rhythmische Muster. In Kombination mit den hohen Reizen, die durch lange Vibrationen erzeugt werden, wird die Aufmerksamkeit des Nutzers so sehr gut erregt.
Es ist wichtig, die rhythmischen Muster der Empfindungen zu berücksichtigen. Wenn es keinen Rhythmus gibt, nimmt der Nutzer die haptischen Signale als zufällige Vibrationen wahr und ignoriert sie eher.
Abbildung 6 Beispiel für die Kopplung von Audio und Haptik.
Audio-gekoppelte Haptik: Tipps zur Implementierung
Für die Implementierung von Audio-gekoppelter Haptik sind grundlegende Kenntnisse der Wiedergabe von Inhalten sowohl für Audio- als auch für Haptikkanäle erforderlich. Beachten Sie Folgendes:
Verwenden Sie die Klassen
MediaPlayer
oderSoundPool
.- Assets im OGG-Format mit einem speziellen Metadatenschlüssel (
ANDROID_HAPTIC
gefolgt von einer Anzahl von haptischen Kanälen) weisen auf das Vorhandensein von Haptikdaten und die Wiedergabe mitMediaPlayer
undSoundPool
hin.
- Assets im OGG-Format mit einem speziellen Metadatenschlüssel (
Geben Sie in
audio_policy_configuration.xml
an, dass Haptik und Audiowiedergabe unterstützt werden.- Verwende ein Ausgabeprofil mit einem Haptik-Channel
AUDIO_CHANNEL_OUT_HAPTIC_A|B
. - Bei einem Ausgabestream mit haptischen Channels werden haptische Channels als zusätzliche Channels in den Daten dargestellt.
Beispiel
Wenn die Channelmaske für den Ausgabestream so aussieht:
AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A
Jedes Beispiel sollte dann so aussehen:
AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A
- Verwende ein Ausgabeprofil mit einem Haptik-Channel
Ändern Sie
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)
infalse
, um den haptischen Kanal abzuspielen.- Standardmäßig sind haptische Kanäle stummgeschaltet (
true
). - Anwendungsfälle sind unter anderem Klingeltöne und UI-Sounds mit synchroner Haptik und Synchronisation.
- Standardmäßig sind haptische Kanäle stummgeschaltet (
Das 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. Er kann Haptikdaten aus einem Audiochannel generieren und in Echtzeit als audiobasierte Haptik wiedergeben. Der Effekt wird auf AudioTrack
angewendet, wie in Abbildung 8 dargestellt:
Abbildung 8. Architektur des Haptic Generator.
Diese Architekturvisualisierung zeigt, wo der Haptic Generator auf den eingehenden Audio-Stream des Nutzers angewendet wird, bevor er an das Audio-HAL gesendet wird. Der Generator wird angewendet, nachdem AudioMixer
die Audio- und Haptikdaten aufgeteilt hat und vor allen anderen Audioeffekten. Seine Ausgabe überschreibt alle vorherigen Haptikdaten im Stream.
Damit der Algorithmus zur Erstellung von Haptik hochwertiges Haptik erzeugt, müssen Sie ihn an den Vibrationsmotor des Geräts anpassen. Dazu passen Sie die Parameter an, mit denen die Filterkette konfiguriert wird, die auf Audio-Wellenformen 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 Bandpassfilter
Die Resonanzfrequenz des Vibrators ist die Frequenz, bei der ein haptischer Aktuator die maximale Leistung erbringt. Mit diesem Parameter wird ein Antiresonator angepasst, um die Reaktionsübertragungsfunktion 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 ihn im Code ändern.
Normalisierungskraft für langsamen Umschlag
Dieser Parameter bestimmt den Exponenten in der partiellen Normalisierung (automatische Verstärkungsregelung). Der Standardwert ist -0.8. Das bedeutet, dass durch diesen Schritt der Verstärkungsregelung 80% der Variation des dynamischen Bereichs entfernt werden. Sie können dies im Code ändern.
Q-Faktor für Bandsperrfilter
Der Gütefaktor des Vibrators wird durch zwei Parameter bestimmt:
Der Zero-Q-Faktor, der Qualitätsfaktor der Nullen im Bandsperrfilter, der die Resonanz teilweise aufhebt
Der Pol-Q-Faktor, 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 die Zero-Güte und 4 für die Pol-Güte 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 Nullstellen-Q zu Pol-Q sollte größer als 1 sein. Sie können dies im Code ändern.
Grenzfrequenz für Verzerrung
Die Eckfrequenz wird von einem Tiefpassfilter angewendet, der Vibrationen auf niedriger Ebene unterdrückt und höhere Pegel mithilfe einer kubischen Verzerrung verstärkt. Der Standardwert ist 300 Hz. Sie können ihn im Code ändern.
Eingangsverstärkung und Grenzwert für den Cube für Verzerrung
Diese Parameter werden von einem Filter für nichtlineare Verzerrung verwendet, der auf die Eingabe-Wellenform angewendet wird. Er dämpft die Amplitude der Signale mit niedrigeren Frequenzen und erhöht die Amplitude der Signale mit höheren Frequenzen.
- Der Standardwert für den Eingabeverstärkungsfaktor ist 0,3.
- Der Standardwert für den Cube-Grenzwert 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
Mit diesem Parameter wird die endgültige Vibrationsamplitude gesteuert. Dies 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 schwach ist, erhöhe den Wert. Wenn Sie hören, dass die Aktuatorhardware rattert, verringern Sie den Wert.