Podstawa UX dla interfejsu haptycznego

Wszystkie ulepszenia platformy Android związane z haptyką są oparte na zestawie zasad UX, które rozwijają się w tym samym tempie. Obecne zasady obejmują zastąpienie wibracji wyraźnymi reakcjami haptycznymi i zbadanie bogatych reakcji haptycznych.

Zasady UX

Rysunek 1. Obecne zasady.

W tabeli poniżej znajdziesz wszystkie dostępne interfejsy API haptyki:

Interfejs API Metody i stałe 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 (Android 8)
  • CONFIRM
  • REJECT
  • GESTURE_START
  • GESTURE_END
2020 r. (Android 11)
android.View
  • performHapticFeedback()
Przed 2016 r.
android.os.Vibrator
  • vibrate()
  • hasVibrator()
Przed 2016 r.
  • hasAmplitudeControl()
2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 r. (Android 11)
android.os.VibrationEffect
  • createOneShot()
  • createWaveform()
2017 (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

Pochodzące z pagerów i telefonów z podstawową przeglądarką wibracje oparte na brzęczyku, które są niskiej jakości, ale energooszczędne, były używane jako zamiennik dzwonka w trybie cichym. Starsze komponenty sprzętowe, które generują głośne i nieprzyjemne dźwięki, mogą pogorszyć wrażenia dotykowe, ponieważ zapewniają niską jakość (np. w przypadku taniego, zepsutego telefonu).

Wyczyść haptykę

Wyraźne wibracje obsługują odczuwanie dyskretnych zmian stanu (np. zmian binarnych podczas włączania i wyłączania urządzenia). Ze względu na charakter dyskretnego sygnału dotykowego wyraźne sygnały dotykowe są generowane jako pojedynczy element (np. jeden efekt dotykowy na jedno zdarzenie wejściowe).

Android zapewnia wyraźne wibracje o silnych, ale ostrych odczuciach, a nie wibracje rozmyte lub nieostre.

Wstępnie zdefiniowane stałe haptyczne, które zostały utworzone w celu obsługi wyraźnych haptycznych, obejmują te 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 wśród producentów urządzeń i deweloperów ma kluczowe znaczenie dla podniesienia ogólnej jakości haptyki w ekosystemie Androida. Więcej informacji o implementacji haptyki znajdziesz w podstawowej liście kontrolnej, ocenie sprzętuCDD.

Naciśnij i zwolnij

Rysunek 2. Naciśnij i zwolnij.

Rozbudowane reakcje haptyczne

Zaawansowane haptyczne to rozwijająca się kategoria haptycznych, która wykracza poza efekty oparte na pojedynczych impulsach. Android ma na celu obsługę zaawansowanych wibracji o wysokiej kompozycyjności i możliwości dostosowywania z dużą precyzją. Te przypadki użycia są obsługiwane na urządzeniach z Androidem 11 lub starszym.

Rozbudowane reakcje haptyczne

Rysunek 3. Bogate elementy dotykowe z przesuwaną teksturą.

Przeciąganie i przesuwanie

Rysunek 4. przeciąganie i przesuwanie;

Przypadek użycia 1. Przesuwanie tekstury

Jeśli efekt haptyczny jest powtarzany podczas przesuwania palca po powierzchni dotykowej (np. przeciągania, przesuwania, eksplorowania powierzchni z fantastyczną teksturą haptyczną), powtarzające się efekty haptyczne powinny być wyraźne i subtelne.

Jeśli efekt indywidualny jest bardziej szumiący niż wyraźny, odstępy między powtórzeniami prawdopodobnie zostaną zlikwidowane. W efekcie powstaje jeden długi sygnał, a nie kilka odrębnych sygnałów.

Jeśli amplituda nie jest wystarczająco subtelna, odczuwalna energia haptyczna narasta z powtórzeniami, co powoduje, że na końcu powtórzenia wibracje są zbyt silne.

Wdrażanie haptycznej tekstury powierzchni dla gestów przesuwania i przeciągania

Używaj właściwości CLOCK_TICKTEXT_HANDLE_MOVEHapticFeedbackConstants. Te stałe wartości określają z wyprzedzeniem charakterystykę powtórzeń i amplitudy.

Tworzenie własnego efektu

Aby utworzyć własny efekt, skomponuj projekt, łącząc sekwencje PRIMITIVE_CLICKPRIMITIVE_TICKVibrationEffect.Composition. Za pomocą ikony addPrimitive(int primitiveID, float scale, int delay) możesz dostosować charakterystykę powtórzenia i skalę amplitudy. Obsługa zależy od CAP_COMPOSE_EFFECTS interfejsu Vibrator HAL.

Przypadek użycia 2. Długie wibracje z efektem łagodnego początku

Długie wibracje to płynne wibracje o amplitudzie przechodzącej od 0 do docelowej amplitudy. Długie wibracje mogą generować zauważalne wibracje przyciągające uwagę. Nagłe, długie wibracje mogą jednak zaskoczyć użytkowników w cichym otoczeniu i często powodują słyszalne brzęczenie. Aby wygenerować przyjemniejsze długie wibracje, zastosuj efekt łagodnego narastania na początku długich wibracji. W ten sposób uzyskasz płynne przejście amplitudy, które będzie zmierzać do docelowej amplitudy.

Zastosuj efekt łagodnego początku

  1. Sprawdź możliwości sprzętowe sterowania amplitudą za pomocą android.os.Vibrator.hasAmplitudeControl().

    • Aby uzyskać efekt łagodnego wchodzenia z różną amplitudą, wynik musi wynosić true.
  2. Użyj VibrationEffect.createWaveform(timings[], amplitudes[], int repeat).

  3. Dostosuj serię timings[]amplitudes[], aby wygenerować krzywą łagodnego przyspieszenia, jak pokazano na rysunku 5.

Długie wibracje

Rysunek 5. Krzywa łagodnego narastania długich wibracji.

Przypadek użycia 3. Haptyka sprzężona z dźwiękiem

Haptyka sprzężona z dźwiękiem to wzorce haptyczne sprzężone z rytmem dźwięku, które mają przyciągać uwagę użytkownika.

Haptyka sprzężona z dźwiękiem: korzyści

Aby wdrożyć haptykę sprzężoną z dźwiękiem, połącz wyraźne wibracje z długimi wibracjami. Wyraźne wibracje to silne, ale krótkie wibracje, które tworzą odrębne rytmiczne wzorce. W połączeniu z wysokim poziomem bodźców, jakie zapewniają długie wibracje, skutecznie przyciąga to uwagę użytkownika.

Ważne jest, aby wziąć pod uwagę rytmiczne wzorce odczuwania. Jeśli nie ma poczucia rytmu, użytkownik odbiera wibracje jako przypadkowe brzęczenie i zwykle je ignoruje.

Para audio

Rysunek 6. Przykład sprzężenia haptycznego dźwięku.

Reakcje haptyczne powiązane z dźwiękiem: wskazówki dotyczące implementacji

Wdrożenie haptyki sprzężonej z dźwiękiem wymaga podstawowej wiedzy o odtwarzaniu treści na kanałach audio i haptycznych. Pamiętaj o tych 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 haptycznych) wskazują na obecność danych haptycznych i odtwarzanie za pomocą MediaPlayerSoundPool.
  • Wskaż obsługę haptyki i odtwarzania dźwięku w audio_policy_configuration.xml.

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

    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 odtworzyć kanał haptyczny.

    • Domyślnie kanały haptyczne są wyciszone (true).
    • Przykłady zastosowań to dzwonki i dźwięki interfejsu z synchronicznymi wibracjami i informacjami zwrotnymi.
  • Warstwa HAL wibratora musi obsługiwać sterowanie zewnętrzne.

