햅틱 구현

일반적으로 기기 제조업체는 각 기기에 대해 생성된 비공개 애셋의 소유자로 간주됩니다. 따라서 기기 제조업체의 엔지니어링 작업은 흔히 기기별로 집중됩니다. 그리고 기기 제조업체는 생태계에 있는 다른 기기와의 일관성을 위해 거의 노력하지 않습니다.

이와는 대조적으로 개발자는 각 기기의 기술 사양과 관계없이 생태계의 모든 Android 휴대전화에서 작동하는 앱을 빌드하려고 노력합니다. 이러한 접근 방식의 차이로 인해 조각화 문제가 발생할 수 있습니다. 예를 들어 특정 휴대전화의 하드웨어 기능이 앱 개발자가 설정한 기대와 일치하지 않습니다. 따라서 햅틱 API가 일부 Android 휴대전화에서는 작동하지만 다른 휴대전화에서는 작동하지 않는다면 결과적으로 생태계가 일관되지 않게 됩니다. 이러한 이유로 제조업체가 모든 기기에 Android 햅틱 API를 구현할 수 있도록 하는 데 하드웨어 구성이 중요한 역할을 합니다.

이 페이지에서는 Android 햅틱 API를 최대한 활용할 수 있도록 하드웨어 규정 준수를 설정하는 단계별 체크리스트를 제공합니다.

아래 그림에서는 기기 제조업체와 개발자 간의 공통 지식 구축을 보여주는데, 이 단계는 일관성 있는 생태계를 만드는 데 매우 중요합니다.

앱 개발자와 기기 제조업체의 햅틱 사용 사례 다이어그램

그림 1. 기기 제조업체와 개발자 간의 지식 구축

햅틱 구현 체크리스트

  1. 상수 구현

    • 햅틱을 구현하기 위한 상수 목록입니다.
  2. HAL과 API 간의 상수 매핑

    • 프레임워크의 자리표시자라는 공개 API 상수와 자리표시자를 구현하는 HAL 상수 간의 매핑 권장사항입니다.
    • 이 프로세스에 관해 자세히 알아보려면 권장 매핑을 안내하는 디자인 원칙을 참고하세요.
  3. 하드웨어 평가

    • 타겟 햅틱 효과에 관한 안내입니다. 이러한 안내에 따라 하드웨어에 관해 빠르게 확인할 수 있습니다.

아래에서 이러한 각 단계를 자세히 살펴보겠습니다.

1단계: 상수 구현

다음 검사를 진행하여 기기가 햅틱 구현을 위한 최소 요구사항을 충족하는지 확인합니다.

햅틱 구현 프로세스의 플로우 차트

그림 2. 효과 구현

프리미티브를 구현하기 위한 단계 플로우 차트

그림 3. 프리미티브 구현

다음과 같은 햅틱 상수의 구현 상태를 확인합니다.

햅틱 상수 위치 및 요약
EFFECT_TICK, EFFECT_CLICK, EFFECT_HEAVY_CLICK, EFFECT_DOUBLE_CLICK VibrationEffect 클래스
VibrationEffect의 햅틱 상수에는 입력 이벤트 개념이 포함되지 않으며 UI 요소가 없습니다. 상수는 대신 EFFECT_CLICKEFFECT_HEAVY_CLICK과 같은 에너지 수준의 개념을 포함하며, createPredefined()에 의해 호출됩니다.
PRIMITIVE_TICK, PRIMITIVE_CLICK, PRIMITIVE_LOW_TICK>, PRIMITIVE_SLOW_RISE, PRIMITIVE_QUICK_RISE, PRIMITIVE_QUICK_FALL, PRIMITIVE_SPIN, PRIMITIVE_THUD VibrationEffect.Composition 클래스
VibrationEffect.Composition의 햅틱 상수는 확장 가능한 강도를 가질 수 있으며, addPrimitive(int primitiveId, float scale, int delay)에 의해 호출됩니다.

