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.
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); } } }
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); } } }
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:
- Obter um SimpleHapticsController da entrada da caneta: vá de PointerId para PenDevice para SimpleHapticsController (requer uma caneta com capacidade háptica e um dispositivo que dê suporte à caneta).
- Verifique os recursos hápticos da caneta: um SimpleHapticsController expõe propriedades para recursos de hardware da caneta, incluindo IsIntensitySupported, IsPlayCountSupported, SupportedFeedback e assim por diante.
- Iniciar e parar comentários hápticos: use os métodos SendHapticFeedback e StopFeedback adequadamente.
- Disparar comentários hápticos: comentários para comentários de escrita à tinta e comentários de interação.
Windows developer