Wszystkie ulepszenia platformy Androida oparte na haptykach są napędzane zestawem zasad UX, które ewoluują w równym tempie. Obecne zasady obejmują zastąpienie brzęczących wibracji wyraźną haptyką i badanie bogatej haptyki .
Rysunek 1. Aktualne zasady
W poniższej tabeli wymieniono wszystkie dostępne interfejsy API dotykowe.
API | Metody | Dodano rok |
---|---|---|
android.view.HapticFeedbackConstants |
| Przed 2016 r. |
| 2017 (Android 8) | |
| 2020 (Android 11) | |
android.View |
| Przed 2016 r. |
Wibrator android.os. |
| Przed 2016 r. |
| 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) |
Brzęczące wibracje
Począwszy od pagerów i telefonów z funkcjami, niskiej jakości, ale energooszczędne wibracje oparte na brzęczyku ERM były używane jako substytut dzwonka dźwiękowego w trybie cichym . Starsze komponenty sprzętowe, które wytwarzają głośne i nieprzyjemne słyszalne dźwięki, mogą zaszkodzić dotykowemu UX, dostarczając niskiej jakości wrażenia (na przykład tani, zepsuty telefon).
Wyraźna haptyka
Wyraźna haptyka wspiera odczucie dyskretnych zmian stanu (na przykład zmiany binarne podczas procesu włączania/wyłączania zasilania). Ze względu na charakter dyskretnej afordancji wyraźne haptyki są generowane jako pojedyncza jednostka (na przykład jeden efekt haptyczny na jedno zdarzenie wejściowe).
Android ma na celu zapewnienie wyraźnych wrażeń dotykowych z silnymi, ale ostrymi wrażeniami, a nie wrażeniami, które są brzęczące lub papkowate.
Wstępnie zdefiniowane stałe dotykowe, które są tworzone w celu obsługi wyraźnej dotykowej, obejmują następujące 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
W VibrationEffect
:
-
EFFECT_CLICK
-
EFFECT_DOUBLE_CLICK
-
EFFECT_HEAVY_CLICK
-
EFFECT_TICK
Budowanie wspólnej wiedzy między producentami urządzeń i programistami jest kluczem do podniesienia ogólnej jakości haptyki 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.
Bogate wrażenia dotykowe
Rich haptics to rosnąca kategoria haptyki, która wykracza poza pojedyncze efekty oparte na impulsach. Android ma na celu obsługę rozbudowanych elementów dotykowych z dużą możliwością komponowania i dostosowywania z wysokim poziomem szczegółowości. Następujące przypadki użycia są obsługiwane w systemie Android 11 lub starszym.
Rysunek 4. Bogata haptyka 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 za pomocą fantomowej tekstury dotykowej), powtarzające się efekty dotykowe są najlepiej ostre i subtelne.
Jeśli pojedynczy efekt jest bardziej brzęczący niż ostry, przerwy między powtórzeniami prawdopodobnie zostaną usunięte. Rezultatem jest jedno długie brzęczenie, a nie wiele dyskretnych sygnałów.
Jeśli amplituda nie jest wystarczająco subtelna, wtedy postrzegana energia dotykowa narasta poprzez powtórzenie, co skutkuje przytłaczająco silnym dotykiem na końcu powtórzenia.
Implementacja prostej tekstury dotykowej powierzchni do gestów przesuwania i przeciągania
Użyj CLOCK_TICK
i TEXT_HANDLE_MOVE
w HapticFeedbackConstants
. Te stałe predefiniują charakterystykę powtórzeń i amplitudy.
Tworzenie własnego efektu
Aby uzyskać własny efekt, skomponuj projekt, łącząc ze sobą sekwencje PRIMITIVE_CLICK
i PRIMITIVE_TICK
w VibrationEffect.Composition
. Możesz dostosować charakterystykę skali powtórzeń i amplitudy za pomocą addPrimitive(int primitiveID, float scale, int delay)
. Wsparcie opiera się na możliwości CAP_COMPOSE_EFFECTS
interfejsu HAL wibratora .
Przypadek użycia 2: Długie wibracje z efektem łatwości
Długie wibracje to łagodne wibracje o amplitudzie przechodzące od 0 do amplitudy docelowej. Długie wibracje mogą generować łatwo dostrzegalne wrażenia dotykowe. Jednak nagła, długa wibracja może przestraszyć użytkowników w cichym otoczeniu i często powoduje słyszalne brzęczenie. Aby wygenerować przyjemniejszą, długą wibrację, zastosuj efekt luzu na początku długiej wibracji. Daje to płynne przejście amplitudy, które narasta w kierunku amplitudy docelowej.
Stosowanie efektu łatwości
Sprawdź możliwości sprzętowe kontroli amplitudy za pomocą
android.os.Vibrator.hasAmplitudeControl()
.- Wynik musi być
true
aby uzyskać efekt luzu o różnej amplitudzie.
- Wynik musi być
Użyj
VibrationEffect
.createWaveform(timings[], amplitudes[], int repeat)
.Dostosuj serie
timings[]
iamplitudes[]
, aby wygenerować krzywą napięcia, jak pokazano na rysunku 6.
Rysunek 6. Długa krzywa łagodzenia wibracji
Przypadek użycia 3: haptyka sprzężona z dźwiękiem
Haptyka sprzężona z dźwiękiem to wzorce dotykowe połączone z rytmem dźwięku, aby zwrócić uwagę użytkownika.
Dotykowe sprzężenie dźwiękowe: zalety
Aby zaimplementować haptykę sprzężoną z dźwiękiem, połącz wyraźną haptykę z długimi wibracjami. Silne, ale krótkie wrażenia dotykowe z wyraźnych wrażeń dotykowych dostarczają dyskretnych wzorców rytmicznych. W połączeniu z wysokimi poziomami bodźców, które zapewniają długie wibracje, świetnie sprawdza się to, aby zwrócić uwagę użytkownika.
Ważne jest, aby wziąć pod uwagę rytmiczne wzorce wrażeń. Jeśli nie ma poczucia rytmu, użytkownik postrzega wrażenia dotykowe jako przypadkowe brzęczenia i zwykle je ignoruje.
Rysunek 7. Przykład haptyki pary audio
Haptyka sprzężona z dźwiękiem: wskazówki dotyczące wdrażania
Wdrażanie haptyki sprzężonej z dźwiękiem wymaga podstawowej wiedzy na temat odtwarzania zawartości zarówno kanałów audio, jak i haptycznych. Pamiętaj o następujących rzeczach.
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
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ś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
Zmień
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)
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 synchroniczną haptyką i sprzężeniem zwrotnym.
- Domyślnie kanały dotykowe są wyciszone (
Wibrator HAL musi wdrożyć zewnętrzne wsparcie sterowania.
- W przypadku implementacji HIDL należy użyć
setExternalControl(bool enabled) generates (Status status)
. - W przypadku implementacji AIDL należy użyć
void setExternalControl(in boolean enabled)
.
- W przypadku implementacji HIDL należy użyć
Rysunek 8. Implementacja haptyki sprzężonej z dźwiękiem
Haptyka sprzężona z dźwiękiem: Generator dotykowy
HapticGenerator
to efekt dźwiękowy wprowadzony w systemie Android 12, który może generować dane dotykowe z kanału audio i odtwarzać je w czasie rzeczywistym jako sprzężone dźwięki . Efekt jest stosowany do AudioTrack
, jak opisano na rysunku 9.
Rysunek 9. Architektura generatora dotykowego
Aby upewnić się, że algorytm generatora haptycznego generuje wysokiej jakości haptyczne, dostosuj algorytm generowania do silnika wibratora urządzenia, dostosowując parametry, które konfigurują łańcuch filtrów stosowany do przebiegów dźwiękowych. W tej sekcji szczegółowo opisano te parametry i wyjaśniono, jak dostosować je do specyfikacji sprzętu.
Częstotliwość rezonansowa dla filtra pasmowego
Częstotliwość rezonansowa wibratora to częstotliwość, przy której siłownik dotykowy ma maksymalną moc wyjściową. Ten parametr reguluje antyrezonator, aby częściowo spłaszczyć funkcję przenoszenia odpowiedzi, aby uzyskać szersze pasmo. Platforma systemu Android automatycznie łączy tę wartość z danymi wyjściowymi metody
IVibrator.getResonantFrequency
w programie Vibrator HAL .Domyślna wartość tego parametru to 150Hz . Można to zmienić w kodzie tutaj .
Moc normalizacji dla wolnej obwiedni
Ten parametr określa wykładnik w częściowej normalizacji (automatyczna kontrola wzmocnienia). Jego wartość domyślna to -0,8 , co oznacza, że 80% zmienności zakresu dynamicznego jest usuwane przez ten krok regulacji wzmocnienia. Można to zmienić w kodzie tutaj .
Współczynnik Q dla filtra pasmowego
Współczynnik jakości wibratora (współczynnik Q) jest określony przez dwa parametry:
Zero Q, współczynnik jakości zer w filtrze pasmowym, który częściowo eliminuje rezonans.
Polak Q, współczynnik jakości biegunów w filtrze pasmowym.
Stosunek tych dwóch wartości ogranicza tłumienie rezonansu w celu podbicia niższych częstotliwości i poszerzenia odpowiedzi algorytmu. Na przykład domyślne wartości 8 dla Zero Q i 4 dla bieguna Q dają stosunek 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 siły silnika w twoim urządzeniu, zalecamy zmianę obu wartości w tym samym czasie i zwiększenie obu lub zmniejszenie obu. Stosunek zera Q do bieguna Q powinien być większy niż 1 . Można to zmienić w kodzie tutaj .
Częstotliwość narożna dla zniekształceń
Częstotliwość narożna jest nakładana 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 zmienić w kodzie tutaj .
Wzmocnienie wejściowe i próg kostki dla zniekształceń
Parametry te są wykorzystywane przez nieliniowy filtr zniekształceń 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.
- Domyślna wartość współczynnika wzmocnienia wejściowego wynosi 0,3 .
- Domyślna wartość progu kostki to 0,1 .
Zalecamy zmodyfikowanie obu wartości razem. Można je znaleźć w kodzie tutaj .
Aby uzyskać więcej informacji na temat funkcji stosowanej przez ten filtr, zapoznaj się z implementacją dostępną tutaj . Aby dowiedzieć się więcej o tym, jak te dwa parametry wpływają na wyjście, zalecamy wykreślenie odpowiedzi częstotliwościowych filtrów i obserwowanie, jak zmieniają się odpowiedzi częstotliwościowe przy różnych wartościach parametrów.
Wzmocnienie wyjściowe dla zniekształceń
Ten parametr kontroluje końcową amplitudę drgań. Jest to końcowe wzmocnienie zastosowane po miękkim ograniczniku, który ogranicza amplitudy drgań do mniej niż 1. Jego wartość domyślna to 1,5 i można ją zmodyfikować w kodzie tutaj . Jeśli wibracja jest zbyt subtelna, zwiększ wartość. Jeśli słychać grzechotanie sprzętu siłownika, zmniejsz wartość.