Compartilhar via


Comentários sobre interações com caneta e táteis

O Windows há muito oferece suporte a canetas digitais que permitem que os usuários interajam com seus dispositivos de maneira natural e direta e expressem sua criatividade por meio de experiências ricas de escrita e desenho usando tinta digital.

Com o Windows 11, um novo recurso está sendo introduzido que torna a experiência da caneta digital ainda mais natural e atraente: ao usar uma caneta que dá suporte a "feedback tátil", os usuários podem realmente sentir sua caneta interagindo de maneira tátil com a interface do usuário (UI) de um aplicativo.

Observação

Ao se referir a esse novo recurso, "háptico" é usado em todas as APIs do desenvolvedor e na documentação relacionada, enquanto "tátil" é o nome amigável apresentado aos usuários para definir preferências de comentários nas Configurações do Windows.

As experiências de comentários hápticos com suporte no Windows 11 incluem comentários de escrita à tinta e comentários de interação:

  • O feedback de escrita à tinta simula a sensação de vários tipos de ferramentas de escrita ou desenho (como caneta, marcador, lápis, marcador e assim por diante) por meio de vibrações contínuas enquanto a caneta está em contato com a tela. Por padrão, a Plataforma Windows Ink dá suporte a comentários hápticos para todas as ferramentas de desenho (este tópico aborda como fornecer uma solução de escrita à tinta personalizada além daquela com suporte do Windows Ink).
  • O feedback de interação, por outro lado, é um feedback direto baseado nas principais ações do usuário, como passar o mouse ou clicar em um botão, responder à conclusão de uma ação ou chamar a atenção do usuário.

Normalmente, cinco etapas são necessárias para dar suporte total ao feedback tátil:

  • Detecte a entrada da caneta.
  • Determine se a caneta e o dispositivo atuais dão suporte a comentários hápticos e, em caso afirmativo, quais recursos de comentários hápticos são compatíveis.
  • Decida sobre o sinal de feedback tátil a ser enviado.
  • Envie o feedback tátil.
  • Pare o feedback tátil

Detectar entrada de caneta

Para detectar e isolar a entrada da caneta, você deve primeiro se registrar para o evento PointerEntered e, em seguida, verificar se o PointerDeviceType é uma caneta.

O código a seguir mostra como verificar o tipo de dispositivo de ponteiro em um evento PointerEntered. Para este exemplo, se a entrada não for de uma caneta, simplesmente retornaremos do manipulador de eventos. Caso contrário, verificamos os recursos da caneta e configuramos o feedback tátil.


private void InputObserver_PointerEntered(object sender, PointerRoutedEventArgs e)
{
    ...
    
    // If the current Pointer device is not a pen, exit.
    if (e.Pointer.PointerDeviceType != PointerDeviceType.Pen) 
    {
       return;
    }
    
    ...    
}

Determinar o suporte para feedback tátil

Nem todas as canetas e digitalizadores dão suporte a comentários hápticos, e as canetas que dão suporte não dão necessariamente suporte a todos os recursos de comentários hápticos descritos neste tópico. Como tal, é importante confirmar programaticamente quais recursos são suportados pela caneta ativa.

Em uma continuação do exemplo anterior, mostramos como verificar se a caneta ativa dá suporte a comentários hápticos.

Primeiro, tentamos recuperar um objeto PenDevice do PointerId atual. Se um PenDevice não puder ser obtido, simplesmente retornaremos do manipulador de eventos.

Se um PenDevice foi obtido, testamos se ele dá suporte a uma propriedade SimpleHapticsController . Caso contrário, simplesmente retornamos novamente do manipulador de eventos.

// Attempt to retrieve the PenDevice from the current PointerId.
penDevice = PenDevice.GetFromPointerId(e.Pointer.PointerId);

// If a PenDevice cannot be retrieved based on the PointerId, it does not support 
// advanced pen features, such as haptic feedback. 
if (penDevice == null)
{
    return;
}

// Check to see if the current PenDevice supports haptic feedback by seeing if it 
// has a SimpleHapticsController.
hapticsController = penDevice.SimpleHapticsController;
if (hapticsController == null)
{
    return;
}

