Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O Windows suporta há muito tempo canetas digitais que permitem aos utilizadores interagir com os seus dispositivos de forma natural e direta, expressando a sua criatividade através de experiências ricas de escrita e desenho usando tinta digital.
Com o Windows 11, está a ser introduzida uma nova funcionalidade que torna a experiência da caneta digital ainda mais natural e apelativa: ao usar uma caneta que suporta "feedback háptico", os utilizadores podem realmente sentir a sua caneta a interagir de forma tátil com a interface de utilizador (UI) de uma aplicação.
Observação
Ao referir-se a esta nova funcionalidade, "háptico" é usado em todas as APIs de desenvolvimento e documentação relacionada, enquanto "tátil" é o nome amigável apresentado aos utilizadores para definir preferências de feedback nas Definições do Windows.
Experiências de feedback háptico apoiadas no Windows 11 incluem feedback de tinta e feedback de interação:
- O feedback de tinta simula a sensação de vários tipos de ferramentas de escrita ou desenho (como caneta, marcador, lápis, realçador, etc.) através de vibrações contínuas enquanto a caneta está em contacto com o ecrã. Por padrão, a Windows Ink Platform suporta feedback háptico para todas as ferramentas de desenho. Este tópico aborda como fornecer uma solução de entintagem personalizada além daquela suportada pelo Windows Ink.
- O feedback de interação, por outro lado, é feedback direto baseado em ações-chave do utilizador, como passar o rato ou clicar num botão, responder à conclusão de uma ação ou chamar a atenção do utilizador.
Normalmente, são necessários cinco passos para apoiar totalmente o feedback háptico:
- Detetar entrada de caneta.
- Determine se a caneta e o dispositivo atuais suportam feedback háptico e, em caso afirmativo, que funcionalidades de feedback háptico suportam.
- Decida qual o sinal de feedback háptico a enviar.
- Envia o feedback háptico.
- Pare o feedback háptico
Detetar entrada da caneta stylus
Para detetar e isolar a entrada da caneta, deve primeiro registar o evento PointerEntered e depois verificar se o PointerDeviceType é uma caneta.
O código seguinte mostra como verificar o tipo de dispositivo ponteiro dentro de um evento PointerEntred. Neste exemplo, se a entrada não for de uma caneta, simplesmente retornamos do gestor de eventos. Caso contrário, verificamos as capacidades da caneta e configuramos o feedback háptico.
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 háptico
Nem todas as canetas e digitalizadores suportam feedback háptico, e as canetas que suportam não suportam necessariamente todas as funcionalidades de feedback háptico descritas neste tópico. Por isso, é importante confirmar programaticamente quais as funcionalidades suportadas pela caneta ativa.
Numa continuação do exemplo anterior, mostramos como verificar se a caneta ativa suporta feedback háptico.
Primeiro tentamos recuperar um objeto PenDevice do PointerID atual. Se um PenDevice não puder ser obtido, simplesmente retornamos do gestor de eventos.
Se um PenDevice foi obtido, testamos se suporta uma propriedade SimpleHapticsController . Se não, voltamos simplesmente 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 capacidades hápticas e enviar/parar feedback háptico.
Observação
Se estiver a criar aplicações com a Windows App SDK, pode usar PenDevice interop (PenDeviceInterop.FromPointerPoint(PointerPoint)) para aceder ao sistema PenDevice.
private void InputObserver_PointerEntered(PointerInputObserver sender, PointerEventArgs args)
{
var penDevice = PenDeviceInterop.PenDeviceFromPointerPoint(args.CurrentPoint);
}
As secções seguintes descrevem as funcionalidades de feedback que as canetas hápticas devem suportar, bem como aquelas que são opcionais. Um tipo de realimentação háptica obrigatória pode normalmente ser usado como recurso alternativo, em vez de uma funcionalidade opcional.
Formas de onda de entintamento
As formas de onda de entintagem reproduzem-se continuamente enquanto a caneta está em contacto com o ecrã e tentam simular a sensação de várias ferramentas de escrita ou desenho.
| Característica | Descrição | Obrigatório / Opcional |
|---|---|---|
| Forma de onda contínua de tinta | Simula a sensação de escrever com uma caneta esferográfica. Esta é a opção padrão quando uma forma de onda para escrita não é suportada por uma caneta háptica. | Obrigatório |
| Forma de onda BrushContinuous | Sinal háptico contínuo quando o utilizador seleciona pincel como ferramenta de tinta. | Opcional |
| ChiselMarkerForma de onda contínua | Sinal háptico contínuo quando o utilizador seleciona marcador ou marcador em cinzel como ferramenta de desenho. | Opcional |
| EraserForma de onda contínua | Sinal contínuo háptico quando o utilizador seleciona a borracha como ferramenta de desenho. | Opcional |
| Forma de onda galáxia contínua (a documentação e guia de implementação do HID referem-se a esta forma de onda como SparkleContinuous) |
Sinal háptico contínuo para ferramentas especiais de tinta, como um pincel multicolorido. | Opcional |
| Marcador Forma de onda contínua | Sinal háptico contínuo quando o utilizador seleciona o marcador como ferramenta de tinta. | Opcional |
| Forma de onda contínua PencilContinuous | Sinal háptico contínuo quando o utilizador seleciona lápis como ferramenta de tinta. | Opcional |
Formas de onda de interação
As formas de onda de interação são tipicamente curtas (exceções referidas na tabela seguinte), sendo formas de onda de feedback direto geradas sob demanda para confirmar ações-chave, como pairar o cursor ou clicar num botão, fornecer feedback na conclusão de uma ação, ou para chamar a atenção do utilizador.
| Característica | Descrição | Obrigatório / Opcional |
|---|---|---|
| Forma de onda do clique | Um breve sinal de "clique". Este é o recurso padrão quando uma forma de onda de interação selecionada pela aplicação não é suportada por uma caneta háptica. | Obrigatório |
| Forma de onda de erro | Um sinal forte para alertar o utilizador de que uma ação falhou ou que ocorreu um erro. | Opcional |
| Forma de onda de sobrevoo | Indica que o utilizador começou a passar o rato por cima de um elemento interativo da interface. | Opcional |
| Forma de onda de pressão | Indica quando um utilizador pressiona um elemento interativo da interface numa ação incremental (ver Release). | Opcional |
| Forma de onda de lançamento | Indica quando um utilizador liberta um elemento interativo da interface numa ação incremental (ver Pression). | Opcional |
| Forma de onda de êxito | Sinal forte para alertar o utilizador de que uma ação teve sucesso. | Opcional |
| BuzzForma de onda contínua | Sensação contínua de zumbido. | Opcional |
| RumbleForma de onda contínua | Sensação contínua de vibração. | Opcional |
Personalizações com feedback háptico
Algumas canetas hápticas podem suportar as seguintes personalizações.
| Característica | Descrição | Obrigatório / Opcional |
|---|---|---|
| Intensidade | Define a intensidade do sinal háptico. | Opcional |
| Contagem de Reproduções | Repete um sinal háptico um número especificado de vezes. | Opcional |
| Intervalo de pausa na repetição | Define o intervalo de tempo entre cada repetição do sinal háptico. | Opcional |
| Duração do Jogo | Define o intervalo de tempo em que um sinal háptico é ativado. | Opcional |
Verifique se há suporte para definições personalizadas
Para verificar o suporte para Intensidade, Contagem de Reprodução, Intervalo de Pausa de Replay e Duração da Reprodução, use as seguintes propriedades do SimpleHapticsController:
Enviar e parar o desenho com feedback háptico
Use o método SendHapticFeedback do objeto SimpleHapticsController para passar as formas de onda de entintação para a caneta do utilizador. Este método suporta a passagem de uma forma de onda ou de uma forma de onda com um valor de intensidade personalizado (ver Personalizar feedback háptico).
Ligue para o SendHapticFeedback e passe uma forma de onda de tinta para configurar a caneta para começar a reproduzir essa forma assim que a ponta da caneta tocar em qualquer parte do ecrã. A forma de onda continuará a tocar até a caneta ser levantada ou até ser chamada StopFeedback , o que acontecer primeiro. Recomendamos fazer isto no manipulador de eventos PointerEntered para o elemento onde pretendes que os hápticos sejam ativados. Por exemplo, um app com uma implementação personalizada de inking realizaria essa ação no método PointerEntered na sua tela de inking.
Para recuperar a forma de onda de entintagem desejada, deve iterar através da coleção SupportedFeedback do SimpleHapticsController, garantindo que é suportada pela caneta ativa.
Se não for suportado, podes optar por não tocar nada ou recorrer à forma de onda InkContinuous, pois é garantido que será suportada.
No exemplo seguinte, tentamos enviar a forma de onda BrushContinuous (mas recorremos ao InkContinuous se o BrushContinuous não for suportado).
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 também que pare o feedback háptico quando o ponteiro associado sai do elemento que registou para o feedback háptico. Caso contrário, a forma de onda continuará a tentar tocar na caneta ativa.
Observação
Algumas canetas podem, opcionalmente, interromper automaticamente a função háptica quando a caneta sai do alcance de deteção do ecrã. No entanto, não é obrigatório que todas as canetas façam isto, pelo que as aplicações devem sempre parar explicitamente o feedback háptico, conforme descrito aqui.
Para parar o feedback háptico num elemento, regista o evento PointerExited no mesmo elemento onde registaste o handler PointerEntered que enviou o sinal háptico. No manipulador de eventos de saída, chame StopFeedback como mostrado aqui.
hapticsController.StopFeedback();
Feedback de interação para enviar e parar
Enviar feedback de interação é bastante semelhante a enviar feedback de escrita digital.
Use o método SendHapticFeedback do objeto SimpleHapticsController para passar formas de onda de interação para a caneta do utilizador. Este método suporta a passagem de uma forma de onda ou de uma forma de onda com um valor de intensidade personalizado (ver Personalizar feedback háptico).
Chama o SendHapticFeedback e passa um parâmetro de onda de entintagem para configurar a caneta para começar a reproduzir a forma de onda imediatamente com base numa interação dentro da aplicação (em vez de quando a ponta da caneta toca no ecrã para feedback de entintagem).
Ao utilizar qualquer uma das formas de onda de Interação não contínuas, não é necessário fazer uma chamada StopFeedback correspondente. Ainda tens de invocar StopFeedback para as formas de onda contínuas de Interação.
Observação
Enviar uma forma de onda de interação quando uma forma de onda de inking está a ser reproduzida interrompe temporariamente a forma de onda de inking. A forma de onda de entintagem retoma quando a forma de onda de interação terminar.
Para recuperar a forma de onda de interação desejada, deve iterar através da coleção SupportedFeedback do SimpleHapticsController, garantindo que é suportada pela caneta ativa.
Se não for suportado, pode optar por não tocar nada ou recorrer à forma de onda Click, pois é garantido que essa será suportada.
No exemplo seguinte, tentamos enviar a forma de onda Erro (mas recorremos ao Click se o Erro não for suportado).
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 resposta háptica
Existem três formas de personalizar o feedback háptico. A primeira tem suporte tanto de feedback de Inking quanto de Interação, enquanto a segunda e a terceira têm apenas suporte de feedback de Interação.
Ajuste a intensidade do feedback em relação à definição máxima de intensidade do sistema. Para isso, deve primeiro verificar se o SimpleHapticsController suporta definir a intensidade e depois chamar o 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); } } }Repete o sinal háptico um número especificado de vezes. Para isso, deve primeiro verificar se o SimpleHapticsController suporta definir a intensidade e depois chamar o SendHapticFeedbackForPlayCount com o valor desejado de contagem. Também podes definir tanto a intensidade como o intervalo de pausa de repetição.
Observação
Se o SimpleHapticsController não suportar definir a intensidade ou o intervalo de pausa de reproduçã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 háptico. Para isso, deve primeiro verificar se o SimpleHapticsController suporta definir a duração da reprodução e depois chamar o SendHapticFeedbackForDuration com o valor desejado do intervalo de tempo. Também podes definir a intensidade.
Observação
Se o SimpleHapticsController não suportar definir a 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 exemplos práticos da seguinte funcionalidade:
- Obtenha um SimpleHapticsController através da entrada da caneta: Passe do PointerId para o PenDevice e depois para o SimpleHapticsController (requer tanto uma caneta com capacidade háptica como um dispositivo que suporte a caneta).
- Verifique as capacidades hápticas da caneta: Um SimpleHapticsController expõe propriedades das capacidades do hardware da caneta, incluindo IsIntensitySupported, IsPlayCountSupported, SupportedFeedback, entre outros.
- Feedback háptico Start e Stop: Use os métodos SendHapticFeedback e StopFeedback de forma adequada.
- Feedback háptico de desencadeio: Feedback tanto para feedback de entintagem como para feedback de interação.