Podstawa UX dla frameworka haptycznego

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

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 .

Zasady UX

Rysunek 1. Aktualne zasady

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

API Metody Dodano rok
android.view.HapticFeedbackConstants
  • KONTEKST_KLIKNIJ
  • CLOCK_TICK
  • KLUCZ WIRTUALNY
  • KEYBOARD_TAP
  • LONG_PRESS
Przed 2016 r.
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • POTWIERDZAĆ
  • ODRZUCIĆ
  • GESTURE_START
  • GEST_END
2020 (Android 11)
android.View
  • wykonajHapticFeedback()
Przed 2016 r.
Wibrator android.os.
  • wibrować()
  • maWibrator()
Przed 2016 r.
  • maKontrolęAmplitudy()
2017 (Android 8)
  • sąobsługiwane wszystkie efekty()
  • areAllPrimitivesSupported()
  • sąobsługiwane efekty()
  • arePrimitivesSupported()
2020 (Android 11)
android.os.VibrationEffect
  • utwórzJedenStrzał()
  • utwórz przebieg()
2017 (Android 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • utwórz predefiniowane()
2019 (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • komponować()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
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.

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

Naciśnij i zwolnij

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.

Bogata haptyka

Rysunek 4. Bogata haptyka 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 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

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

  3. Dostosuj serie timings[] i amplitudes[] , aby wygenerować krzywą napięcia, jak pokazano na rysunku 6.

Długie wibracje

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.

Para audio

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

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

  • 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.
  • Wibrator HAL musi wdrożyć zewnętrzne wsparcie sterowania.

Haptyka sprzężona z dźwiękiem

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.

Haptic Generator architecture

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.

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

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

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

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

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

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