O SimpleHapticsController recuperado no exemplo anterior é usado em exemplos subsequentes para consultar recursos hápticos e enviar/parar comentários hápticos.

Observação

Se você estiver criando aplicativos com o SDK do Aplicativo Windows Versão Prévia 1.0, poderá usar a interoperabilidade PenDevice (PenDeviceInterop.FromPointerPoint(PointerPoint)) para acessar o PenDevice do sistema.

private void InputObserver_PointerEntered(PointerInputObserver sender, PointerEventArgs args)
{
    var penDevice = PenDeviceInterop.PenDeviceFromPointerPoint(args.CurrentPoint);
}

As seções a seguir descrevem os recursos de comentários que as canetas hápticas devem suportar, bem como aqueles que são opcionais. Um tipo de feedback tátil necessário normalmente pode ser usado como um fallback em vez de um recurso opcional.

Formas de onda de tinta

As formas de onda de tinta são reproduzidas continuamente enquanto a caneta está em contato com a tela e tentam simular a sensação de várias ferramentas de escrita ou desenho.

Recurso Descrição Obrigatório/Opcional
Forma de onda InkContinous Simula a sensação de escrita à tinta com uma caneta esferográfica real. Esse é o fallback padrão quando uma forma de onda de escrita à tinta não é suportada por uma caneta háptica. Obrigatório
EscovaForma de onda contínua Sinal tátil contínuo quando o usuário seleciona o pincel como ferramenta de tinta. Opcional
CinzelMarcadorForma de onda contínua Sinal tátil contínuo quando o usuário seleciona o marcador/marcador de cinzel como ferramenta de tinta. Opcional
Forma de onda EraserContinuous Sinal tátil contínuo quando o usuário seleciona borracha como ferramenta de tinta. Opcional
GaláxiaForma de onda contínua
(a documentação e o guia de implementação da HID referem-se a essa forma de onda como BrilhoContínuo)
Sinal tátil contínuo para ferramentas de tinta especiais, como um pincel multicolorido. Opcional
MarcadorForma de onda contínua Sinal tátil contínuo quando o usuário seleciona o marcador como ferramenta de tinta. Opcional
LápisForma de onda contínua Sinal tátil contínuo quando o usuário seleciona o lápis como ferramenta de tinta. Opcional

Formas de onda de interação

As formas de onda de interação são normalmente curtas (exceções observadas na tabela a seguir), formas de onda de feedback direto geradas sob demanda para confirmar ações importantes, como passar o mouse ou clicar em um botão, responder à conclusão de uma ação ou chamar a atenção do usuário.

Recurso Descrição Obrigatório/Opcional
Clique em forma de onda Um breve feedback de "clique". Esse é o fallback padrão quando uma forma de onda de interação selecionada pelo aplicativo não é compatível com uma caneta háptica. Obrigatório
Forma de onda de erro Um sinal forte para alertar o usuário de que uma ação falhou ou ocorreu um erro. Opcional
Forma de onda flutuante Indica que o usuário começou a passar o mouse sobre um elemento de interface do usuário interativo. Opcional
Forma de onda da prensa Indica quando um usuário pressiona um elemento de interface do usuário interativo em uma ação incremental (consulte Versão). Opcional
Liberar forma de onda Indica quando um usuário libera um elemento de interface do usuário interativo em uma ação incremental (consulte Pressionar). Opcional
Forma de onda de sucesso Sinal forte para alertar o usuário de que uma ação foi bem-sucedida. Opcional
ZumbidoForma de onda contínua Sensação de zumbido contínuo. Opcional
RumbleForma de onda contínua Sensação de estrondo contínuo. Opcional

Personalizações de feedback tátil

Algumas canetas hápticas podem dar suporte às seguintes personalizações.

Recurso Descrição Obrigatório/Opcional
Intensidade Define a intensidade do sinal tátil. Opcional
Contagem de reproduções Repete um sinal tátil um número especificado de vezes. Opcional
Intervalo de pausa de repetição Define o tempo entre cada reprodução repetida do sinal háptico. Opcional
Duração do jogo Define o intervalo de tempo em que um sinal háptico é reproduzido. Opcional

