Compartir a través de


Interacciones de lápiz y comentarios hápticos (táctiles)

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 , se prueba si admite una propiedad simpleHapticsController . Si no es así, simplemente retornamos desde el controlador 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;
}

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:

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 , debe iterar a través de 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 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 SendHapticFeedback del SimpleHapticsController para pasar formas de onda de interacción 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).

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.

  1. 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);
            }
        }
    }
    
  2. 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);
            }
        }
    }
    
  3. 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 Pen para obtener ejemplos prácticos de la funcionalidad siguiente: