Wszystkie ulepszenia platformy Android związane z haptyką są oparte na zestawie zasad UX, które rozwijają się w tym samym tempie. Obecne zasady obejmują zastąpienie wibracji wyraźnymi reakcjami haptycznymi i zbadanie bogatych reakcji haptycznych.
Rysunek 1. Obecne zasady.
W tabeli poniżej znajdziesz wszystkie dostępne interfejsy API haptyki:
Interfejs API | Metody i stałe | Rok dodania |
---|---|---|
android.view.HapticFeedbackConstants |
|
Przed 2016 r. |
|
2017 (Android 8) | |
|
2020 r. (Android 11) | |
android.View |
|
Przed 2016 r. |
android.os.Vibrator |
|
Przed 2016 r. |
|
2017 (Android 8) | |
|
2020 r. (Android 11) | |
android.os.VibrationEffect |
|
2017 (Android 8) |
|
2019 r. (Android 10) | |
android.os.VibrationEffect.Composition |
|
2020 r. (Android 11) |
android.media.AudioAttributes.Builder |
|
2019 r. (Android 10) |
Wibracje
Pochodzące z pagerów i telefonów z podstawową przeglądarką wibracje oparte na brzęczyku, które są niskiej jakości, ale energooszczędne, były używane jako zamiennik dzwonka w trybie cichym. Starsze komponenty sprzętowe, które generują głośne i nieprzyjemne dźwięki, mogą pogorszyć wrażenia dotykowe, ponieważ zapewniają niską jakość (np. w przypadku taniego, zepsutego telefonu).
Wyczyść haptykę
Wyraźne wibracje obsługują odczuwanie dyskretnych zmian stanu (np. zmian binarnych podczas włączania i wyłączania urządzenia). Ze względu na charakter dyskretnego sygnału dotykowego wyraźne sygnały dotykowe są generowane jako pojedynczy element (np. jeden efekt dotykowy na jedno zdarzenie wejściowe).
Android zapewnia wyraźne wibracje o silnych, ale ostrych odczuciach, a nie wibracje rozmyte lub nieostre.
Wstępnie zdefiniowane stałe haptyczne, które zostały utworzone w celu obsługi wyraźnych haptycznych, obejmują te elementy:
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 deweloperów ma kluczowe znaczenie dla podniesienia ogólnej jakości haptyki w ekosystemie Androida. Więcej informacji o implementacji haptyki znajdziesz w podstawowej liście kontrolnej, ocenie sprzętu i CDD.
Rysunek 2. Naciśnij i zwolnij.
Rozbudowane reakcje haptyczne
Zaawansowane haptyczne to rozwijająca się kategoria haptycznych, która wykracza poza efekty oparte na pojedynczych impulsach. Android ma na celu obsługę zaawansowanych wibracji o wysokiej kompozycyjności i możliwości dostosowywania z dużą precyzją. Te przypadki użycia są obsługiwane na urządzeniach z Androidem 11 lub starszym.
Rysunek 3. Bogate elementy dotykowe z przesuwaną teksturą.
Rysunek 4. przeciąganie i przesuwanie;
Przypadek użycia 1. Przesuwanie tekstury
Jeśli efekt haptyczny jest powtarzany podczas przesuwania palca po powierzchni dotykowej (np. przeciągania, przesuwania, eksplorowania powierzchni z fantastyczną teksturą haptyczną), powtarzające się efekty haptyczne powinny być wyraźne i subtelne.
Jeśli efekt indywidualny jest bardziej szumiący niż wyraźny, odstępy między powtórzeniami prawdopodobnie zostaną zlikwidowane. W efekcie powstaje jeden długi sygnał, a nie kilka odrębnych sygnałów.
Jeśli amplituda nie jest wystarczająco subtelna, odczuwalna energia haptyczna narasta z powtórzeniami, co powoduje, że na końcu powtórzenia wibracje są zbyt silne.
Wdrażanie haptycznej tekstury powierzchni dla gestów przesuwania i przeciągania
Używaj właściwości CLOCK_TICK
i TEXT_HANDLE_MOVE
w HapticFeedbackConstants
.
Te stałe wartości określają z wyprzedzeniem charakterystykę powtórzeń i amplitudy.
Tworzenie własnego efektu
Aby utworzyć własny efekt, skomponuj projekt, łącząc sekwencje PRIMITIVE_CLICK
i PRIMITIVE_TICK
w VibrationEffect.Composition
.
Za pomocą ikony addPrimitive(int primitiveID, float scale, int delay)
możesz dostosować charakterystykę powtórzenia i skalę amplitudy. Obsługa zależy od CAP_COMPOSE_EFFECTS
interfejsu Vibrator HAL.
Przypadek użycia 2. Długie wibracje z efektem łagodnego początku
Długie wibracje to płynne wibracje o amplitudzie przechodzącej od 0 do docelowej amplitudy. Długie wibracje mogą generować zauważalne wibracje przyciągające uwagę. Nagłe, długie wibracje mogą jednak zaskoczyć użytkowników w cichym otoczeniu i często powodują słyszalne brzęczenie. Aby wygenerować przyjemniejsze długie wibracje, zastosuj efekt łagodnego narastania na początku długich wibracji. W ten sposób uzyskasz płynne przejście amplitudy, które będzie zmierzać do docelowej amplitudy.
Zastosuj efekt łagodnego początku
Sprawdź możliwości sprzętowe sterowania amplitudą za pomocą
android.os.Vibrator.hasAmplitudeControl()
.- Aby uzyskać efekt łagodnego wchodzenia z różną amplitudą, wynik musi wynosić
true
.
- Aby uzyskać efekt łagodnego wchodzenia z różną amplitudą, wynik musi wynosić
Użyj
VibrationEffect
.createWaveform(timings[], amplitudes[], int repeat)
.Dostosuj serię
timings[]
iamplitudes[]
, aby wygenerować krzywą łagodnego przyspieszenia, jak pokazano na rysunku 5.
Rysunek 5. Krzywa łagodnego narastania długich wibracji.
Przypadek użycia 3. Haptyka sprzężona z dźwiękiem
Haptyka sprzężona z dźwiękiem to wzorce haptyczne sprzężone z rytmem dźwięku, które mają przyciągać uwagę użytkownika.
Haptyka sprzężona z dźwiękiem: korzyści
Aby wdrożyć haptykę sprzężoną z dźwiękiem, połącz wyraźne wibracje z długimi wibracjami. Wyraźne wibracje to silne, ale krótkie wibracje, które tworzą odrębne rytmiczne wzorce. W połączeniu z wysokim poziomem bodźców, jakie zapewniają długie wibracje, skutecznie przyciąga to uwagę użytkownika.
Ważne jest, aby wziąć pod uwagę rytmiczne wzorce odczuwania. Jeśli nie ma poczucia rytmu, użytkownik odbiera wibracje jako przypadkowe brzęczenie i zwykle je ignoruje.
Rysunek 6. Przykład sprzężenia haptycznego dźwięku.
Reakcje haptyczne powiązane z dźwiękiem: wskazówki dotyczące implementacji
Wdrożenie haptyki sprzężonej z dźwiękiem wymaga podstawowej wiedzy o odtwarzaniu treści na kanałach audio i haptycznych. Pamiętaj o tych kwestiach:
Użyj klas
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 (
Wskaż obsługę haptyki i odtwarzania dźwięku w
audio_policy_configuration.xml
.- 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ą prezentowane 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
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 odtworzyć kanał haptyczny.- Domyślnie kanały haptyczne są wyciszone (
true
). - Przykłady zastosowań to dzwonki i dźwięki interfejsu z synchronicznymi wibracjami i informacjami zwrotnymi.
- Domyślnie kanały haptyczne są wyciszone (
Warstwa 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 7. Wdrażanie haptyki sprzężonej z dźwiękiem.
Reakcje haptyczne sprzężone z dźwiękiem: HapticGenerator
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 haptykę sprzężoną z dźwiękiem. Efekt jest stosowany do AudioTrack
, jak pokazano na rysunku 8:
Rysunek 8. Architektura generatora haptycznego.
Ta wizualizacja architektury pokazuje, gdzie generator haptyczny jest stosowany do przychodzącego strumienia audio użytkownika, zanim zostanie on wysłany do warstwy HAL audio. Generator jest stosowany po tym, jak funkcja AudioMixer
podzieli dane audio i haptyczne, a przed zastosowaniem innych efektów audio. Jego dane wyjściowe zastępują wszystkie poprzednie dane haptyczne w strumieniu.
Aby mieć pewność, że algorytm generatora haptycznego generuje haptykę wysokiej jakości, dostosuj algorytm generowania do silnika wibracyjnego urządzenia, modyfikując parametry konfigurujące łańcuch filtrów stosowanych do przebiegów dźwiękowych. W tej sekcji szczegółowo opisujemy te parametry i wyjaśniamy, jak je dostosować do specyfikacji sprzętu.
Częstotliwość rezonansowa filtra pasmowego
Częstotliwość rezonansowa wibratora to częstotliwość, przy której siłownik haptyczny osiąga maksymalną moc wyjściową. Ten parametr dostosowuje antyrezonator, aby częściowo spłaszczyć funkcję przenoszenia odpowiedzi i uzyskać szersze pasmo. Platforma Android automatycznie łączy tę wartość z wynikiem działania metody Vibrator HAL
IVibrator.getResonantFrequency
.Domyślna wartość tego parametru to 150 Hz. Możesz ją zmienić w kodzie.
Moc normalizacji dla powolnej obwiedni
Ten parametr określa wykładnik w częściowej normalizacji (automatyczna kontrola wzmocnienia). Jego wartość domyślna to –0,8, co oznacza, że ten krok kontroli wzmocnienia usuwa 80% zakresu dynamicznego. Możesz to zmienić w kodzie.
Współczynnik Q dla filtra pasmowego
Współczynnik jakości wibratora (współczynnik Q) jest określany przez 2 parametry:
Wartość Zero Q, czyli współczynnik jakości zer w filtrze pasmowym, który częściowo tłumi rezonans.
Pole Q, czyli 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 poszerzyć zakres odpowiedzi algorytmu. Na przykład domyślne wartości 8 dla parametru Zero Q i 4 dla parametru Pole Q dają stosunek 2, co ogranicza tłumienie rezonansu o czynnik 2 (6 dB). Platforma Android łączy obie wartości z wynikiem metody
IVibrator.getQFactor
interfejsu HAL wibratora.Jeśli wartości domyślne nie uwzględniają tłumienia siły silnika w urządzeniu, zalecamy jednoczesne zmodyfikowanie obu wartości – zwiększenie lub zmniejszenie obu. Stosunek wartości Q dla zera do wartości Q dla bieguna powinien być większy niż 1. Możesz to zmienić w kodzie.
Częstotliwość graniczna zniekształceń
Częstotliwość graniczna 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 ją zmienić w kodzie.
Wzmocnienie sygnału wejściowego i próg kostki dla zniekształceń
Te parametry są używane przez filtr zniekształceń nieliniowych stosowany do kształtu fali wejściowej, 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.
- Domyślna wartość współczynnika wzmocnienia sygnału wejściowego to 0,3.
- Domyślna wartość progu kostki to 0,1.
Zalecamy modyfikowanie obu wartości jednocześnie. Znajdziesz je w kodzie.
Więcej informacji o funkcji stosowanej przez ten filtr znajdziesz w kodzie.
Aby dowiedzieć się więcej o tym, jak te 2 parametry wpływają na wynik, zalecamy wykreślenie odpowiedzi częstotliwościowych filtrów i obserwowanie, jak zmieniają się one w zależności od wartości parametrów.
Wzmocnienie wyjściowe dla zniekształceń
Ten parametr kontroluje ostateczną amplitudę wibracji. Jest to ostateczne wzmocnienie stosowane po miękkim ograniczniku, który ogranicza amplitudy wibracji do wartości mniejszych niż 1. Jej wartość domyślna to 1,5, ale możesz ją zmienić w kodzie.
Jeśli wibracje są zbyt słabe, zwiększ wartość. Jeśli słyszysz, że siłownik grzechocze, zmniejsz wartość.