햅틱 프레임워크를 위한 UX 기반

햅틱을 중심으로 구축된 모든 Android 프레임워크 개선 사항은 동일한 속도로 진화하는 UX 원칙 세트에 의해 주도됩니다. 현재 원칙은 윙윙거리는 진동선명한 햅틱 으로 대체하고 풍부한 햅틱 을 탐색하는 것입니다.

UX 원칙

그림 1. 현재 원칙

다음 표에는 사용 가능한 모든 햅틱 API가 나열되어 있습니다.

API 행동 양식 추가된 연도
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • 키보드_탭
  • LONG_PRESS
2016년 이전
  • 키보드_프레스
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017(안드로이드 8)
  • 확인하다
  • 거부하다
  • GESTURE_START
  • GESTURE_END
2020년(안드로이드 11)
android.View
  • 수행 햅틱 피드백()
2016년 이전
android.os.바이브레이터
  • 떨리다()
  • hasVibrator()
2016년 이전
  • hasAmplitudeControl()
2017(안드로이드 8)
  • 모든 효과 지원()
  • areAllPrimitivesSupported()
  • 효과 지원()
  • arePrimitivesSupported()
2020년(안드로이드 11)
android.os.진동효과
  • 생성원샷()
  • 생성 파형()
2017(안드로이드 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • 미리 정의된 생성()
2019년(안드로이드 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • 구성하다()
2020년(안드로이드 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
2019년(안드로이드 10)

윙윙거리는 진동

호출기 및 피처폰으로 거슬러 올라가면 품질은 낮지만 전력 효율적인 ERM 부저 기반 진동이 무음 모드 에서 울리는 소리를 대신하여 사용되었습니다. 크고 불쾌한 가청 잡음을 생성하는 기존 하드웨어 구성 요소는 품질이 낮은 인상을 제공하여 햅틱 UX에 해를 끼칠 수 있습니다(예: 저렴하고 고장난 전화기).

선명한 햅틱

선명한 햅틱개별 상태 변화(예: 전원 켜기/끄기 프로세스 중 이진 변경)의 감각을 지원합니다. 이산 어포던스의 특성으로 인해 명확한 햅틱은 단일 개체로 생성됩니다(예: 하나의 입력 이벤트당 하나의 햅틱 효과).

Android는 윙윙 거리거나 흐릿한 감각보다 강하면서도 날카로운 감각으로 선명한 햅틱을 전달하는 것을 목표로 합니다.

명확한 햅틱을 지원하기 위해 생성되는 미리 정의된 햅틱 상수는 다음과 같습니다.

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

기기 제조업체와 개발자 간의 공통 지식을 구축하는 것은 Android 생태계에서 햅틱의 전반적인 품질을 높이는 핵심입니다. 기본 체크리스트 , 하드웨어 평가CDD 를 사용합니다. 햅틱 구현에 대해 자세히 알아보세요.

보도자료

그림 3. 눌렀다 떼기.

풍부한 햅틱

리치 햅틱 은 단일 임펄스 기반 효과를 넘어 성장하는 햅틱 카테고리입니다. Android는 높은 구성 가능성과 세밀한 수준의 조정 가능성으로 풍부한 햅틱을 지원하는 것을 목표로 합니다. 다음 사용 사례는 Android 11 이하에서 지원됩니다.

풍부한 햅틱

그림 4. 슬라이딩 텍스처가 있는 풍부한 햅틱

드래그 및 스와이프

그림 5. 드래그 및 스와이프

사용 사례 1: 슬라이딩 텍스처

손가락이 터치 표면 위로 미끄러지는 동안 햅틱 효과가 반복된다면(예를 들어, 드래그, 스와이프, 팬텀 햅틱 텍스처로 표면 탐색), 반복되는 햅틱 효과는 바람직하게는 선명하고 미묘하다.

개별 효과가 선명하지 않고 윙윙 거리면 반복 사이의 간격이 사라질 수 있습니다. 결과는 여러 개의 개별 신호가 아니라 하나의 긴 버즈입니다.

진폭이 충분히 미묘하지 않으면 인지된 햅틱 에너지가 반복을 통해 축적되어 반복이 끝날 때 압도적으로 강한 햅틱이 생성됩니다.

스와이프 및 드래그 제스처를 위한 간단한 표면 햅틱 텍스처 구현

HapticFeedbackConstants 에서 CLOCK_TICKTEXT_HANDLE_MOVE 를 사용합니다. 이러한 상수는 반복 및 진폭의 특성을 미리 정의합니다.

나만의 효과 만들기

자신만의 효과를 만들려면 VibrationEffect.Composition 에서 PRIMITIVE_CLICKPRIMITIVE_TICK 시퀀스를 함께 연결하여 디자인을 구성하십시오. addPrimitive(int primitiveID, float scale, int delay) 를 사용하여 반복 및 진폭 스케일의 특성을 조정할 수 있습니다. 지원은 진동기 HAL 인터페이스CAP_COMPOSE_EFFECTS 기능에 의존합니다.

사용 사례 2: Easy-in 효과가 있는 긴 진동

긴 진동은 0에서 목표 진폭으로 전환하는 부드러운 진폭 진동입니다. 긴 진동은 쉽게 인지할 수 있는 주의 햅틱을 생성할 수 있습니다. 그러나 갑작스러운 긴 진동은 조용한 환경에서 사용자를 놀라게 할 수 있으며 종종 윙윙거리는 소리가 들립니다. 더 기분 좋은 긴 진동을 발생시키려면 긴 진동의 시작 부분에 이즈인 효과를 적용하십시오. 이렇게 하면 대상 진폭을 향해 구축되는 부드러운 진폭 전환이 생성됩니다.

이지인 효과 적용

  1. android.os.Vibrator.hasAmplitudeControl() 을 사용하여 진폭 제어의 하드웨어 기능을 확인하십시오.

    • 다양한 진폭으로 이지인 효과를 생성하려면 결과가 true 이어야 합니다.
  2. VibrationEffect 를 사용합니다. createWaveform(timings[], amplitudes[], int repeat) .

  3. 그림 6과 같이 일련의 timings[]amplitudes[] 을 조정하여 완화 곡선을 생성합니다.

긴 진동

그림 6. 긴 진동 완화 곡선

사용 사례 3: 오디오 결합 햅틱

오디오 결합 햅틱 은 사용자의 주의를 끌기 위해 오디오의 리듬과 결합된 햅틱 패턴입니다.

오디오 결합 햅틱: 이점

오디오 결합 햅틱을 구현하려면 선명한 햅틱과 긴 진동을 결합하십시오. 선명한 햅틱의 강하지만 짧은 햅틱 감각은 개별적인 리듬 패턴을 전달합니다. 긴 진동이 제공하는 높은 수준의 자극과 결합하면 사용자의 주의를 끄는 데 큰 역할을 합니다.

감각 리듬 패턴을 고려하는 것이 중요합니다. 리듬감이 없으면 사용자는 햅틱 감각을 임의의 윙윙거리는 소리로 인식하고 무시하는 경향이 있습니다.

오디오 커플

그림 7. 오디오 커플 햅틱 예시

오디오 결합 햅틱: 구현 팁

오디오 결합 햅틱을 구현하려면 오디오 및 햅틱 채널 모두의 콘텐츠 재생에 대한 기본적인 이해가 필요합니다. 다음 사항에 유의하십시오.

  • MediaPlayer 또는 SoundPool 클래스를 사용합니다.

    • 특수 메타데이터 키( ANDROID_HAPTIC 뒤에 여러 햅틱 채널이 옴)가 있는 OGG 형식의 자산은 햅틱 데이터의 존재와 MediaPlayerSoundPool 을 사용한 재생을 나타냅니다.
  • audio_policy_configuration.xml 에서 햅틱 및 오디오 재생 지원을 나타냅니다.

    • 햅틱 채널 AUDIO_CHANNEL_OUT_HAPTIC_A|B 와 함께 출력 프로필을 사용합니다.
    • 햅틱 채널이 있는 출력 스트림의 경우 햅틱 채널이 데이터에서 추가 채널로 표시된다는 점을 기억하십시오.

    예시

    출력 스트림의 채널 마스크가 다음과 같은 경우:

    AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A

    그러면 모든 샘플은 다음과 같아야 합니다.

    AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A

  • AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted) 변경

    햅틱 채널을 재생하려면 false 로 설정합니다.

    • 기본적으로 햅틱 채널은 음소거되어 있습니다( true ).
    • 사용 사례에는 동기식 햅틱 및 피드백이 있는 벨소리 및 UI 사운드가 포함됩니다.
  • 진동기 HAL은 외부 제어 지원을 구현해야 합니다.

오디오 결합 햅틱

그림 8. 오디오 결합 햅틱 구현

오디오 결합 햅틱: 햅틱 생성기

HapticGenerator 는 오디오 채널에서 햅틱 데이터를 생성하고 오디오 결합 햅틱 으로 실시간으로 재생할 수 있는 Android 12에 도입된 오디오 효과 입니다. 효과는 그림 9에 설명된 대로 AudioTrack 에 적용됩니다.

Haptic Generator architecture

그림 9. 햅틱 생성기 아키텍처

햅틱 생성기 알고리즘이 고품질 햅틱을 생성하도록 하려면 오디오 파형에 적용되는 필터 체인을 구성하는 매개변수를 조정하여 생성 알고리즘을 장치 진동기 모터에 맞게 조정합니다. 이 섹션에서는 이러한 매개변수에 대해 자세히 설명하고 하드웨어 사양에 맞게 조정하는 방법을 설명합니다.

  1. 대역 통과 필터의 공진 주파수

    진동자 공진 주파수는 햅틱 액츄에이터가 최대 출력을 내는 주파수이다. 이 매개변수는 더 넓은 대역폭을 얻기 위해 응답 전달 함수를 부분적으로 평평하게 하기 위해 반공진기를 조정합니다. Android 프레임워크는 이 값을 Vibrator HAL 메서드 IVibrator.getResonantFrequency 의 출력에 자동으로 연결합니다.

    이 매개변수의 기본값은 150Hz 입니다. 이것은 여기 의 코드에서 수정할 수 있습니다.

  2. 느린 봉투에 대한 정규화 전력

    이 매개변수는 부분 정규화(자동 이득 제어)의 지수를 결정합니다. 기본값은 -0.8 이며 이는 이 게인 제어 단계에서 동적 범위 변동의 80%가 제거됨을 의미합니다. 이것은 여기 의 코드에서 수정할 수 있습니다.

  3. 대역 저지 필터의 Q 계수

    진동기 품질 계수(Q 계수)는 두 가지 매개변수에 의해 결정됩니다.

    • 공진을 부분적으로 취소하는 대역 정지 필터에서 0의 품질 계수인 Zero Q.

    • 극점 Q, 대역 저지 필터에서 극점의 품질 계수.

    이 두 값의 비율은 더 낮은 주파수를 높이고 알고리즘 응답을 넓히기 위해 공진 억제를 제한합니다. 예를 들어, Zero Q의 기본값 8 과 Pole Q의 기본값 4 는 비율 2 를 생성하여 공진 억제를 2배(6dB)로 제한합니다. Android 프레임워크는 두 값을 Vibrator HAL 메서드 IVibrator.getQFactor 의 출력에 연결합니다.

    기본값이 장치의 모터 강도 감쇠를 설명하지 않는 경우 두 값을 동시에 수정하고 둘 다 늘리거나 줄이는 것이 좋습니다. 영점 Q 대 극점 Q의 비율은 1 보다 커야 합니다. 이것은 여기 의 코드에서 수정할 수 있습니다.

  4. 왜곡을 위한 코너 주파수

    코너 주파수는 3차 왜곡을 사용하여 낮은 레벨의 진동을 억제하고 높은 레벨을 향상시키는 로우 패스 필터에 의해 적용됩니다. 기본값은 300Hz 입니다. 이것은 여기 의 코드에서 수정할 수 있습니다.

  5. 왜곡에 대한 입력 게인 및 큐브 임계값

    이 매개변수는 입력 파형에 적용되는 비선형 왜곡 필터에 의해 사용되어 저주파 신호의 진폭을 감쇠하고 고주파 신호를 증가시킵니다.

    • 입력 이득 계수의 기본값은 0.3 입니다.
    • 큐브 임계값의 기본값은 0.1 입니다.

    두 값을 함께 수정하는 것이 좋습니다. 여기 코드에서 찾을 수 있습니다.

    이 필터에 의해 적용되는 기능에 대한 자세한 내용은 여기에서 사용 가능한 구현을 참조하십시오. 이 두 매개변수가 출력에 미치는 영향에 대해 자세히 알아보려면 필터의 주파수 응답을 표시하고 다른 매개변수 값에 따라 주파수 응답이 어떻게 변하는지 관찰하는 것이 좋습니다.

  6. 왜곡에 대한 출력 이득

    이 매개변수는 최종 진동 진폭을 제어합니다. 진동 진폭을 1 미만으로 제한하는 소프트 리미터 다음에 적용된 최종 게인입니다. 기본값은 1.5 이며 여기 코드에서 수정할 수 있습니다. 진동이 너무 미세하면 값을 높이십시오. 액츄에이터 하드웨어가 덜거덕거리는 소리가 들리면 값을 줄이십시오.