아래에 설명된 대체 진동은 VibrationEffect 상수를 구현하지 않는 기기에서 실행됩니다. 이러한 기기에서 최상의 성능을 발휘하도록 이러한 구성을 업데이트하는 것이 좋습니다.

  1. EFFECT_CLICK

    VibrationEffect.createWaveform으로 생성된 파형 진동 및 frameworks/base/core/res/res/values/config.xml##config_virtualKeyVibePattern에 설정된 타이밍.

  2. EFFECT_HEAVY_CLICK

    VibrationEffect.createWaveform으로 생성된 파형 진동 및 frameworks/base/core/res/res/values/config.xml##config_longPressVibePattern에 설정된 타이밍.

  3. EFFECT_DOUBLE_CLICK

    VibrationEffect.createWaveform으로 생성된 파형 진동 및 타이밍(0, 30, 100, 30).

  4. EFFECT_TICK

    VibrationEffect.createWaveform으로 생성된 파형 진동 및 frameworks/base/core/res/res/values/config.xml##config_clockTickVibePattern에 설정된 타이밍.

햅틱 반응 테스트 단계의 플로우 차트

그림 4. 피드백 상수 구현

다음 공개 피드백 상수의 상태를 확인합니다.

햅틱 상수 위치 및 요약
CLOCK_TICK, CONTEXT_CLICK, KEYBOARD_PRESS, KEYBOARD_RELEASE, KEYBOARD_TAP, LONG_PRESS, TEXT_HANDLE_MOVE, VIRTUAL_KEY, VIRTUAL_KEY_RELEASE, CONFIRM, REJECT, GESTURE_START, GESTURE_END HapticFeedbackConstants 클래스
HapticFeedbackConstants의 햅틱 상수는 performHapticFeedback()에서 호출되는 KEYBOARD_PRESSKEYBOARD_RELEASE와 같은 특정 UI 요소로 입력 이벤트를 지원합니다.

2단계: HAL과 API 간의 상수 매핑

2단계에서는 공개 HAL 상수와 API 상수 간의 권장 매핑을 제시합니다. 1단계에서 평가된 하드웨어가 HAL 상수를 구현하지 않는 경우 2단계를 사용하여 1단계에 설명된 대체 패턴을 업데이트하여 유사한 출력을 생성해야 합니다. 매핑은 서로 다른 두 가지 기본 모델에 의해 지원됩니다.

  • 불연속 모델(간단)

    • 진폭은 이 모델의 핵심 변수입니다. HAL의 각 항목은 서로 다른 햅틱 진폭을 나타냅니다.
    • 이 모델은 기본 햅틱 UX를 구현하는 데 필요한 최소 요구사항입니다.
    • 고급 햅틱 UX에는 고급 하드웨어 및 고급 모델(연속 모델)이 필요합니다.
  • 연속 모델(고급)

    • 질감 및 진폭은 이 모델의 핵심 변수입니다. HAL의 각 항목은 서로 다른 햅틱 질감을 나타냅니다. 각 HAL 항목의 진폭은 배율(S)로 제어됩니다.
    • 이 모델에는 고급 하드웨어가 필요합니다. OEM이 VibrationEffect.Composition과 함께 고급 햅틱 UX를 사용하려는 경우(최신 햅틱 API를 최대한 활용하기 위해) 이 모델을 사용하여 하드웨어를 구현하는 것이 좋습니다.

불연속 모델

API에서 제공하는 모든 공개 상수를 적절한 HAL 상수와 매핑하는 것이 좋습니다. 이 프로세스를 시작하려면 기기가 HAL에서 정의할 수 있는 불연속 진폭이 있는 햅틱 파형 수를 알아보세요. 이 개념을 중심으로 구성된 구체적인 질문은 다음과 같습니다. 즉, 내 휴대전화에서 사람이 감지할 수 있는 진폭 차이가 있는 단일 임펄스 햅틱 효과를 몇 개나 정의할 수 있나요? 이 질문에 대한 답을 통해 매핑이 결정됩니다.

