Podstawa UX dla Haptic Framework

Wszystkie ulepszenia platformy Android 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
  • wykonujHapticFeedback()
Przed 2016 r.
android.os.Wibrator
  • 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

Sięgając do 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 wrażenie 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 całość (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źnego dotyku, 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 rozwijająca się 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ą wymazane. 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 zaskoczyć użytkowników w cichym otoczeniu i często powoduje słyszalne brzęczenie. Aby wygenerować przyjemniejszą, długą wibrację, zastosuj efekt rozluźnienia 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 rozluźnienia 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

Implementacja haptyki sprzężonej z dźwiękiem wymaga podstawowej wiedzy na temat odtwarzania treści zarówno z 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ękowo . 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 wibracyjnego urządzenia, dostosowując parametry, które konfigurują łańcuch filtrów, który stosuje 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. Struktura 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 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 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ść.