햅틱 구현

일반적으로 장치 제조업체는 각 장치에 대해 생성된 개인 자산의 소유자로 간주됩니다. 따라서 엔지니어링 노력은 종종 장치별 기준 에 집중됩니다. 생태계 내 다른 장치의 일관성을 유지하기 위한 노력은 거의 또는 전혀 이루어지지 않습니다.

이와는 대조적으로 개발자는 각 기기의 기술 사양에 관계없이 생태계의 모든 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 요소도 없습니다. 상수에는 createPredefined() 에 의해 호출되는 EFFECT_CLICKEFFECT_HEAVY_CLICK 와 같은 에너지 수준 개념이 대신 포함됩니다.
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 원칙을 기반으로 합니다. 자세한 내용은 Haptics UX 디자인을 참조하세요.

HAL-API 상수 매핑을 위한 이산 모델

그림 6. HAL-API 상수 매핑: 이산 모델

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

연속 모델

진폭 확장성을 갖춘 연속 모델을 적용하여 HAL 상수를 정의할 수 있습니다. HAL 상수(예: HAL_H0 , HAL_H1 )에 배율 인수( S )를 적용하여 조정된 HAL( HAL_H0 x S )을 생성할 수 있습니다. 이 경우 스케일링된 HAL은 그림 7과 같이 API 상수( HAL_H0 x S1 = H0S1 = EFFECT_TICK )를 정의하기 위해 매핑됩니다. 연속 모델의 진폭 확장성을 사용하여 기기는 독특한 텍스처를 가진 적은 수의 HAL 상수를 저장할 수 있습니다. 스케일링 인자( S )를 조정하여 진폭 변화를 추가합니다. 장치 제조업체는 제공하려는 다양한 햅틱 텍스처 수에 따라 HAL 상수의 수를 정의할 수 있습니다.

텍스처 및 진폭에 따른 HAL 상수 범위

그림 7. 텍스처별 HAL 상수 범위(HAL_H0) 및 진폭 스케일(S)

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

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

연속 모델에서 다양한 HAL 상수는 다양한 진폭이 아닌 다양한 햅틱 텍스처를 나타냅니다. 스케일 팩터( S )는 진폭을 구성할 수 있습니다. 그러나 텍스처에 대한 인식(예: 선명도)은 지속 시간 및 진폭에 대한 인식과 관련되므로 (HAL-API 매핑의 설계 과정에서) 텍스처와 스케일 팩터를 결합하는 것이 좋습니다.

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

증가하는 변동 1

증가하는 변형 2

그림 9. 진폭 확장성에 따른 변동 증가

VibrationEffect.CompositionPRIMITIVE_TICKPRIMITIVE_CLICK 과 같은 확장 가능한 모든 API 상수의 경우 API 상수가 addPrimitive(int primitiveID, float scale, int delay) 통해 선언될 때 API 상수의 에너지 수준은 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의 피험자 평가

주관적인 평가 수행

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

이 개념을 중심으로 구성된 특정 질문은 다음과 같습니다. 장치가 예상대로 사용자에게 쉽게 인지할 수 있는 촉각 효과를 생성할 수 있습니까? 이 질문에 대답하면 사용자가 느낄 수 없는 눈에 띄지 않는 햅틱이나 파형이 의도한 대로 패턴을 생성하지 않는 의도하지 않은 햅틱을 포함하여 실패한 햅틱을 방지하는 데 도움이 됩니다.