Sprzężenie haptyczne (dotykowe) pióra

Dowiedz się, jak używać haptycznych informacji zwrotnych z urządzeń długopisowych, aby zapewnić bardziej naturalne i dotykowe interakcje w aplikacji Zestaw SDK do aplikacji systemu Windows.

System Windows 11 wprowadził sprzężenie haptyczne dla piór cyfrowych, umożliwiając użytkownikom odczuwanie interakcji pióra z interfejsem aplikacji. W odniesieniu do tej funkcji termin haptyczny jest używany w interfejsach API i dokumentacji dla deweloperów, natomiast dotyk to nazwa widoczna dla użytkownika, wyświetlana w Ustawieniach systemu Windows.

Kluczowe interfejsy API

Typy opinii haptycznych

Dostępne są dwa typy opinii haptycznych:

  • Sprzężenie zwrotne pisania odręcznego — Symuluje odczucia towarzyszące pisaniu lub rysowaniu za pomocą narzędzi (pióra, markera, ołówka, zakreślacza) dzięki ciągłym wibracjom, gdy pióro dotyka ekranu.
  • Opinie dotyczące interakcji — krótkie sygnały dotykowe dla akcji użytkownika, takich jak umieszczenie wskaźnika myszy na przycisku, kliknięcie lub potwierdzenie ukończonej akcji.

Wykrywanie wejścia pióra

Zarejestruj procedurę obsługi zdarzenia PointerEntered i sprawdź, czy typ urządzenia wskazującego to pióro:

private void InputObserver_PointerEntered(object sender, PointerRoutedEventArgs e)
{
    if (e.Pointer.PointerDeviceType != Microsoft.UI.Input.PointerDeviceType.Pen)
    {
        return;
    }

    // Pen detected — check for haptic support.
}

Pobieranie urządzenia PenDevice w Zestaw SDK do aplikacji systemu Windows

W aplikacji Zestaw SDK do aplikacji systemu Windows użyj klasy PenDeviceInterop — klasy interoperacyjnej zestawu Zestaw SDK do aplikacji systemu Windows — aby uzyskać obiekt WinRT PenDevice z punktu wskazywanego przez wskaźnik. PenDevice, SimpleHapticsController i KnownSimpleHapticsControllerWaveforms są typami WinRT z przestrzeni nazw Windows.Devices.Input i Windows.Devices.Haptics; tylko samo wywołanie interoperacyjne pochodzi z przestrzeni nazw Microsoft.UI.Input.Interop zestawu Zestaw SDK do aplikacji systemu Windows:

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).
}

Uwaga / Notatka

W aplikacjach platformy UWP użyj PenDevice.GetFromPointerId zamiast tego. Ta PenDeviceInterop klasa jest specyficzna dla zestawu Zestaw SDK do aplikacji systemu Windows.

Kształty fal odręczne

Odręczne kształty falowe są odtwarzane w sposób ciągły, gdy pióro kontaktuje się z ekranem. Wymagane kształty fali są gwarantowane przez wszelkie pióro dotykowe.

Przebieg Description Wymagane
InkContinuous Domyślne wrażenie długopisu. Rezerwowy dla nieobsługiwanych kształtów fal. Yes
Szczotka Ciągła Narzędzie pędzla No
Ołówekkontynualne Narzędzie ołówka No
ZnacznikCiągły Narzędzie znacznikowe No
MarkerOstrzowyCiągły Znacznik/wyróżniacz No
GumkaCiągła Narzędzie wymazywania No
GalaxyPenContinuous Specjalny atrament (wielokolorowy pędzel) No

Kształty fal interakcji

Przebiegi falowe interakcji zapewniają krótkie, bezpośrednie informacje zwrotne dotyczące działań w interfejsie użytkownika.

Przebieg Description Wymagane
Kliknij Domyślne krótkie kliknięcie. Alternatywa awaryjna dla nieobsługiwanych interakcji. Yes
Error Akcja nie powiodła się lub wystąpił błąd No
Hover Rozpoczęto najeżdżanie kursorem na element interaktywny No
Prasa Naciśnięcie elementu interaktywnego No
Uwolnij Wydanie elementu interaktywnego No
Success Akcja powiodła się No
BuzzContinuous Ciągłe brzęczenie No
RumbleContinuous Ciągły pomruk No

Wysyłanie opinii haptycznej

Przejdź przez SupportedFeedback, aby znaleźć żądany przebieg, a następnie wywołaj 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);
}

Wyłącz sprzężenie haptyczne

Zawsze wyłączaj sprzężenie haptyczne, gdy wskaźnik opuści element. Zarejestruj PointerExited w tym samym elemencie:

private void Canvas_PointerExited(object sender, PointerRoutedEventArgs e)
{
    hapticsController?.StopFeedback();
}

Uwaga / Notatka

Niektóre pióra automatycznie wyłączają wibracje haptyczne, gdy pióro odsuwa się od ekranu. Jednak nie wszystkie długopisy to robią, więc zawsze należy jawnie wywołać StopFeedback .

Dostosuj informację zwrotną haptyczną

Niektóre pióra oferują dodatkowe opcje dostosowania. Przed rozpoczęciem korzystania z nich sprawdź pomoc techniczną:

Property Sprawdź pomoc techniczną
Intensywność IsIntensitySupported
Liczba odtwarzania IsPlayCountSupported
Czas trwania odtwarzania IsPlayDurationSupported
Interwał pauzy odtwarzania IsReplayPauseIntervalSupported
if (hapticsController.IsIntensitySupported)
{
    hapticsController.SendHapticFeedback(currentWaveform, 0.75); // 75% intensity
}