Wszystkie ulepszenia platformy Android oparte na haptyce opierają się na zestawie zasad UX, które ewoluują w równym tempie. Obecne zasady obejmują zastąpienie brzęczących wibracji wyraźnymi elementami dotykowymi i eksplorowanie bogatych elementów dotykowych .
Rysunek 1. Aktualne zasady
W poniższej tabeli wymieniono wszystkie dostępne interfejsy API dotyku.
API | Metody | Rok dodany |
---|---|---|
android.view.HapticFeedbackStałe |
| Przed 2016 rokiem |
| 2017 (Android 8) | |
| 2020 (Android 11) | |
Android.Wyświetl |
| Przed 2016 rokiem |
Wibrator android.os |
| Przed 2016 rokiem |
| 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) |
Gwarne wibracje
Począwszy od pagerów i telefonów z internetem, niskiej jakości, ale energooszczędne wibracje oparte na brzęczyku ERM były stosowane jako substytut dzwonienia w trybie cichym . Starsze komponenty sprzętowe, które wytwarzają głośne i nieprzyjemne dźwięki, mogą zaszkodzić dotykowemu UX, zapewniając wrażenia o niskiej jakości (na przykład tani, zepsuty telefon).
Wyczyść dotyk
Wyraźne wrażenia dotykowe wspierają wrażenie dyskretnych zmian stanu (na przykład zmian binarnych podczas procesu włączania/wyłączania zasilania). Ze względu na charakter dyskretnej afordancji, wyraźne elementy dotykowe są generowane jako pojedyncza jednostka (na przykład jeden efekt dotykowy na jedno zdarzenie wejściowe).
Celem Androida jest zapewnienie wyraźnego wrażenia dotykowego z mocnymi, ale ostrymi wrażeniami, a nie wrażeń, które są brzęczące lub papkowate.
Predefiniowane stałe haptyczne, które są tworzone w celu obsługi jasnej haptyki, obejmują poniższe.
-
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
W VibrationEffect
:
-
EFFECT_CLICK
-
EFFECT_DOUBLE_CLICK
-
EFFECT_HEAVY_CLICK
-
EFFECT_TICK
Budowanie wspólnej wiedzy pomiędzy producentami urządzeń i programistami jest kluczem do podniesienia ogólnej jakości elementów dotykowych w ekosystemie Androida. Skorzystaj z podstawowej listy kontrolnej , oceny sprzętu i CDD . aby dowiedzieć się więcej o implementacji dotykowej.
Rysunek 3. Naciskanie i zwalnianie.
Bogata hatyka
Bogata haptyka to rozwijająca się kategoria haptyki, która wykracza poza efekty oparte na pojedynczych impulsach. Android ma na celu obsługę bogatej obsługi dotykowej z dużą możliwością komponowania i dostosowywania z wysokim poziomem szczegółowości. Poniższe przypadki użycia są obsługiwane w systemie Android 11 lub starszym.
Rysunek 4. Bogata hatyka z przesuwaną teksturą
Rysunek 5. Przeciąganie i przesuwanie
Przypadek użycia 1: Przesuwana tekstura
Jeśli efekt dotykowy powtarza się, gdy palec przesuwa się po powierzchni dotykowej (na przykład przeciąganie, przesuwanie, eksplorowanie powierzchni fantomową teksturą dotykową), powtarzające się efekty dotykowe są korzystnie wyraźne i subtelne.
Jeśli indywidualny efekt jest raczej intensywny niż wyraźny, wówczas przerwy między powtórzeniami prawdopodobnie zostaną wymazane. Rezultatem jest jeden długi szum, a nie wiele dyskretnych sygnałów.
Jeśli amplituda nie jest wystarczająco subtelna, wówczas postrzegana energia dotykowa narasta w trakcie powtarzania, co skutkuje przytłaczająco silnym dotykiem pod koniec powtórzenia.
Implementacja prostej powierzchniowej tekstury dotykowej dla gestów przesuwania i przeciągania
Użyj CLOCK_TICK
i TEXT_HANDLE_MOVE
w HapticFeedbackConstants
. Stałe te z góry definiują charakterystykę powtarzalności i amplitudy.
Tworzenie własnego efektu
Aby stworzyć własny efekt, skomponuj projekt, łącząc ze sobą sekwencje PRIMITIVE_CLICK
i PRIMITIVE_TICK
w VibrationEffect.Composition
. Możesz dostosować charakterystykę skali powtarzania i amplitudy za pomocą addPrimitive(int primitiveID, float scale, int delay)
. Wsparcie opiera się na możliwościach CAP_COMPOSE_EFFECTS
interfejsu HAL wibratora .
Przypadek użycia 2: Długie wibracje z efektem rozluźnienia
Wibracje długie to wibracje o płynnej amplitudzie, które zmieniają się od 0 do amplitudy docelowej. Długie wibracje mogą generować łatwo zauważalne wrażenia dotykowe. Jednakże nagła, długa wibracja może przestraszyć użytkowników w cichym otoczeniu i często powoduje słyszalne brzęczenie. Aby wygenerować przyjemniejsze długie wibracje, zastosuj efekt rozluźnienia na początku długich wibracji. Powoduje to płynne przejście amplitudy, które narasta w kierunku amplitudy docelowej.
Stosowanie efektu easy-in
Sprawdź możliwości sprzętowe kontroli amplitudy za pomocą
android.os.Vibrator.hasAmplitudeControl()
.- Wynik musi być
true
, aby uzyskać efekt rozluźnienia o różnej amplitudzie.
- Wynik musi być
Użyj
VibrationEffect
.createWaveform(timings[], amplitudes[], int repeat)
.Dostosuj serię
timings[]
iamplitudes[]
, aby wygenerować krzywą łatwości, jak pokazano na rysunku 6.
Rysunek 6. Krzywa łagodności długich drgań
Przypadek użycia 3: Elementy dotykowe sprzężone z dźwiękiem
Elementy dotykowe sprzężone z dźwiękiem to wzory dotykowe połączone z rytmem dźwięku w celu przyciągnięcia uwagi użytkownika.
Elementy dotykowe sprzężone z dźwiękiem: Korzyści
Aby wdrożyć elementy dotykowe sprzężone z dźwiękiem, połącz wyraźne elementy dotykowe z długimi wibracjami. Silne, ale krótkie wrażenia dotykowe z wyraźnych elementów dotykowych zapewniają dyskretne wzory rytmiczne. W połączeniu z wysokim poziomem bodźców, jakie zapewniają długie wibracje, świetnie sprawdza się to przy przyciąganiu uwagi użytkownika.
Ważne jest, aby wziąć pod uwagę wzorce rytmiczne odczuwania. Jeśli nie ma wyczucia rytmu, użytkownik postrzega wrażenia dotykowe jako przypadkowe brzęczenie i ma tendencję do ich ignorowania.
Rysunek 7. Przykład dotyku pary audio
Elementy dotykowe sprzężone z dźwiękiem: wskazówki dotyczące wdrażania
Implementacja elementów dotykowych sprzężonych z dźwiękiem wymaga podstawowej wiedzy na temat odtwarzania treści zarówno w kanałach audio, jak i dotykowych. Pamiętaj o następujących kwestiach.
Użyj klas
MediaPlayer
lubSoundPool
.- Zasoby w formacie OGG ze specjalnym kluczem metadanych (
ANDROID_HAPTIC
, po którym następuje liczba kanałów dotykowych) wskazują obecność danych dotykowych i odtwarzanie za pomocąMediaPlayer
iSoundPool
.
- Zasoby w formacie OGG ze specjalnym kluczem metadanych (
Wskaż obsługę dotyku i odtwarzania dźwięku w
audio_policy_configuration.xml
.- Użyj profilu wyjściowego z kanałem dotykowym
AUDIO_CHANNEL_OUT_HAPTIC_A|B
. - W przypadku strumienia wyjściowego z kanałami dotykowymi należy pamiętać, że kanały dotykowe są prezentowane w danych jako dodatkowe kanały.
Przykład
Jeżeli maska kanału dla strumienia wyjściowego wygląda następująco:
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 dotykowym
Zmień
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)
na
false
, aby odtworzyć kanał dotykowy.- Domyślnie kanały dotykowe są wyciszone (
true
). - Przypadki użycia obejmują dzwonki i dźwięki interfejsu użytkownika z synchronicznym dotykiem i sprzężeniem zwrotnym.
- Domyślnie kanały dotykowe są wyciszone (
Wibrator HAL musi implementować obsługę zewnętrznego sterowania.
- 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 elementów dotykowych sprzężonych z dźwiękiem
Elementy dotykowe sprzężone z dźwiękiem: Generator haptyczny
HapticGenerator
to efekt audio wprowadzony w systemie Android 12, który może generować dane dotykowe z kanału audio i odtwarzać je w czasie rzeczywistym jako elementy haptyczne sprzężone z dźwiękiem . Efekt jest stosowany do AudioTrack
, jak opisano na rysunku 9.
Rysunek 9. Architektura generatora haptycznego
Aby mieć pewność, że algorytm generatora haptycznego generuje wysokiej jakości haptyki, dostrój algorytm generowania do silnika wibracyjnego urządzenia, dostosowując parametry konfigurujące łańcuch filtrów stosowanych do przebiegów audio. W tej sekcji opisano szczegółowo te parametry i wyjaśniono, jak dostroić je do specyfikacji sprzętu.
Częstotliwość rezonansowa dla filtra pasmowo-przepustowego
Częstotliwość rezonansowa wibratora to częstotliwość, przy której siłownik dotykowy osiąga maksymalną moc wyjściową. Ten parametr reguluje antyrezonator tak, aby częściowo spłaszczył funkcję przenoszenia odpowiedzi, w celu uzyskania szerszego pasma. Struktura systemu Android automatycznie łączy tę wartość z danymi wyjściowymi metody Vibrator HAL
IVibrator.getResonantFrequency
.Domyślna wartość tego parametru to 150 Hz . Można to zmodyfikować w kodzie tutaj .
Moc normalizacji dla wolnej obwiedni
Parametr ten określa wykładnik częściowej normalizacji (automatyczna kontrola wzmocnienia). Jego domyślna wartość to -0,8 , co oznacza, że ten krok kontroli wzmocnienia usuwa 80% zmian zakresu dynamicznego. Można to zmodyfikować w kodzie tutaj .
Współczynnik Q dla filtra pasmowo-zaporowego
Współczynnik jakości wibratora (współczynnik Q) zależy od dwóch parametrów:
Zero Q, współczynnik jakości zer w filtrze pasmowo-stopniowym, który częściowo eliminuje rezonans.
Biegun Q, współczynnik jakości biegunów w filtrze pasmowo-zaporowym.
Stosunek tych dwóch wartości ogranicza tłumienie rezonansu w celu wzmocnienia niższych częstotliwości i poszerzenia odpowiedzi algorytmu. Na przykład domyślne wartości 8 dla Zero Q i 4 dla Pole Q dają współczynnik 2 , ograniczając tłumienie rezonansu o współczynnik 2 (6 dB). Struktura systemu Android łączy obie wartości z danymi wyjściowymi metody Vibrator HAL
IVibrator.getQFactor
.Jeśli wartości domyślne nie uwzględniają tłumienia mocy silnika w Twoim urządzeniu, zalecamy jednoczesną modyfikację obu wartości i zwiększenie obu lub zmniejszenie obu. Stosunek Zero Q do bieguna Q powinien być większy niż 1 . Można to zmodyfikować w kodzie tutaj .
Częstotliwość narożna dla zniekształceń
Częstotliwość narożna jest stosowana przez filtr dolnoprzepustowy, który tłumi wibracje o niskim poziomie i wzmacnia wyższe poziomy za pomocą zniekształceń sześciennych. Domyślnie jest to 300 Hz . Można to zmodyfikować w kodzie tutaj .
Wzmocnienie wejściowe i próg kostki dla zniekształceń
Parametry te wykorzystywane są przez filtr zniekształceń nieliniowych zastosowany do przebiegu 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.
- Domyślna wartość współczynnika wzmocnienia wejściowego wynosi 0,3 .
- Domyślna wartość progu kostki to 0,1 .
Zalecamy łączną modyfikację obu wartości. Można je znaleźć w kodzie tutaj .
Więcej informacji na temat funkcji stosowanej przez ten filtr znajdziesz w implementacji dostępnej tutaj . Aby dowiedzieć się więcej o wpływie tych dwóch parametrów na moc wyjściową, zalecamy wykreślenie odpowiedzi częstotliwościowych filtrów i obserwację, jak zmieniają się odpowiedzi częstotliwościowe przy różnych wartościach parametrów.
Wzmocnienie wyjściowe dla zniekształceń
Parametr ten kontroluje końcową amplitudę drgań. Jest to ostateczne wzmocnienie zastosowane po miękkim ograniczniku, który ogranicza amplitudy wibracji do wartości mniejszej niż 1. Jego domyślna wartość to 1,5 i można ją zmodyfikować w tym kodzie. Jeśli wibracje są zbyt subtelne, zwiększ wartość. Jeśli słychać grzechotanie osprzętu siłownika, zmniejsz wartość.