Podstawa UX dla frameworku haptycznego

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 .

Zasady UX

Rysunek 1. Aktualne zasady

W poniższej tabeli wymieniono wszystkie dostępne interfejsy API dotyku.

API Metody Rok dodany
android.view.HapticFeedbackStałe
  • KONTEKST_KLIKNIJ
  • ZEGAR_TICK
  • KLUCZ WIRTUALNY
  • KLAWIATURA_TAP
  • LONG_PRESS
Przed 2016 rokiem
  • KLAWIATURA_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • WIRTUAL_KEY_RELEASE
2017 (Android 8)
  • POTWIERDZAĆ
  • ODRZUCIĆ
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
Android.Wyświetl
  • wykonajHapticFeedback()
Przed 2016 rokiem
Wibrator android.os
  • wibrować()
  • maWibrator()
Przed 2016 rokiem
  • ma AmplitudeControl()
2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 (Android 11)
android.os.VibrationEffect
  • utwórzOneShot()
  • utwórz przebieg()
2017 (Android 8)
  • EFEKT_TICK
  • EFEKT_KLIKNIĘCIA
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • utwórzpredefiniowaną()
2019 (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • dodajPrymitywny()
  • komponować()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
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.

W HapticFeedbackConstants :

  • 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.

Naciśnij i zwolnij

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.

Bogata haptyka

Rysunek 4. Bogata hatyka z przesuwaną teksturą

Przeciąganie i przesuwanie

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.

Zaimplementuj prostą teksturę powierzchniową 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.

Stwórz swój własny efekt

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.

Zastosuj efekt odprężenia

  1. 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.
  2. Użyj VibrationEffect . createWaveform(timings[], amplitudes[], int repeat) .

  3. Dostosuj serię timings[] i amplitudes[] , aby wygenerować krzywą łatwości, jak pokazano na rysunku 6.

Długie wibracje

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.

Para audio

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 lub SoundPool .

    • 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 i SoundPool .
  • 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

  • Zmień opcję AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted) na false , aby odtwarzać 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.
  • Wibrator HAL musi implementować obsługę zewnętrznego sterowania.

Haptyka sprzężona z dźwiękiem

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.

Haptic Generator architecture

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.

  1. 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 .

  2. 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 .

  3. 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 .

  4. 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 .

  5. 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.

  6. 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ść.