Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Узнайте, как использовать тактическую обратную связь с пером устройств, чтобы обеспечить более естественное и тактильное взаимодействие в приложении Windows App SDK.
В Windows 11 была представлена тактильная обратная связь для цифровых перьев, позволяющая пользователям ощущать взаимодействие пера с интерфейсом приложения. При упоминании этой функции термин haptic используется в API и документации для разработчиков, а tactile — это название, отображаемое для пользователей в параметрах Windows.
Ключевые API
- PenDevice
- SimpleHapticsController
- Известные простые формы сигналов тактильного контроллера
- PenDeviceInterop (Windows App 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.
}
Получение объекта PenDevice в Windows App SDK
В приложении на Windows App SDK используйте PenDeviceInterop — класс взаимодействия Windows App SDK — чтобы получить объект WinRT PenDevice из точки указателя.
PenDevice, SimpleHapticsController и KnownSimpleHapticsControllerWaveforms являются типами WinRT из пространств имен Windows.Devices.Input и Windows.Devices.Haptics; только сам вызов взаимодействия происходит из пространства имен Microsoft.UI.Input.Interop Windows App SDK:
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).
}
Замечание
Вместо этого используйте PenDevice.GetFromPointerId в приложениях UWP. Класс PenDeviceInterop зависит от Windows App SDK.
Волновые формы рисования
Волновые эффекты рукописного ввода непрерывно воспроизводятся, пока перо касается экрана. Требуемые формы сигнала гарантированно поддерживаются любым тактильным пером.
| Форма сигнала | Description | Обязательно |
|---|---|---|
| InkContinuous | Ощущение шариковой ручки по умолчанию. Резервный вариант для неподдерживаемых форм сигнала. | Да |
| BrushContinuous | Средство кисти | Нет |
| Карандаш Непрерывный | Инструмент "Карандаш" | Нет |
| МаркерНепрерывный | Инструмент «Маркер» | Нет |
| ChiselMarkerContinuous | Маркер со скошенным наконечником / текстовыделитель | Нет |
| ЛастикНепрерывный | Инструмент «Ластик» | Нет |
| GalaxyPenContinuous | Специальные чернила (многоцветная кисть) | Нет |
Формы волн взаимодействия
Формы волны взаимодействия предоставляют короткие прямые отзывы о действиях пользовательского интерфейса.
| Форма сигнала | Description | Обязательно |
|---|---|---|
| Click | Короткое нажатие по умолчанию. Резервный вариант для неподдерживаемых взаимодействий. | Да |
| Error | Не удалось выполнить действие или произошла ошибка | Нет |
| Навести курсор | Начало наведения указателя мыши на интерактивный элемент | Нет |
| Нажать | Нажал на интерактивный элемент | Нет |
| Релиз | Выпущен интерактивный элемент | Нет |
| Success | Действие выполнено успешно | Нет |
| BuzzContinuous | Непрерывный шум | Нет |
| RumbleContinuous | Непрерывный грохот | Нет |
Отправить тактильный отклик
Выполните итерацию 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