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 | Dodano rok |
---|---|---|
android.view.HapticFeedbackConstants |
|
Przed 2016 r. |
|
2017 r. (Android 8) | |
|
2020 (Android 11) | |
android.View |
|
Przed 2016 r. |
android.os.Vibrator |
|
Przed 2016 r. |
|
2017 r. (Android 8) | |
|
2020 r. (Android 11) | |
android.os.Efekt wibracyjny |
|
2017 r. (Android 8) |
|
2019 r. (Android 10) | |
android.os.VibrationEffect.Composition |
|
2020 r. (Android 11) |
android.media.AudioAttributes.Builder |
|
2019 (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 buzzerem jako zamiennika dźwięku dzwonka 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 silnym, ale czystym brzmieniu, a nie o nieokreślonym lub niewyraźnym.
Poniżej znajdziesz zdefiniowane wstępnie stałe
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
Dzielenie się wspólną wiedzą między producentami urządzeń i deweloperami jest kluczem do podniesienia ogólnej jakości reakcji haptycznych 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ć bogate haptyczne efekty z dużą możliwością ich komponowania i dostosowywania z wysoką precyzją. 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. Rezultatem jest jeden długi szum, a nie kilka odrębnych sygnałów.
Jeśli amplituda jest zbyt mała, wyczuwalna energia haptyczna narasta podczas powtarzania, co powoduje, że na końcu powtórzenia staje się ona przytłaczająca.
Zastosuj prostą teksturę haptyczną na potrzeby gestów przesuwania i przeciągania
Użyj 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, skomponuj projekt, łącząc 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 użycia 2. Długie wibracje z efektem wygładzania
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 i bardziej przyjemne wibracje, na początku długich wibracji zastosuj efekt „łagodności”. Powoduje to płynne przejście do amplitudy docelowej.
Zastosuj efekt łagodnego wejścia
Sprawdź możliwości sprzętowe regulacji amplitudy za pomocą funkcji
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. Długa krzywa prostoty wibracji
Przypadek użycia 3. Reakcje haptyczne połączone z dźwiękiem
Reakcja haptyczna sprzężona z dźwiękiem to schematy haptyczne połączone z rytmem dźwięku, aby przyciągnąć 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 wysokimi bodźcami zapewnianymi przez długie wibracje bardzo skutecznie przyciąga to uwagę użytkownika.
Należy wziąć pod uwagę wzorce rytmiczne. Bez poczucia rytmu użytkownik postrzega odczucia dotykowe jako losowe wibracje i często je ignoruje.
Rysunek 7. Przykład dźwięku z haptyką
Haptyka połączona 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 jako dodatkowe kanały w danych.
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.
Aby włączyć kanał haptyczny, zmień
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)
nafalse
.- Domyślnie kanały haptyczne są wyciszone (
true
). - Obejmuje to dzwonki i dźwięki interfejsu z synchroniczną reakcją haptyczną i informacjami zwrotnymi.
- 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 elementu AudioTrack
w sposób opisany na rys. 9.
Rysunek 9. Architektura generatora reakcji haptycznych
Aby mieć pewność, że algorytm generatora haptycznego generuje haptyczne efekty wysokiej jakości, dopasuj 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 znajdziesz szczegółowe informacje na temat tych parametrów oraz dowiesz się, jak je dostosować do specyfikacji sprzętowej.
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 antyrezonator, aby częściowo spłaszczyć funkcję transferu odpowiedzi w celu uzyskania większej przepustowości. Platforma Androida automatycznie łączy tę wartość z danymi wyjściowymi metody HAL Vibrator
IVibrator.getResonantFrequency
.Wartość domyślna tego parametru to 150 Hz. Można to zmienić w kodzie tutaj.
Moc normalizacji dla powolnego opóźnienia
Ten parametr określa wykładnik w częściowej normalizacji (automatycznej regulacji wzmocnienia). Jego wartość domyślna to -0,8, co oznacza, że 80% zmienności 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 Q0/Qp powinien być większy niż 1. Możesz to zmienić w kodzie tutaj.
Częstotliwość zniekształceń
Częstotliwość narożników jest stosowana przez filtr dolnoprzepustowy, który tłumi wibracje o niskim poziomie i wzmacnia wyższe poziomy z wykorzystaniem zniekształcenia sześciennego. Domyślne ustawienie to 300 Hz. Możesz to zmienić w kodzie tutaj.
Wzmocnienie wejściowe i próg sześcienny 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ść domyślna współczynnika wzmocnienia wejścia to 0,3.
- Wartością domyślną progu w kostce jest 0,1.
Zalecamy zmianę obu tych wartości jednocześnie. Znajdziesz je w kodzie tutaj.
Więcej informacji o funkcji stosowanej przez ten filtr znajdziesz w tym miejscu. Aby dowiedzieć się więcej o wpływie tych 2 parametrów na dane wyjściowe, zalecamy sporządzenie wykresu odpowiedzi częstotliwości filtrów i obserwację, jak zmieniają się one wraz z różnymi wartościami parametrów.
Wyjście wzmocnienia dla zniekształcenia
Ten parametr określa końcową amplitudę wibracji. To końcowy wzmocnienie stosowany po miękkim ograniczniku, który ogranicza amplitudę 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 wartość. Jeśli słychać grzechotanie w układzie wykonawczym, zmniejsz wartość.