Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Windows ha apoyado desde hace mucho tiempo los lápices digitales que permiten a los usuarios interactuar con sus dispositivos de forma natural, directa y expresar su creatividad a través de experiencias enriquecidas de escritura y dibujo mediante la entrada de lápiz digital.
Con Windows 11, se presenta una nueva funcionalidad que hace que la experiencia del lápiz digital sea aún más natural y atractiva: cuando se usa un lápiz que admite "comentarios hápticos", los usuarios pueden sentir realmente que el lápiz interactúa de forma táctil con la interfaz de usuario (UI) de una aplicación.
Nota:
Al hacer referencia a esta nueva característica, se usa "háptico" en todas las API de desarrollador y la documentación relacionada, mientras que "táctil" es el nombre amigable que se presenta a los usuarios para establecer preferencias de comentarios en Configuración de Windows.
Las experiencias de comentarios hápticos que se admiten en Windows 11 incluyen comentarios de entrada manuscrita y comentarios de interacción :
- La retroalimentación de escritura a mano simula la sensación de varios tipos de herramientas de escritura o dibujo (como pluma, rotulador, lápiz, resaltador, etc.) mediante vibraciones continuas mientras el lápiz está en contacto con la pantalla. De forma predeterminada, la plataforma de Windows Ink admite retroalimentación háptica para todas las herramientas de dibujo. Este tema explica cómo proporcionar una solución de entrada manuscrita personalizada que vaya más allá de lo que Windows Ink admite.
- Los comentarios de interacción, por otro lado, son comentarios directos basados en acciones clave del usuario, como mantener el puntero sobre o hacer clic en un botón, responder a la finalización de una acción o para llamar la atención del usuario.
Normalmente, se requieren cinco pasos para admitir completamente los comentarios hápticos:
- Detecte la entrada del lápiz.
- Determine si el lápiz actual y el dispositivo admiten comentarios hápticos y, si es así, qué características de comentarios hápticos admite.
- Decida qué señal de retroalimentación háptica enviar.
- Envíe los comentarios hápticos.
- Detener los comentarios hápticos
Detección de la entrada del lápiz
Para detectar y aislar la entrada del lápiz, primero debe registrarse en el evento PointerEntered y, a continuación, comprobar si el tipo de dispositivo de puntero es un lápiz .
El código siguiente muestra cómo comprobar el tipo de dispositivo de puntero dentro de un evento PointerEntered. En este ejemplo, si la entrada no procede de un lápiz, simplemente se devuelve desde el controlador de eventos. De lo contrario, comprobamos las funcionalidades del lápiz y configuramos los comentarios hápticos.
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 la compatibilidad con comentarios hápticos
No todos los lápices y digitalizadores admiten retroalimentación háptica, y los lápices que sí lo hacen no necesariamente admiten todas las características de retroalimentación háptica descritas en este tema. Por lo tanto, es importante confirmar mediante programación qué características son compatibles con el lápiz activo.
En una continuación del ejemplo anterior, se muestra cómo comprobar si el lápiz activo admite comentarios hápticos.
Primero intentamos recuperar un objeto PenDevice del PointerId actual. Si no se puede obtener un PenDevice, simplemente salimos del controlador de eventos.
Si se obtuvo un PenDevice
// 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;
}
SimpleHapticsController recuperado en el ejemplo anterior se usa en ejemplos posteriores para consultar funcionalidades hápticas y enviar o detener comentarios hápticos.
Nota:
Si va a compilar aplicaciones con la Windows App SDK Preview 1.0, puede usar de interoperabilidad PenDevice (PenDeviceInterop.FromPointerPoint(PointerPoint)) para acceder al sistema PenDevice.
private void InputObserver_PointerEntered(PointerInputObserver sender, PointerEventArgs args)
{
var penDevice = PenDeviceInterop.PenDeviceFromPointerPoint(args.CurrentPoint);
}
En las secciones siguientes se describen las características de comentarios que deben admitir los lápices hápticos, así como las que son opcionales. Un tipo de comentario háptico requerido normalmente se puede usar como alternativa en lugar de una característica opcional.
Formas de onda de digitalización de trazo
Las formas de onda de tinta se reproducen continuamente mientras el lápiz está en contacto con la pantalla e intentan emular la sensación de diferentes herramientas de escritura o dibujo.
Característica | Descripción | Obligatorio/Opcional |
---|---|---|
Forma de onda InkContinous | Simula la sensación de escribir con un bolígrafo físico. Esta es la opción predeterminada cuando una forma de onda de inking no es compatible con una pluma háptica. | Obligatorio |
Forma de onda "BrushContinuous" | Señal háptica continua cuando el usuario selecciona pincel como herramienta de dibujo. | Opcional |
Forma de onda continua de marcador de cincel | Señal háptica continua cuando el usuario selecciona marcador o resaltador de chisel como herramienta de entrada manuscrita. | Opcional |
Forma de onda EraserContinuous | Señal háptica continua cuando el usuario selecciona la goma de borrar como herramienta de dibujo. | Opcional |
Forma de onda GalaxyContinuous (la guía de documentación e implementación de HID se refiere a esta forma de onda como SparkleContinuous) |
Señal háptica continua para herramientas especiales de lápiz, como un pincel multicolor. | Opcional |
Forma de onda continua del marcador | Señal háptica continua cuando el usuario selecciona el marcador como herramienta de dibujo. | Opcional |
Forma de onda continua de lápiz | Señal háptica continua cuando el usuario selecciona lápiz como herramienta de entintado. | Opcional |
Formas de onda de interacción
Las formas de onda de interacción suelen ser cortas (excepciones indicadas en la tabla siguiente), formas de onda de retroalimentación directas generadas bajo demanda para confirmar acciones clave, como posar el cursor sobre o hacer clic en un botón, responder a la finalización de una acción o llamar la atención del usuario.
Característica | Descripción | Obligatorio/Opcional |
---|---|---|
Clic en la forma de onda | Una breve retroalimentación de "clic". Esta es la opción predeterminada cuando una forma de onda de interacción seleccionada por la aplicación no es compatible con un lápiz háptico. | Obligatorio |
Forma de onda de error | Una señal segura para avisar al usuario de que se ha producido un error en una acción o que se ha producido un error. | Opcional |
Forma de onda flotante | Indica que el usuario ha empezado a mantener el puntero sobre un elemento interactivo de la interfaz de usuario. | Opcional |
Pulse el botón de forma de onda | Indica cuándo un usuario presiona un elemento interactivo de la interfaz de usuario en una acción incremental (consulte Release). | Opcional |
Forma de onda de salida | Indica cuándo un usuario libera un elemento interactivo de la interfaz de usuario en una acción incremental (vea Presionar). | Opcional |
Forma de onda de éxito | Señal fuerte para alertar al usuario de que una acción se realizó correctamente. | Opcional |
Forma de onda BuzzContinuous | Sensación de zumbido continuo. | Opcional |
Forma de onda continua Rumble | Sensación continua de retumbos. | Opcional |
Personalizaciones de comentarios hápticos
Algunos lápices hápticos pueden admitir las siguientes personalizaciones.
Característica | Descripción | Obligatorio/Opcional |
---|---|---|
Intensidad | Establece la intensidad de la señal háptica. | Opcional |
Recuento de reproducción | Repite una señal háptica un número especificado de veces. | Opcional |
Intervalo de pausa de reproducción | Establece el tiempo entre cada reproducción repetida de la señal háptica. | Opcional |
Duración de la reproducción | Establece el intervalo de tiempo que se reproduce una señal háptica. | Opcional |
Comprobación de la compatibilidad con la configuración personalizada
Para comprobar la compatibilidad con Intensidad, Recuento de reproducción, Intervalo de pausa de reproducción y Duración de reproducción, use las siguientes propiedades de la SimpleHapticsController:
- EsIntensidadSoportada
- isPlayCountSupported
- EsDuraciónDeReproducciónSoportada
- IsReplayPauseIntervalSupported
Enviar y detener la retroalimentación háptica al escribir con tinta.
Usa el método SendHapticFeedback del objeto SimpleHapticsController para pasar las formas de onda de inking al lápiz del usuario. Este método permite utilizar una forma de onda, o una forma de onda con un valor de intensidad personalizado (consulte Personalizar comentarios hápticos).
Llame a SendHapticFeedback y pase un forma de onda de entintado para configurar el lápiz para que empiece a ejecutar esa forma de onda tan pronto como la punta del lápiz toque cualquier parte de la pantalla. La forma de onda continuará reproduciéndose hasta que se levante el lápiz o se llame a StopFeedback, lo que suceda primero. Se recomienda hacerlo en el PointerEntered manejador de eventos para el elemento en el que desea que se reproduzca el háptico. Por ejemplo, una aplicación con una implementación de tinta personalizada debería hacerlo en el método PointerEntered de su lienzo de tinta.
Para recuperar la forma de onda de tinta deseada
Si no se admite, puede optar por no reproducir nada en absoluto o revertir a la InkContinuous forma de onda, porque está garantizado que es compatible.
En el ejemplo siguiente, intentamos enviar el brushContinuous forma de onda (pero retrocede a InkContinuous si no se admite BrushContinuous).
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);
Es importante que también detenga la retroalimentación háptica cuando el puntero asociado salga del elemento para el que registró la retroalimentación háptica. De lo contrario, la forma de onda seguirá intentando reproducirse en el lápiz activo.
Nota:
Algunos lápices pueden detener opcionalmente los hápticos por sí mismos cuando el lápiz deja el rango de la pantalla. Sin embargo, no es necesario que todos los lápices lo hagan, por lo que las aplicaciones siempre deben detener explícitamente la retroalimentación háptica como se describe aquí.
Para detener los comentarios hápticos en un elemento, regístrese para el evento PointerExited en el mismo elemento que registró el controlador PointerEntered que envió la señal háptica. En ese controlador de eventos, ejecute StopFeedback como se muestra aquí.
hapticsController.StopFeedback();
Enviar y detener el feedback de interacción
Enviar comentarios de interacción es bastante similar al envío de comentarios de entrada manuscrita.
Use el método
Llama a SendHapticFeedback y pasa una forma de onda de escritura para configurar el lápiz y empezar a reproducir esa forma de onda inmediatamente según alguna interacción dentro de la aplicación (en lugar de cuando la punta del lápiz toca la pantalla para la retroalimentación de escritura).
Cuando se usa cualquiera de las formas de onda de interacción no continuas, no es necesario realizar una llamada StopFeedback correspondiente. Todavía tiene que llamar a StopFeedback para las formas de onda de interacción continuas.
Nota:
El envío de una forma de onda de interacción mientras se reproduce una forma de onda de entintado interrumpirá temporalmente la forma de onda de entintado. La forma de onda de tinta se reanudará cuando se detenga la forma de onda de interacción.
Para recuperar la forma de onda de interacción deseada, debe recorrer la colección SupportedFeedback de la SimpleHapticsController, asegurándose de que sea compatible con el lápiz activo.
Si no se admite, puede optar por no reproducir nada en absoluto o regresar a la forma de onda click, ya que se garantiza su compatibilidad.
En el ejemplo siguiente, intentamos enviar la forma de onda de error Error (pero regresamos a Click si Error no es compatible).
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);
Personalización de comentarios hápticos
Hay tres maneras de personalizar los comentarios hápticos. La primera es compatible con los comentarios manuscritos e interacción, mientras que la segunda y la tercera solo son compatibles con los comentarios de interacción.
Ajuste la intensidad de la retroalimentación en relación con la configuración máxima de intensidad del sistema. Para ello, primero debe comprobar que SimpleHapticsController admite la configuración de la intensidad y, a continuación, llamar a SendHapticFeedback con el valor deseado
Intensity
.if (hapticsController.IsIntensitySupported) { foreach (var waveform in hapticsController.SupportedFeedback) { if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.Click) { double intensity = 0.75; hapticsController.SendHapticFeedback(waveform, intensity); } } }
Repita la señal háptica un número especificado de veces. Para ello, primero debe comprobar que SimpleHapticsController admite la configuración de la intensidad y, a continuación, llamar a SendHapticFeedbackForPlayCount con el valor de recuento deseado. También puede establecer la intensidad y el intervalo de pausa de reproducción.
Nota:
Si SimpleHapticsController no admite establecer la intensidad o el intervalo de pausa de reproducción, se omitirán los valores proporcionados.
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); } } }
Establezca la duración de la señal háptica. Para ello, primero debe comprobar que SimpleHapticsController admite la configuración de la duración de la reproducción y, a continuación, llamar a SendHapticFeedbackForDuration con el valor de intervalo de tiempo deseado. También puede establecer la intensidad.
Nota:
Si SimpleHapticsController no admite establecer la intensidad, se omitirá el valor proporcionado.
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); } } }
Ejemplos
Consulte el ejemplo de
- Obtenga un SimpleHapticsController de la entrada del lápiz: vaya de PointerId a PenDevice a SimpleHapticsController (requiere un lápiz compatible con háptico y un dispositivo que admita el lápiz).
- Comprobar las capacidades hápticas del lápiz: un SimpleHapticsController expone propiedades para las capacidades de hardware del lápiz, incluidas IsIntensitySupported, IsPlayCountSupported, SupportedFeedback, etc.
- Iniciar y detener la retroalimentación háptica: use los métodos SendHapticFeedback y StopFeedback adecuadamente.
- Desencadenar retroalimentación háptica: retroalimentación de escritura y retroalimentación de interacción .