Podstawy UX dla platformy haptycznej

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.

Zasady UX

Rysunek 1. Aktualne zasady

W tej tabeli znajdziesz wszystkie dostępne interfejsy API haptycznych.

Interfejs API Metody Dodano rok
android.view.HapticFeedbackConstants
  • KLIKNIĘCIE_KONTEXT
  • Znacznik_zegarka
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • LONG_PRESS
Przed 2016 r.
  • KEYBOARD_PRESS
  • PREMIERA_KLUCZOWE
  • RĘKA_TEKSTOWA_PRZENIESIENIE
  • VIRTUAL_KEY_RELEASE
2017 r. (Android 8)
  • POTWIERDŹ
  • ODRZUĆ
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.View
  • performHapticFeedback()
Przed 2016 r.
android.os.Vibrator
  • vibrate()
  • hasVibrator()
Przed 2016 r.
  • hasAmplitudeControl()
2017 r. (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 r. (Android 11)
android.os.Efekt wibracyjny
  • createOneShot()
  • createWaveform()
2017 r. (Android 8)
  • EFFECT_TICK
  • EFEK_KLIKNIĘCIE
  • EFEKTY.HEAVY_KLIKNIĘCIE
  • EFFECT_DOUBLE_CLICK
  • createPredefined()
2019 r. (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_KLIKNIJ
  • addPrimitive()
  • compose()
2020 r. (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
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

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

VibrationEffect:

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

Dla prasy i publikacji

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.

Bogaty system reakcji haptycznych

Rysunek 4. Bogaty element dotykowy z teksturą przesuwania

Przeciąganie i przesuwanie

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

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

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

Długie wibracje

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.

Pary audio

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

  • Aby włączyć kanał haptyczny, zmień AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted) na false.

    • Domyślnie kanały haptyczne są wyciszone (true).
    • Obejmuje to dzwonki i dźwięki interfejsu z synchroniczną reakcją haptyczną i informacjami zwrotnymi.
  • Interfejs HAL wibratora musi obsługiwać sterowanie zewnętrzne.

Technologia haptyczna sprzężona dźwiękowo

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.

Architektura generatora reakcji haptycznych

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.

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

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

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

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

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

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