HAL 상수 정의는 하드웨어에 종속되는 프로세스입니다. 예를 들어 보급형 휴대전화에는 단일 햅틱 파형을 생성하는 하드웨어 기능만 있을 수 있습니다. 고급 하드웨어 구성요소가 있는 기기는 더 광범위한 불연속 진폭 수준을 생성하고 HAL에서 여러 햅틱 파형을 정의할 수 있습니다. HAL-API 상수 매핑은 HAL 상수를 사용(중간 진폭을 기준으로 사용)한 후 여기에서 더 강하거나 약한 효과를 준비합니다.

HAL 상수 범위 및 피드백 진폭 다이어그램

그림 5. 진폭에 따른 HAL 상수 범위

불연속 진폭이 있는 HAL 상수의 수를 정의했다면 이제 HAL 상수의 수에 따라 HAL 상수와 API 상수를 매핑할 차례입니다. 이 매핑 프로세스에서는 단일 임펄스 API 상수를 최대 3개의 불연속 진폭 수준 그룹으로 분류할 수 있습니다. API 상수를 분류하는 방식은 함께 제공되는 입력 이벤트에 관한 UX 원칙을 기반으로 합니다. 자세한 내용은 햅틱 UX 디자인을 참고하세요.

HAL API 상수 매핑을 위한 개별 모델

그림 6. HAL-API 상수 매핑: 불연속 모델

기기가 불연속 진폭이 있는 HAL 상수를 2개만 지원한다면 중간 및 높은 진폭 수준의 HAL 상수를 병합하는 것이 좋습니다. 실제로 이 개념의 예는 EFFECT_CLICKEFFECT_HEAVY_CLICK을 동일한 HAL 상수(중간 진폭 수준의 HAL 상수)에 매핑하는 것입니다. 기기가 불연속 진폭이 있는 HAL 상수를 하나만 지원한다면 세 수준을 모두 하나로 병합하는 것이 좋습니다.

연속 모델

진폭 확장성이 있는 연속 모델을 적용하여 HAL 상수를 정의할 수 있습니다. 배율(S)을 HAL 상수(예: HAL_H0, HAL_H1)에 적용하여 확장된 HAL(HAL_H0 x S)을 생성할 수 있습니다. 이 경우 그림 7과 같이 확장된 HAL을 매핑하여 API 상수(HAL_H0 x S1 = H0S1 = EFFECT_TICK)를 정의할 수 있습니다. 연속 모델의 진폭 확장성을 사용함으로써 기기는 독특한 질감이 있는 소수의 HAL 상수를 저장하고 배율(S)을 조정하여 진폭 변화량을 추가할 수 있습니다. 기기 제조업체는 제공하려는 다양한 햅틱 질감의 개수에 따라 HAL 상수의 수를 정의할 수 있습니다.

질감 및 진폭에 따른 HAL 상수 범위

그림 7. 질감(HAL_H0) 및 진폭 배율(S)에 따른 HAL 상수 범위

HAL-API 상수 매핑을 위한 연속 모델

그림 8. HAL-API 상수 매핑: 연속 모델

연속 모델에서 서로 다른 HAL 상수는 서로 다른 진폭이 아닌 서로 다른 햅틱 질감을 나타냅니다. 배율(S)은 진폭을 구성할 수 있습니다. 그러나 질감 감지(예: 예민성)는 지속 시간 및 진폭의 감지와 관련이 있으므로 HAL-API 매핑의 디자인 프로세스에서 질감과 배율을 조합하는 것이 좋습니다.

그림 7에서는 상수 매핑을 보여줍니다. 진폭 확장성을 통해 하나의 HAL에서 여러 API 상수로 변화량을 증가시킵니다.

변화량 증가 1

변화량 증가 2

그림 9. 진폭 확장성을 통해 변화량 증가