Verificar o suporte a configurações personalizadas

Para verificar o suporte a Intensidade, Contagem de Repetição, Intervalo de Pausa de Repetição e Duração da Reprodução, use as seguintes propriedades do SimpleHapticsController:

Enviar e parar de escrever feedback tátil

Use o método SendHapticFeedback do objeto SimpleHapticsController para passar formas de onda de escrita à tinta para a caneta do usuário. Esse método dá suporte à passagem de uma forma de onda ou de ambas as formas de onda com um valor de intensidade personalizado (consulte Personalizar feedback tátil).

Chame SendHapticFeedback e passe uma forma de onda de escrita à tinta para configurar a caneta para começar a reproduzir essa forma de onda assim que a ponta da caneta tocar em qualquer lugar da tela. A forma de onda continuará sendo reproduzida até que a caneta seja levantada ou o StopFeedback seja chamado, o que acontecer primeiro. É recomendável fazer isso no manipulador de eventos PointerEntered para o elemento no qual você deseja que a resposta tátil seja reproduzida. Por exemplo, um aplicativo com uma implementação de escrita à tinta personalizada faria isso no método PointerEntered de sua tela de escrita à tinta.

Para recuperar a forma de onda de escrita à tinta desejada, você deve iterar por meio da coleção SupportedFeedback do SimpleHapticsController, garantindo que ela seja compatível com a caneta ativa.

Se não houver suporte, você poderá optar por não reproduzir nada ou voltar para a forma de onda InkContinued , pois isso é garantido para ser suportado.

No exemplo a seguir, tentamos enviar a forma de onda BrushContinuous (mas retornamos para InkContinuous se não houver suporte para BrushContínuo).

SimpleHapticsControllerFeedback currentWaveform;

// Attempt to set the currentWaveform to BrushContinuous.
foreach (var waveform in hapticsController.SupportedFeedback)
{
    if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.BrushContinuous)
    {
        currentWaveform = waveform;
    }
} 

// If currentWaveform is null, it was not in the SupportedFeedback collection, so instead set 
// the waveform to InkContinuous.
if (currentWaveform == null)
{
    foreach (var waveform in hapticsController.SupportedFeedback)
    {
        if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.InkContinuous)
        {
            currentWaveform = waveform;
        }
    }
}

// Send the currentWaveform 
hapticsController.SendHapticFeedback(currentWaveform);

É importante que você também interrompa o feedback tátil quando o ponteiro associado sair do elemento registrado para feedback tátil. Caso contrário, a forma de onda continuará tentando ser reproduzida na caneta ativa.

Observação

Algumas canetas podem, opcionalmente, parar a sensação tátil por conta própria quando a caneta sai do alcance da tela. No entanto, não é necessário que todas as canetas façam isso, portanto, os aplicativos devem sempre interromper explicitamente o feedback tátil, conforme descrito aqui.

Para interromper os comentários hápticos em um elemento, registre-se para o evento PointerExited no mesmo elemento que você registrou o manipulador PointerEntered que enviou o sinal háptico. Nesse manipulador de eventos encerrado, chame StopFeedback conforme mostrado aqui.

hapticsController.StopFeedback();

Enviar e interromper feedback de interação

O envio de comentários de interação é bastante semelhante ao envio de comentários de escrita à tinta.

Use o método SendHapticFeedback do objeto SimpleHapticsController para passar formas de onda de interação para a caneta do usuário. Esse método dá suporte à passagem de uma forma de onda ou de ambas as formas de onda com um valor de intensidade personalizado (consulte Personalizar feedback tátil).

Chame SendHapticFeedback e passe uma forma de onda de escrita à tinta para configurar a caneta para começar a reproduzir essa forma de onda imediatamente com base em alguma interação em seu aplicativo (em vez de quando a ponta da caneta toca a tela para comentários de escrita à tinta).

Ao usar qualquer uma das formas de onda de interação não contínuas, não é necessário fazer uma chamada StopFeedback correspondente. Você ainda precisa chamar StopFeedback para as formas de onda de interação contínua.

Observação