Haptyka sprzężona z dźwiękiem

Rysunek 7. Wdrażanie haptyki sprzężonej z dźwiękiem.

Reakcje haptyczne sprzężone z dźwiękiem: HapticGenerator

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 haptykę sprzężoną z dźwiękiem. Efekt jest stosowany do AudioTrack, jak pokazano na rysunku 8:

Architektura generatora reakcji haptycznych

Rysunek 8. Architektura generatora haptycznego.

Ta wizualizacja architektury pokazuje, gdzie generator haptyczny jest stosowany do przychodzącego strumienia audio użytkownika, zanim zostanie on wysłany do warstwy HAL audio. Generator jest stosowany po tym, jak funkcja AudioMixer podzieli dane audio i haptyczne, a przed zastosowaniem innych efektów audio. Jego dane wyjściowe zastępują wszystkie poprzednie dane haptyczne w strumieniu.

Aby mieć pewność, że algorytm generatora haptycznego generuje haptykę wysokiej jakości, dostosuj algorytm generowania do silnika wibracyjnego urządzenia, modyfikując parametry konfigurujące łańcuch filtrów stosowanych do przebiegów dźwiękowych. W tej sekcji szczegółowo opisujemy te parametry i wyjaśniamy, jak je dostosować do specyfikacji sprzętu.

  • Częstotliwość rezonansowa filtra pasmowego

    Częstotliwość rezonansowa wibratora to częstotliwość, przy której siłownik haptyczny osiąga maksymalną moc wyjściową. Ten parametr dostosowuje antyrezonator, aby częściowo spłaszczyć funkcję przenoszenia odpowiedzi i uzyskać szersze pasmo. Platforma Android automatycznie łączy tę wartość z wynikiem działania metody Vibrator HAL IVibrator.getResonantFrequency.

    Domyślna wartość tego parametru to 150 Hz. Możesz ją zmienić w kodzie.

  • Moc normalizacji dla powolnej obwiedni

    Ten parametr określa wykładnik w częściowej normalizacji (automatyczna kontrola wzmocnienia). Jego wartość domyślna to –0,8, co oznacza, że ten krok kontroli wzmocnienia usuwa 80% zakresu dynamicznego. Możesz to zmienić w kodzie.

  • Współczynnik Q dla filtra pasmowego

    Współczynnik jakości wibratora (współczynnik Q) jest określany przez 2 parametry:

    • Wartość Zero Q, czyli współczynnik jakości zer w filtrze pasmowym, który częściowo tłumi rezonans.

    • Pole Q, czyli 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 poszerzyć zakres odpowiedzi algorytmu. Na przykład domyślne wartości 8 dla parametru Zero Q i 4 dla parametru Pole Q dają stosunek 2, co ogranicza tłumienie rezonansu o czynnik 2 (6 dB). Platforma Android łączy obie wartości z wynikiem metody IVibrator.getQFactor interfejsu HAL wibratora.

    Jeśli wartości domyślne nie uwzględniają tłumienia siły silnika w urządzeniu, zalecamy jednoczesne zmodyfikowanie obu wartości – zwiększenie lub zmniejszenie obu. Stosunek wartości Q dla zera do wartości Q dla bieguna powinien być większy niż 1. Możesz to zmienić w kodzie.

  • Częstotliwość graniczna zniekształceń

    Częstotliwość graniczna 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 ją zmienić w kodzie.

  • Wzmocnienie sygnału wejściowego i próg kostki dla zniekształceń

    Te parametry są używane przez filtr zniekształceń nieliniowych stosowany do kształtu fali wejściowej, 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 sygnału wejściowego to 0,3.
    • Domyślna wartość progu kostki to 0,1.

    Zalecamy modyfikowanie obu wartości jednocześnie. Znajdziesz je w kodzie.

    Więcej informacji o funkcji stosowanej przez ten filtr znajdziesz w kodzie.

    Aby dowiedzieć się więcej o tym, jak te 2 parametry wpływają na wynik, zalecamy wykreślenie odpowiedzi częstotliwościowych filtrów i obserwowanie, jak zmieniają się one w zależności od wartości parametrów.

  • Wzmocnienie wyjściowe dla zniekształceń

    Ten parametr kontroluje ostateczną amplitudę wibracji. Jest to ostateczne wzmocnienie stosowane po miękkim ograniczniku, który ogranicza amplitudy wibracji do wartości mniejszych niż 1. Jej wartość domyślna to 1,5, ale możesz ją zmienić w kodzie.

    Jeśli wibracje są zbyt słabe, zwiększ wartość. Jeśli słyszysz, że siłownik grzechocze, zmniejsz wartość.