Feedback aptico (tattile) della penna

Scopri come usare il feedback aptico dai dispositivi penna per fornire interazioni più naturali e tattili nella tua app SDK per app di Windows.

Windows 11 ha introdotto il feedback aptico per le penne digitali, consentendo agli utenti di sentire la penna mentre interagisce con l'interfaccia utente dell'app. Quando si fa riferimento a questa funzionalità, l'aptico viene usato nelle API e nella documentazione per sviluppatori, mentre tactile è il nome rivolto all'utente visualizzato in impostazioni di Windows.

API chiave

Tipi di feedback aptico

Sono disponibili due tipi di feedback aptico:

  • Feedback di scrittura — Simula la sensazione degli strumenti di scrittura o disegno (penna, pennarello, matita, evidenziatore) tramite vibrazioni continue mentre la penna è a contatto con lo schermo.
  • Feedback di interazione : segnali tattili brevi per le azioni dell'utente, ad esempio il passaggio del mouse su un pulsante, il clic o la conferma di un'azione completata.

Rilevare l'input della penna

Eseguire la registrazione per l'evento PointerEntered e verificare se il tipo di dispositivo puntatore è una penna:

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

    // Pen detected — check for haptic support.
}

Ottenere il dispositivo Penna nel SDK per app di Windows

In un'app SDK per app di Windows usare PenDeviceInterop , una classe di interoperabilità SDK per app di Windows, per ottenere l'oggetto WinRT PenDevice da un punto di puntatore. PenDevice, SimpleHapticsController e KnownSimpleHapticsControllerWaveforms sono tipi WinRT dei namespace Windows.Devices.Input e Windows.Devices.Haptics; solo la chiamata di interoperabilità in sé proviene dallo spazio dei nomi Microsoft.UI.Input.Interop di SDK per app di 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).
}

Annotazioni

Nelle app UWP, usa PenDevice.GetFromPointerId invece. La PenDeviceInterop classe è specifica del SDK per app di Windows.

Forme d'onda di inchiostrazione

Le forme d'onda dell'input penna vengono riprodotte continuamente mentre la penna è a contatto con lo schermo. Le forme d'onda obbligatorie sono sicuramente supportate da qualsiasi penna aptica.

Forma d' onda Description Obbligatorio
InkContinuous Sensazione predefinita della penna a sfera. Alternativa per forme d'onda non supportate. Yes
PennelloContinuo Pennello No
MatitaContinua Strumento matita No
MarkerContinuo Strumento evidenziatore No
ChiselMarkerContinuous Marcatore/evidenziatore di chisele No
EraserContinuous Strumento gomma No
GalaxyPenContinuous Inchiostro speciale (pennello multicolore) No

Forme d'onda di interazione

Le forme d'onda di interazione forniscono un feedback breve e diretto per le azioni dell'interfaccia utente.

Forma d' onda Description Obbligatorio
Click Clic breve predefinito. Alternativa per le interazioni non supportate. Yes
Error Azione non riuscita o errore No
Hover Inizio del passaggio del puntatore su un elemento interattivo No
Passeggiata Premuto un elemento interattivo No
Release Rilasciato un elemento interattivo No
Success Azione riuscita No
BuzzContinuous Continuo ronzio No
RumbleContinuous Vibrazione continua No

Inviare feedback aptico

Scorrere SupportedFeedback per trovare la forma d'onda desiderata, quindi chiamare 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);
}

Interrompere il feedback aptico

Arrestare sempre il feedback aptico quando il puntatore esce dall'elemento. Eseguire la registrazione per PointerExited nello stesso elemento:

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

Annotazioni

Alcune penne interrompono automaticamente il feedback aptico quando la penna si allontana dallo schermo. Tuttavia, non tutte le penne lo fanno, quindi sempre chiamare StopFeedback in modo esplicito.

Personalizzare il feedback aptico

Alcune penne supportano personalizzazioni aggiuntive. Controllare il supporto prima di usarli:

Property Controllare il supporto con
Intensità IsIntensitySupported
Numero di riproduzioni IsPlayCountSupported
Durata del gioco IsPlayDurationSupported
Intervallo di sospensione della riproduzione IsReplayPauseIntervalSupported
if (hapticsController.IsIntensitySupported)
{
    hapticsController.SendHapticFeedback(currentWaveform, 0.75); // 75% intensity
}