Enviar uma forma de onda de interação quando uma forma de onda de escrita à tinta estiver sendo reproduzida interromperá temporariamente a forma de onda de escrita à tinta. A forma de onda de tinta será retomada quando a forma de onda de interação parar.

Para recuperar a forma de onda de interação desejada, você deve iterar por meio da coleção SupportedFeedback do SimpleHapticsController, garantindo que ela seja compatível com a caneta ativa.

Se não houver suporte, você pode optar por não reproduzir nada ou voltar para a forma de onda Click , pois é garantido que isso seja suportado.

No exemplo a seguir, tentamos enviar a forma de onda Erro (mas recorremos para Click se não houver suporte para Error).

SimpleHapticsControllerFeedback currentWaveform;  

// Attempt to set the currentWaveform to BrushContinuous.
foreach (var waveform in hapticsController.SupportedFeedback)
{
    if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.Error)
    {
        currentWaveform = waveform;
    }
} 

// If currentWaveform is null, it was not in the SupportedFeedback collection, so instead set 
// the waveform to Click.
if (currentWaveform == null)
{
    foreach (var waveform in hapticsController.SupportedFeedback)
    {
        if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.Click)
        {
            currentWaveform = waveform;
        }
    }
} 

// Send the currentWaveform.
hapticsController.SendHapticFeedback(currentWaveform); 

Personalizar feedback tátil

Há três maneiras de personalizar o feedback tátil. O primeiro é suportado por comentários de Escrita à Tinta e Interação, enquanto o segundo e o terceiro são suportados apenas por comentários de Interação.

  1. Ajuste a intensidade do feedback em relação à configuração de intensidade máxima do sistema. Para fazer isso, você deve primeiro verificar se o SimpleHapticsController dá suporte à configuração da intensidade e, em seguida, chamar SendHapticFeedback com o valor desejado Intensity .

    if (hapticsController.IsIntensitySupported) 
    {
        foreach (var waveform in hapticsController.SupportedFeedback)
        {
            if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.Click)
            {
                double intensity = 0.75;
                hapticsController.SendHapticFeedback(waveform, intensity);
            }
        }
    }
    
  2. Repita o sinal tátil um número especificado de vezes. Para fazer isso, você deve primeiro verificar se o SimpleHapticsController dá suporte à configuração da intensidade e, em seguida, chamar SendHapticFeedbackForPlayCount com o valor de contagem desejado. Você também pode definir a intensidade e o intervalo de pausa de repetição.

    Observação

    Se o SimpleHapticsController não der suporte à configuração da intensidade ou do intervalo de pausa de repetição, os valores fornecidos serão ignorados.

    if (hapticsController.IsPlayCountSupported && hapticsController.IsIntensitySupported && hapticsController.IsReplayPauseIntervalSupported)
    {
        foreach (var waveform in hapticsController.SupportedFeedback)
        {
            if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.Click)
            {
                double intensity = 0.75;
                int playCount = 3;
                System.TimeSpan pauseDuration = new System.TimeSpan(1000000);
                hapticsController.SendHapticFeedbackForPlayCount(currentWaveform, intensity, playCount, pauseDuration);
            }
        }
    }
    
  3. Defina a duração do sinal tátil. Para fazer isso, você deve primeiro verificar se o SimpleHapticsController dá suporte à configuração da duração da reprodução e, em seguida, chamar SendHapticFeedbackForDuration com o valor de intervalo de tempo desejado. Você também pode definir a intensidade.

    Observação

    Se o SimpleHapticsController não der suporte à configuração da intensidade, o valor fornecido será ignorado.

    if (hapticsController.IsPlayDurationSupported && hapticsController.IsIntensitySupported)
    {
        foreach (var waveform in hapticsController.SupportedFeedback)
        {
            if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.RumbleContinuous)
            {
                double intensity = 0.75;
                System.TimeSpan playDuration = new System.TimeSpan(5000000);
                hapticsController.SendHapticFeedbackForDuration(currentWaveform, intensity, playDuration);
            }
        }
    }
    

Exemplos

Consulte o exemplo de háptica da caneta para obter exemplos de trabalho da seguinte funcionalidade: