Wszystkie ulepszenia platformy Androida związane z haptyką są oparte na zestawie zasad UX, które rozwijają się w tym samym tempie. Obecne zasady polegają na zastąpieniu wibracji wyraźnymi wibracjami i testowaniu bogatych wibracji.
Rysunek 1. aktualne 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 (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 haptycznego wyraźne sygnały haptyczne są generowane jako pojedynczy element (np. jeden efekt haptyczny na jedno zdarzenie wejściowe).
Android ma na celu zapewnienie wyraźnych wibracji o silnych, ale ostrych odczuciach, a nie wibracji, które są rozmyte lub nieprecyzyjne.
Wstępnie zdefiniowane stałe haptyczne utworzone w celu obsługi wyraźnych haptycznych informacji zwrotnych obejmują te elementy:
CLOCK_TICKCONFIRMCONTEXT_CLICKGESTURE_ENDGESTURE_STARTKEYBOARD_PRESSKEYBOARD_RELEASEKEYBOARD_TAPLONG_PRESSREJECTTEXT_HANDLE_MOVEVIRTUAL_KEYVIRTUAL_KEY_RELEASE
EFFECT_CLICKEFFECT_DOUBLE_CLICKEFFECT_HEAVY_CLICKEFFECT_TICK
Budowanie wspólnej wiedzy wśród producentów urządzeń i deweloperów jest kluczem do podniesienia ogólnej jakości haptyki w ekosystemie Androida. Aby dowiedzieć się więcej o implementacji haptyki, zapoznaj się z podstawową listą kontrolną, oceną 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ę bogatych wibracji o wysokiej kompozycyjności i możliwości dostosowywania z dużą precyzją. Te przypadki użycia są obsługiwane w Androidzie 11 i starszych wersjach.
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 panelu dotykowym (np. przeciągania, przesuwania, eksplorowania powierzchni z fantastyczną teksturą haptyczną), powtarzające się efekty haptyczne powinny być wyraźne i subtelne.
Jeśli efekt jest bardziej brzęczący niż wyraźny, odstępy między powtórzeniami prawdopodobnie zostaną zlikwidowane. W efekcie powstaje jeden długi sygnał wibracyjny, a nie kilka oddzielnych 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.
Wdrożenie haptycznej tekstury powierzchni dla gestów przesuwania i przeciągania
Używaj właściwości CLOCK_TICK i TEXT_HANDLE_MOVE w usłudze 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ą addPrimitive(int primitiveID, float scale, int delay) możesz dostosować charakterystykę powtórzenia i skalę amplitudy. Obsługa zależy od funkcji CAP_COMPOSE_EFFECTS interfejsu HAL wibratora.
Przypadek użycia 2. Długie wibracje z efektem łagodnego początku
Długa wibracja to płynna wibracja o amplitudzie przechodzącej od 0 do docelowej. Długie wibracje mogą generować zauważalne wibracje przyciągające uwagę. Jednak nagłe, długie wibracje mogą 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 się zwiększać w kierunku amplitudy docelowej.
Zastosuj efekt łagodnego początku
Sprawdź możliwości sprzętowe sterowania amplitudą za pomocą funkcji
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. Reakcje haptyczne powiązane 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ągnąć 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 mocne, ale krótkie wibracje, które tworzą dyskretne wzorce rytmiczne. W połączeniu z wysokim poziomem bodźców, jakie zapewniają długie wibracje, skutecznie przyciąga to uwagę użytkownika.
Warto wziąć pod uwagę rytmiczne wzorce odczuwania. Jeśli nie ma poczucia rytmu, użytkownik odbiera wibracje jako przypadkowe drgania i zwykle je ignoruje.
Rysunek 6. Przykład haptyki pary audio.
Haptyka sprzężona 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
MediaPlayerlubSoundPool.- 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ąMediaPlayeriSoundPool.
- 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_AKaż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 zastosowania 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 jakiegokolwiek innego efektu audio. Jego dane wyjściowe zastępują wszystkie poprzednie dane haptyczne w strumieniu.
Aby mieć pewność, że algorytm generatora haptycznego generuje wysokiej jakości haptykę, dostosuj algorytm generowania do silnika wibratora 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 HAL wibratora
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% różnic w zakresie dynamicznym. 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:
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ą współczynnik 2, co ogranicza tłumienie rezonansu o czynnik 2 (6 dB). Platforma Android łączy obie wartości z wynikiem metody
IVibrator.getQFactorinterfejsu 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ększając lub zmniejszając je. Stosunek wartości Q zera do wartości Q 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ślnie jest to 300 Hz. Możesz to 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 wejściowego przebiegu, 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 ograniczniku programowym, który ogranicza amplitudy wibracji do wartości mniejszych niż 1. Jego 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ść.