Resposta háptica (tátil) da caneta

Aprenda a usar feedback háptico de dispositivos com caneta para proporcionar interações mais naturais e táteis na sua aplicação SDK de Aplicações Windows.

O Windows 11 introduziu feedback háptico para canetas digitais, permitindo aos utilizadores sentir a sua caneta a interagir com a interface da aplicação. Ao fazer referência a esta funcionalidade, haptic é utilizado nas APIs e na documentação para programadores, enquanto tactile é a designação apresentada ao utilizador nas Definições do Windows.

APIs principais

Tipos de feedback háptico

Existem dois tipos de feedback háptico disponíveis:

  • Resposta tátil da tinta digital — Simula a sensação de instrumentos de escrita ou desenho (caneta, marcador, lápis, marca-texto) por meio de vibrações contínuas enquanto a caneta toca no ecrã.
  • Feedback de interação — Sinais táteis curtos para ações do utilizador, como passar o rato sobre um botão, clicar ou confirmar uma ação concluída.

Detetar entrada da caneta stylus

Registe-se para o PointerEntered evento e verifique se o tipo de dispositivo ponteiro é uma caneta:

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

    // Pen detected — check for haptic support.
}

Obtenha o PenDevice no SDK de Aplicações Windows

Numa aplicação do SDK de Aplicações Windows, use PenDeviceInterop — uma classe de interoperabilidade do SDK de Aplicações Windows — para obter o objeto WinRT PenDevice a partir de um ponto indicado pelo ponteiro. PenDevice, SimpleHapticsController e KnownSimpleHapticsControllerWaveforms são tipos WinRT dos espaços de nomes Windows.Devices.Input e Windows.Devices.Haptics; apenas a própria chamada de interoperabilidade provém do espaço de nomes Microsoft.UI.Input.Interop do SDK de Aplicações 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).
}

Observação

Nas aplicações UWP, use PenDevice.GetFromPointerId em vez disso. A PenDeviceInterop classe é específica do SDK de Aplicações Windows.

Formas de onda de entintamento

As formas de onda dos traços manuscritos são reproduzidas continuamente enquanto a caneta estiver em contacto com o ecrã. É garantido que qualquer caneta háptica suporta as formas de onda necessárias.

Forma de onda Description Obrigatório
InkContinuous Sensação padrão de caneta esferográfica. Alternativa para formas de onda não suportadas. Yes
BrushContinuous Ferramenta Pincel No
LápisContínuo Ferramenta lápis No
MarcadorContínuo Ferramenta de marcadores No
Cinzel Marcador Contínuo Marcador com ponta em cinzel / marcador de texto No
Apagador Contínuo Ferramenta Borracha No
GalaxyPenContinuous Tinta especial (pincel multicolorido) No

Formas de onda de interação

As formas de onda de interação fornecem feedback curto e direto para as ações da interface.

Forma de onda Description Obrigatório
Clique em Clique curto por defeito. Alternativa para interações não suportadas. Yes
Erro A ação falhou ou ocorreu erro No
Passe o cursor Começou a pairar sobre um elemento interativo No
Pressionar Pressionou um elemento interativo No
Release Lançado um elemento interativo No
Success Ação bem-sucedida No
BuzzContinuous Zumbido contínuo No
RumbleContinuous Ronco contínuo No

Enviar resposta háptica

Percorra SupportedFeedback para encontrar a forma de onda pretendida e, em seguida, chame 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);
}

Pare o feedback háptico

Pare sempre o feedback háptico quando o ponteiro sair do elemento. Registe PointerExited no mesmo elemento:

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

Observação

Algumas canetas param a háptica automaticamente quando a caneta sai do ecrã. No entanto, nem todas as canetas fazem isto, por isso, chama sempre StopFeedback explicitamente.

Personalizar resposta háptica

Algumas canetas suportam personalizações adicionais. Verifique o suporte antes de os usar:

Property Verifique o suporte com
Intensidade IsIntensitySupported
Contagem de jogadas IsPlayCountSupported
Duração do jogo IsPlayDurationSupported
Intervalo de pausa da reprodução IsReplayPauseIntervalSupported
if (hapticsController.IsIntensitySupported)
{
    hapticsController.SendHapticFeedback(currentWaveform, 0.75); // 75% intensity
}