VibrationEffect.CompositionPRIMITIVE_TICKPRIMITIVE_CLICK과 같이 확장 가능한 모든 API 상수의 경우 API 상수의 에너지 수준은 API 상수가 addPrimitive(int primitiveID, float scale, int delay)를 통해 선언될 때의 float scale 매개변수에 따라 달라집니다. PRIMITIVE_TICKPRIMITIVE_CLICK은 서로 다른 HAL 상수를 사용함으로써 명확하게 구분하여 디자인할 수 있습니다. 이 접근 방식은 질감에 변화량을 추가하려는 경우에 권장됩니다.

3단계: 하드웨어 평가

하드웨어 평가에는 효과 1, 2 및 3으로 지정된 세 가지 햅틱 효과 정의가 포함됩니다.

효과 1: 사전 정의된 짧은 햅틱 상수

VibrationEffect.EFFECT_CLICK 상수는 2단계에서 제공된 HAL-API 매핑의 기준 효과 또는 공통분모입니다. 가장 많이 사용되는 효과인 HapticFeedbackConstants.KEYBOARD_PRESS로 매핑됩니다. 이 효과를 평가하면 명확한 햅틱을 위한 대상 기기의 준비 상태를 판단하는 데 도움이 됩니다.

효과 2: 짧은 맞춤 햅틱 효과

VibrationEffect.createOneShot(20,255) 상수는 맞춤 햅틱 효과를 위한 것입니다. 짧은 단일 맞춤 임펄스의 경우 지속 시간을 정의하는 데 권장되는 최대 기준점은 20ms입니다. 20ms보다 긴 단일 임펄스는 윙윙거리는 진동으로 감지되기 때문에 권장되지 않습니다.

짧은 맞춤 햅틱 효과의 파형

그림 10. 짧은 맞춤 햅틱 효과

효과 3: 진폭 변화가 있는 긴 맞춤 햅틱 효과

VibrationEffect.createWaveform(timings[], amplitudes[], int repeat) 상수는 진폭 변화가 있는 긴 맞춤 효과를 위한 것입니다. 맞춤 햅틱 효과를 위해 다양한 진폭을 생성하는 기능은 기기의 풍부한 햅틱 기능을 평가하는 지표 중 하나입니다. 권장되는 timings []amplitudes []는 각각 {500, 500}{128, 255}이며 진폭이 500ms 샘플링 레이트로 50%에서 100%로 증가하는 추세를 나타냅니다.

진폭 변화가 있는 햅틱 효과 파형

그림 11. 진폭 변화가 있는 긴 맞춤 햅틱 효과

효과 3의 진폭 제어에 관한 하드웨어 기능을 확인하려면 Vibrator.hasAmplitudeControl() 메서드를 사용합니다. 의도대로 다양한 진폭을 사용하여 VibrationEffect.createWaveform을 실행하려면 결과가 true여야 합니다.

주관적 햅틱 효과 평가에 관한 플로우 차트

그림 12. 햅틱 효과 1, 2, 3의 주관적 평가

주관적 평가 실행

빠른 일관성 확인을 위해 먼저 주관적 평가를 실행합니다. 주관적 평가의 목표는 햅틱 효과의 진폭을 관찰하여 기기가 사람이 감지할 수 있는 진폭으로 햅틱을 생성할 수 있는지 확인하는 것입니다.

이 개념을 중심으로 구성된 구체적인 질문은 다음과 같습니다. 즉, 기기가 예상대로 사용자가 감지할 수 있는 햅틱 효과를 생성할 수 있나요? 이 질문에 답하면 사용자가 느낄 수 없으며 감지할 수 없는 햅틱 또는 개발자의 의도대로 파형이 패턴을 생성하지 않는 의도치 않은 햅틱을 포함하여 햅틱 실패를 방지하는 데 도움이 됩니다.

고급 평가 실행

고급 품질 평가를 실행하는 것이 좋습니다. 고급 품질 평가에서는 우수한 햅틱을 구현하기 위해 햅틱 효과의 정량화 가능한 속성을 특성화합니다. 이 평가를 완료하면 기기 제조업체는 현재 햅틱 상태를 진단할 수 있어야 합니다. 즉, 전반적인 품질 향상을 위한 목표를 설정할 수 있어야 합니다. 하드웨어 평가를 참고하세요.