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 Rok dodania
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • LONG_PRESS
Przed 2016 r.
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 r. (Android 8)
  • POTWIERDŹ
  • ODRZUĆ
  • GESTURE_START
  • GESTURE_END
2020 r. (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.VibrationEffect
  • createOneShot()
  • createWaveform()
2017 r. (Android 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • createPredefined()
2019 r. (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • compose()
2020 r. (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
2019 r. (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 buzzera jako zamiennika dźwięku 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 mocnym, ale czystym brzmieniu, a nie o nieokreślonym lub niewyraźnym.

Zdefiniowane wstępnie stałe haptyczne, które obsługują czytelne haptyki, to:

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

Budowanie wspólnej wiedzy wśród producentów urządzeń i programistów jest kluczem do poprawy ogólnej jakości haptyki w ekosystemie Androida. Aby dowiedzieć się więcej o implementacji haptycznej, skorzystaj z podstawowej listy kontrolnej, oceny sprzętuCDD.

Naciśnij i zwolnij

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ć obsługę bogatych haptycznych interakcji o wysokiej jakości i dokładności. Te przypadki użycia są obsługiwane w Androidzie 11 lub starszym.

Rozbudowane reakcje haptyczne

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. W efekcie słychać jeden długi sygnał, a nie kilka oddzielnych.

Jeśli amplituda jest zbyt mała, wyczuwalna energia haptyczna narasta podczas powtórzeń, co powoduje, że na końcu powtórzenia wyczuwalne wibracje są bardzo silne.

Wdrożyć prostą teksturę haptyczną powierzchni na potrzeby gestów przesuwania i przeciągania

Użyj właściwości CLOCK_TICKTEXT_HANDLE_MOVEHapticFeedbackConstants. Te stałe definiują wstępnie cechy powtarzania i amplitudy.

Tworzenie własnego efektu

Aby utworzyć własny efekt, utwórz projekt, łącząc ze sobą 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 2. Długie wibracje z efektem łagodnego włączania

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 wibracje, zastosuj efekt łagodnego włączania na początku długich wibracji. Powoduje to płynne przejście do amplitudy docelowej.

Zastosuj efekt łagodnego wejścia

  1. Sprawdź możliwości sprzętowe kontroli amplitudy w 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. Krzywa łagodnego włączenia długich wibracji

Przypadek użycia 3. Reakcje haptyczne połączone z dźwiękiem

Czujniki haptyczne połączone z dźwiękiem to wzorce haptyczne połączone z rytmem dźwięku, aby zwrócić 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 wysoką stymulacją, jaką zapewnia długie wibrowanie, pozwala to skutecznie przyciągać uwagę użytkownika.

Należy wziąć pod uwagę wzorce rytmiczne. Jeśli nie ma poczucia rytmu, użytkownik odbiera wibracje jako przypadkowe drgania i zwykle je ignoruje.

Pary audio

Rysunek 7. Przykład dźwięku w połączeniu z haptyką

Reakcje haptyczne połączone 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 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)na false, aby odtwarzać kanał haptyczny.

    • Domyślnie kanały haptyczne są wyciszone (true).
    • Przypadki użycia obejmują dzwonki i dźwięki interfejsu z synchronicznymi wibracjami i sprzężeniem zwrotnym.
  • Interfejs HAL wibratora musi obsługiwać sterowanie zewnętrzne.

Haptic połączony z dźwiękiem

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 AudioTrack, jak pokazano na rysunku 9.

Architektura generatora reakcji haptycznych

Rysunek 9. Architektura generatora reakcji haptycznych

Aby zapewnić, że algorytm generatora haptycznego generuje haptyczne efekty wysokiej jakości, dostosuj 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 szczegółowo opisane są te parametry oraz wyjaśniono, jak je dostosować do specyfikacji sprzętu.

  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 antyrezonans, aby częściowo spłaszczyć funkcję przesyłania odpowiedzi w celu uzyskania większej przepustowości. Platforma Androida automatycznie łączy tę wartość z wynikiem metody wibratora HAL IVibrator.getResonantFrequency.

    Wartość domyślna tego parametru to 150 Hz. Możesz to zmienić w tym kodzie.

  2. Moc normalizacji dla Envelope Slow

    Ten parametr określa wykładnik w częściowej normalizacji (automatycznej regulacji wzmocnienia). Jego wartość domyślna to -0,8, co oznacza, że 80% różnicy 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 Q 0 do Q Pole powinien być większy niż 1. Możesz to zmienić w kodzie tutaj.

  4. Częstotliwość zniekształceń

    Częstotliwość skrajna jest stosowana przez filtr dolnoprzepustowy, który tłumi wibracje o niskim poziomie i wzmacnia wyższe poziomy za pomocą zniekształcenia sześciennego. Domyślna wartość to 300 Hz. Możesz to zmienić w kodzie tutaj.

  5. Próg wzmocnienia wejściowego i próg kostki dla 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ścią domyślną dla współczynnika wzmocnienia wejścia jest 0,3.
    • Domyślna wartość progu w kostce to 0,1.

    Zalecamy zmianę obu wartości. Znajdziesz je w kodzie tutaj.

    Więcej informacji o funkcji stosowanej przez ten filtr znajdziesz w tym miejscu. Aby dowiedzieć się więcej o tym, jak te 2 parametry wpływają na dane wyjściowe, zalecamy narysowanie odpowiedzi częstotliwościowej filtrów i obserwowanie, jak zmienia się ta odpowiedź przy różnych wartościach parametrów.

  6. Wyjście wzmocnienia dla zniekształcenia

    Ten parametr kontroluje końcową amplitudę wibracji. Jest to końcowy wzmocnienie, które jest stosowane po łagodnym ograniczniku, który ogranicza amplitudy 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 ich wartość. Jeśli słychać grzechotanie w układzie wykonawczym, zmniejsz wartość.