Тактильная обратная связь пера

Узнайте, как использовать тактическую обратную связь с пером устройств, чтобы обеспечить более естественное и тактильное взаимодействие в приложении Windows App SDK.

В Windows 11 была представлена тактильная обратная связь для цифровых перьев, позволяющая пользователям ощущать взаимодействие пера с интерфейсом приложения. При упоминании этой функции термин haptic используется в API и документации для разработчиков, а tactile — это название, отображаемое для пользователей в параметрах Windows.

Ключевые API

Типы тактильной обратной связи

Доступны два типа тактильной отдачи:

  • Тактильный отклик при рукописном вводе — имитирует ощущение письма или рисования такими инструментами, как перо, маркер, карандаш и текстовыделитель, с помощью непрерывной вибрации, пока стилус касается экрана.
  • Обратная связь о взаимодействии — короткие сигналы о действиях пользователя, таких как наведение указателя мыши на кнопку, нажатие или подтверждение завершенного действия.

Распознавание ввода пером

Зарегистрируйтесь для 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
}