Wszystkie ulepszenia interfejsu Androida związane z wibracją są oparte na zestawie zasad UX, które ewoluują w takim samym tempie. Obecne zasady zakładają zastąpienie wibracji jasnymi reakcjami haptycznymi oraz eksplorowanie bogatych reakcji haptycznych.
Rysunek 1. Aktualne zasady
W tej tabeli znajdziesz wszystkie dostępne interfejsy API haptycznych.
Interfejs API | Metody | Rok dodania |
---|---|---|
android.view.HapticFeedbackConstants |
|
Przed 2016 r. |
|
2017 r. (Android 8) | |
|
2020 r. (Android 11) | |
android.View |
|
Przed 2016 r. |
android.os.Vibrator |
|
Przed 2016 r. |
|
2017 r. (Android 8) | |
|
2020 r. (Android 11) | |
android.os.VibrationEffect |
|
2017 r. (Android 8) |
|
2019 r. (Android 10) | |
android.os.VibrationEffect.Composition |
|
2020 r. (Android 11) |
android.media.AudioAttributes.Builder |
|
2019 r. (Android 10) |
Wibracje z buzzerem
Już w przypadku pagerów i telefonów komórkowych o ograniczonych możliwościach używano niskiej jakości, ale energooszczędnych wibracji ERM z buzzera jako zamiennika dźwięku w trybie wyciszonym. Stare komponenty sprzętowe, które emitują głośne i nieprzyjemne dźwięki, mogą negatywnie wpływać na haptyczne wrażenia użytkownika, ponieważ zapewniają wyświetlenia niskiej jakości (np. tani, zepsuty telefon).
Wyczyść haptyczne
Czysty haptyczny zapewnia wrażenie jednoznacznych zmian stanu (np. zmian binarnych podczas włączania i wyłączania). Ze względu na charakter dyskretnej obsługi, wyraźne wibracje są generowane jako pojedyncza jednostka (np. jeden efekt haptyczny na jedno zdarzenie wejściowe).
Android ma zapewniać wyraźne wibracje o mocnym, ale czystym brzmieniu, a nie o nieokreślonym lub niewyraźnym.
Zdefiniowane wstępnie stałe haptyczne, które obsługują czytelne haptyki, to:
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
EFFECT_CLICK
EFFECT_DOUBLE_CLICK
EFFECT_HEAVY_CLICK
EFFECT_TICK
Budowanie wspólnej wiedzy wśród producentów urządzeń i programistów jest kluczem do poprawy ogólnej jakości haptyki w ekosystemie Androida. Aby dowiedzieć się więcej o implementacji haptycznej, skorzystaj z podstawowej listy kontrolnej, oceny sprzętu i CDD.
Rysunek 3. Naciśnięcie i zwolnienie.
Bogaty system haptyczny
Zaawansowane haptyczne to rosnąca kategoria haptyki, która wykracza poza pojedyncze efekty oparte na impulsach. Android ma zapewniać obsługę bogatych haptycznych interakcji o wysokiej jakości i dokładności. Te przypadki użycia są obsługiwane w Androidzie 11 lub starszym.
Rysunek 4. Bogaty element dotykowy z teksturą przesuwania
Rysunek 5. Przeciąganie i przesuwanie
Przypadek użycia 1. Przesuwana tekstura
Jeśli efekt haptyczny jest powtarzany, gdy palec przesuwa się po powierzchni dotykowej (np. podczas przeciągania, przesuwania lub eksplorowania powierzchni za pomocą wirtualnej tekstury haptycznej), powtarzające się efekty haptyczne powinny być wyraźne i subtelne.
Jeśli efekt jest raczej szumny niż wyraźny, przerwy między powtórzeniami mogą zostać wymazane. W efekcie słychać jeden długi sygnał, a nie kilka oddzielnych.
Jeśli amplituda jest zbyt mała, wyczuwalna energia haptyczna narasta podczas powtórzeń, co powoduje, że na końcu powtórzenia wyczuwalne wibracje są bardzo silne.
Wdrożyć prostą teksturę haptyczną powierzchni na potrzeby gestów przesuwania i przeciągania
Użyj właściwości CLOCK_TICK
i TEXT_HANDLE_MOVE
w HapticFeedbackConstants
.
Te stałe definiują wstępnie cechy powtarzania i amplitudy.
Tworzenie własnego efektu
Aby utworzyć własny efekt, utwórz projekt, łącząc ze sobą sekwencje PRIMITIVE_CLICK
i PRIMITIVE_TICK
w VibrationEffect.Composition
.
Za pomocą opcji addPrimitive(int primitiveID, float scale, int delay)
możesz dostosować parametry powtarzania i amplitudy. Obsługa opiera się na
CAP_COMPOSE_EFFECTS
funkcjach interfejsu sterownika HAL wibratora.
Przypadek 2. Długie wibracje z efektem łagodnego włączania
Długa wibracja to płynna amplituda wibracji, która przechodzi od 0 do amplitudy docelowej. Długie wibracje mogą generować łatwo wyczuwalne haptyczne sygnały dźwiękowe. Nagła, długotrwała wibracja może jednak przestraszyć użytkowników w cichym otoczeniu, a często powoduje też słyszalne brzęczenie. Aby wygenerować przyjemniejsze wibracje, zastosuj efekt łagodnego włączania na początku długich wibracji. Powoduje to płynne przejście do amplitudy docelowej.
Zastosuj efekt łagodnego wejścia
Sprawdź możliwości sprzętowe kontroli amplitudy w
android.os.Vibrator.hasAmplitudeControl()
.- Wynik musi być
true
, aby uzyskać efekt łagodnego włączania z zmienną amplitudą.
- Wynik musi być
Użyj formatu
VibrationEffect
.createWaveform(timings[], amplitudes[], int repeat)
.Dostosuj serię wartości
timings[]
iamplitudes[]
, aby wygenerować łagodną krzywą, jak pokazano na rysunku 6.
Rysunek 6. Krzywa łagodnego włączenia długich wibracji
Przypadek użycia 3. Reakcje haptyczne połączone z dźwiękiem
Czujniki haptyczne połączone z dźwiękiem to wzorce haptyczne połączone z rytmem dźwięku, aby zwrócić uwagę użytkownika.
Haptyka połączona z dźwiękiem: zalety
Aby wdrożyć haptyczne sygnały dźwiękowe, połącz wyraźne sygnały haptyczne z długimi wibracjami. Silne, ale krótkie wibracje z jasnych haptycznych zapewniają dyskretne rytmiczne wzorce. W połączeniu z wysoką stymulacją, jaką zapewnia długie wibrowanie, pozwala to skutecznie przyciągać uwagę użytkownika.
Należy wziąć pod uwagę wzorce rytmiczne. Jeśli nie ma poczucia rytmu, użytkownik odbiera wibracje jako przypadkowe drgania i zwykle je ignoruje.
Rysunek 7. Przykład dźwięku w połączeniu z haptyką
Reakcje haptyczne połączone z dźwiękiem: wskazówki dotyczące implementacji
Wdrożenie haptyki połączonej z dźwiękiem wymaga podstawowej znajomości odtwarzania treści zarówno w kanałach audio, jak i haptycznych. Pamiętaj o tych kwestiach.
Użyj zajęć
MediaPlayer
lubSoundPool
.- Zasoby w formacie OGG ze specjalnym kluczem metadanych (
ANDROID_HAPTIC
, po którym następuje liczba kanałów haptycznych) wskazują na obecność danych haptycznych i odtwarzanie za pomocąMediaPlayer
iSoundPool
.
- Zasoby w formacie OGG ze specjalnym kluczem metadanych (
W
audio_policy_configuration.xml
wskaż obsługę sygnałów haptycznych i odtwarzania dźwięku.- Użyj profilu wyjściowego z kanałem haptycznym.
AUDIO_CHANNEL_OUT_HAPTIC_A|B
- W przypadku strumienia wyjściowego z kanałami haptycznymi pamiętaj, że kanały haptyczne są przedstawiane w danych jako dodatkowe kanały.
Przykład
Jeśli maska kanału dla strumienia wyjściowego wygląda tak:
AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A
Wtedy każda próbka powinna wyglądać tak:
AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A
- Użyj profilu wyjściowego z kanałem haptycznym.
Zmień
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)
nafalse
, aby odtwarzać kanał haptyczny.- Domyślnie kanały haptyczne są wyciszone (
true
). - Przypadki użycia obejmują dzwonki i dźwięki interfejsu z synchronicznymi wibracjami i sprzężeniem zwrotnym.
- Domyślnie kanały haptyczne są wyciszone (
Interfejs HAL wibratora musi obsługiwać sterowanie zewnętrzne.
- W przypadku implementacji HIDL użyj
setExternalControl(bool enabled) generates (Status status)
. - W przypadku implementacji AIDL użyj
void setExternalControl(in boolean enabled)
.
- W przypadku implementacji HIDL użyj
Rysunek 8. Implementacja haptyki połączonej z dźwiękiem
Reakcje haptyczne połączone z dźwiękiem: generator reakcji haptycznych
HapticGenerator
to efekt dźwiękowy
wprowadzony w Androidzie 12, który może generować dane haptyczne z kanału audio i odtwarzać je w czasie rzeczywistym jako haptyczne efekty dźwiękowe.
Efekt jest stosowany do AudioTrack
, jak pokazano na rysunku 9.
Rysunek 9. Architektura generatora reakcji haptycznych
Aby zapewnić, że algorytm generatora haptycznego generuje haptyczne efekty wysokiej jakości, dostosuj algorytm generowania do wibracyjnego silnika urządzenia, dostosowując parametry, które konfigurują łańcuch filtrów stosowanych do przebiegów dźwiękowych. W tej sekcji szczegółowo opisane są te parametry oraz wyjaśniono, jak je dostosować do specyfikacji sprzętu.
Częstotliwość rezonansowa dla filtra pasmowego
Częstotliwość rezonansowa wibratora to częstotliwość, przy której siłownik dotykowy osiąga maksymalną moc. Ten parametr dostosowuje antyrezonans, aby częściowo spłaszczyć funkcję przesyłania odpowiedzi w celu uzyskania większej przepustowości. Platforma Androida automatycznie łączy tę wartość z wynikiem metody wibratora HAL
IVibrator.getResonantFrequency
.Wartość domyślna tego parametru to 150 Hz. Możesz to zmienić w tym kodzie.
Moc normalizacji dla Envelope Slow
Ten parametr określa wykładnik w częściowej normalizacji (automatycznej regulacji wzmocnienia). Jego wartość domyślna to -0,8, co oznacza, że 80% różnicy dynamicznego zakresu jest usuwane przez ten krok kontroli wzmocnienia. Możesz to zmienić w kodzie tutaj.
Współczynnik Q dla filtra dolnoprzepustowego
Współczynnik jakości wibratora (Q) zależy od 2 parametrów:
Zero Q, czyli współczynnik jakości zer w filtrze dolnoprzepustowym, który częściowo niweluje rezonans.
Pole Q, współczynnik jakości biegunów w filtrze pasmowym.
Stosunek tych 2 wartości ogranicza tłumienie rezonansu, aby wzmocnić niższe częstotliwości i rozszerzyć odpowiedź algorytmu. Na przykład wartości domyślne 8 dla Q Zero i 4 dla Q Pole dają współczynnik 2, co ogranicza tłumienie rezonansu o współczynnik 2 (6 dB). Platforma Androida łączy obie wartości z wynikiem metody Vibrator HAL
IVibrator.getQFactor
.Jeśli wartości domyślne nie uwzględniają tłumienia siły silnika w urządzeniu, zalecamy zmodyfikowanie obu wartości jednocześnie, zwiększając je lub zmniejszając. Współczynnik Q 0 do Q Pole powinien być większy niż 1. Możesz to zmienić w kodzie tutaj.
Częstotliwość zniekształceń
Częstotliwość skrajna jest stosowana przez filtr dolnoprzepustowy, który tłumi wibracje o niskim poziomie i wzmacnia wyższe poziomy za pomocą zniekształcenia sześciennego. Domyślna wartość to 300 Hz. Możesz to zmienić w kodzie tutaj.
Próg wzmocnienia wejściowego i próg kostki dla zniekształceń
Te parametry są używane przez nieliniowy filtr zniekształcający zastosowany do sygnału wejściowego, który tłumi amplitudę sygnałów o niższej częstotliwości i zwiększa amplitudę sygnałów o wyższej częstotliwości.
- Wartością domyślną dla współczynnika wzmocnienia wejścia jest 0,3.
- Domyślna wartość progu w kostce to 0,1.
Zalecamy zmianę obu wartości. Znajdziesz je w kodzie tutaj.
Więcej informacji o funkcji stosowanej przez ten filtr znajdziesz w tym miejscu. Aby dowiedzieć się więcej o tym, jak te 2 parametry wpływają na dane wyjściowe, zalecamy narysowanie odpowiedzi częstotliwościowej filtrów i obserwowanie, jak zmienia się ta odpowiedź przy różnych wartościach parametrów.
Wyjście wzmocnienia dla zniekształcenia
Ten parametr kontroluje końcową amplitudę wibracji. Jest to końcowy wzmocnienie, które jest stosowane po łagodnym ograniczniku, który ogranicza amplitudy wibracji do wartości poniżej 1. Wartość domyślna to 1, 5.Można ją zmienić w kodzie tutaj. Jeśli wibracje są zbyt słabe, zwiększ ich wartość. Jeśli słychać grzechotanie w układzie wykonawczym, zmniejsz wartość.