펜 디바이스에서 촉각 피드백을 사용하여 Windows 앱 SDK 앱에서 보다 자연스럽고 촉각적인 상호 작용을 제공하는 방법을 알아봅니다.
Windows 11 디지털 펜에 대한 촉각 피드백을 도입하여 사용자가 펜이 앱의 UI와 상호 작용하는 것을 느낄 수 있도록 했습니다. 이 기능을 지칭할 때 햅틱은 개발자 API 및 문서에서 사용되며, 반면 촉각은 Windows 설정에 표시되는 사용자용 명칭입니다.
주요 API
- PenDevice
- SimpleHapticsController
- KnownSimpleHapticsControllerWaveforms
- PenDeviceInterop(Windows 앱 SDK)
촉각 피드백 유형
다음 두 가지 유형의 촉각 피드백을 사용할 수 있습니다.
- 수동 입력 피드백 - 펜이 화면에 닿는 동안 연속 진동을 통해 필기 또는 그리기 도구(펜, 마커, 연필, 형광펜)의 느낌을 시뮬레이션합니다.
- 상호 작용 피드백 - 단추 위로 마우스를 가져가거나, 클릭하거나, 완료된 작업을 확인하는 등의 사용자 작업에 대한 짧은 촉각 신호입니다.
펜 입력 감지
이벤트에 등록 PointerEntered 하고 포인터 디바이스 유형이 펜인지 확인합니다.
private void InputObserver_PointerEntered(object sender, PointerRoutedEventArgs e)
{
if (e.Pointer.PointerDeviceType != Microsoft.UI.Input.PointerDeviceType.Pen)
{
return;
}
// Pen detected — check for haptic support.
}
Windows 앱 SDK에서 PenDevice 가져오기
Windows 앱 SDK 앱에서 Windows 앱 SDK interop 클래스를 사용하여 PenDeviceInterop 포인터 지점에서 WinRT PenDevice 개체를 가져옵니다.
PenDevice, SimpleHapticsController, 및 KnownSimpleHapticsControllerWaveforms는 Windows.Devices.Input 및 Windows.Devices.Haptics 네임스페이스의 WinRT 형식이며, interop 호출 자체만 Windows 앱 SDK의 Microsoft.UI.Input.Interop 네임스페이스에서 제공됩니다.
using Microsoft.UI.Input.Interop;
using Windows.Devices.Haptics;
using Windows.Devices.Input;
using Windows.Foundation.Metadata;
private void InputObserver_PointerEntered(object sender, PointerRoutedEventArgs e)
{
if (e.Pointer.PointerDeviceType != Microsoft.UI.Input.PointerDeviceType.Pen)
{
return;
}
var penDevice = PenDeviceInterop.FromPointerPoint(e.GetCurrentPoint(null));
if (penDevice == null)
{
return; // Pen does not support advanced features.
}
// SimpleHapticsController requires Windows 11. Check for API presence
// before accessing it so the app doesn't throw on Windows 10.
if (!ApiInformation.IsPropertyPresent(
"Windows.Devices.Input.PenDevice", "SimpleHapticsController"))
{
return; // Haptic feedback requires Windows 11.
}
var hapticsController = penDevice.SimpleHapticsController;
if (hapticsController == null)
{
return; // Pen does not support haptic feedback.
}
// Configure haptic feedback (see examples below).
}
비고
UWP 앱에서 대신 사용합니다 PenDevice.GetFromPointerId . 클래스는 PenDeviceInterop Windows 앱 SDK 관련되어 있습니다.
잉킹 파형
펜이 화면에 닿아 있는 동안 잉크 파형이 계속 표시됩니다. 필요한 파형은 모든 햅틱 펜에서 지원이 보장됩니다.
| 파형 | Description | 필수 |
|---|---|---|
| InkContinuous | 기본 볼펜 느낌. 지원되지 않는 파형에 대한 대체입니다. | Yes |
| 연속 브러시 | 브러시 도구 | No |
| PencilContinuous | 연필 도구 | No |
| MarkerContinuous | 마커 도구 | No |
| ChiselMarkerContinuous | 쐐기형 마커/형광펜 | No |
| 연속 지우개 | 지우개 도구 | No |
| GalaxyPenContinuous | 특수 잉크(여러 색 브러시) | No |
상호 작용 파형
상호 작용 파형은 UI 작업에 대한 짧고 직접적인 피드백을 제공합니다.
| 파형 | Description | 필수 |
|---|---|---|
| 클릭 | 기본 짧은 클릭입니다. 지원되지 않는 상호 작용에 대한 대체입니다. | Yes |
| 오류 | 작업이 실패했거나 오류가 발생했습니다. | No |
| 호버 | 대화형 요소 위로 마우스를 가리키기 시작했습니다. | No |
| 눌러주세요 | 대화형 요소를 눌렀습니다. | No |
| Release | 대화형 요소 릴리스됨 | No |
| Success | 작업 성공 | No |
| BuzzContinuous | 연속 윙윙 거리는 소리 | No |
| 연속 진동 | 지속적인 우르릉거림 | No |
촉각 피드백 보내기
반복하여 원하는 파형을 찾은 다음, 다음을 호출SupportedFeedback합니다.SendHapticFeedback
SimpleHapticsControllerFeedback currentWaveform = null;
// Try to use BrushContinuous, fall back to InkContinuous.
foreach (var waveform in hapticsController.SupportedFeedback)
{
if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.BrushContinuous)
{
currentWaveform = waveform;
break;
}
}
if (currentWaveform == null)
{
foreach (var waveform in hapticsController.SupportedFeedback)
{
if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.InkContinuous)
{
currentWaveform = waveform;
break;
}
}
}
if (currentWaveform != null)
{
hapticsController.SendHapticFeedback(currentWaveform);
}
촉각 피드백 중지
포인터가 요소를 종료할 때 항상 촉각 피드백을 중지합니다. 동일한 요소에 PointerExited을(를) 등록합니다.
private void Canvas_PointerExited(object sender, PointerRoutedEventArgs e)
{
hapticsController?.StopFeedback();
}
비고
일부 펜은 펜이 화면을 떠날 때 자동으로 촉각을 중지합니다. 그러나 모든 펜이 이 작업을 수행하는 것은 아니므로 항상 명시적으로 호출 StopFeedback 합니다.
촉각 피드백 사용자 지정
일부 펜은 추가 사용자 지정을 지원합니다. 사용하기 전에 지원 여부를 확인하세요.
| 재산 | 다음을 사용하여 지원 확인 |
|---|---|
| 강도 | IsIntensitySupported |
| 재생 수 | IsPlayCountSupported |
| 재생 기간 | IsPlayDurationSupported |
| 재생 일시 중지 간격 | IsReplayPauseIntervalSupported |
if (hapticsController.IsIntensitySupported)
{
hapticsController.SendHapticFeedback(currentWaveform, 0.75); // 75% intensity
}
관련된 문서
Windows developer