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 configurar 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 digital simula la sensación de varios tipos de herramientas de escritura o dibujo (como bolígrafo, marcador, 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 comentarios hápticos para todas las herramientas de dibujo (en este tema se explica cómo proporcionar una solución de entrada manuscrita personalizada más allá de la compatible con Windows Ink).
  • 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 la señal de retroalimentación háptica que se 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 para el evento PointerEntered y, a continuación, comprobar si PointerDeviceType 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 feedback háptico, y los lápices que sí lo hacen no necesariamente admiten todas las características de feedback háptico 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 desde el pointerId actual. Si no se puede obtener un PenDevice, simplemente devolvemos desde el controlador de eventos.

Si se obtuvo un PenDevice , se comprueba si admite una propiedad SimpleHapticsController . Si no es así, simplemente volvemos a regresar del 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 está desarrollando aplicaciones con el Windows App SDK Preview 1.0, puede usar la interoperabilidad de PenDevice (PenDeviceInterop.FromPointerPoint(PointerPoint)) para acceder al PenDevice del sistema.

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. Normalmente, un tipo de retroalimentación háptica necesaria se puede usar como alternativa en lugar de una característica opcional.

Formas de onda de digitalización de trazos

Las formas de onda de tinta se reproducen continuamente mientras el lápiz está en contacto con la pantalla, con el fin de simular la sensación de diferentes herramientas de escritura o dibujo.

Característica Description 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 un lápiz háptico. Obligatorio
Forma de onda BrushContinuous Señal háptica continua cuando el usuario selecciona pincel como herramienta de entintado. Opcional
Forma de onda de ChiselMarkerContinuous Señal háptica continua cuando el usuario selecciona marcador o resaltador de chisel como herramienta de entintado. Opcional
Forma de onda EraserContinuous Señal háptica continua cuando el usuario selecciona la goma de borrar como herramienta de escritura. Opcional
Forma de onda GalaxyContinuous
(la guía de implementación y documentación de HID hace referencia 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 de marcador Señal háptica continua cuando el usuario selecciona el marcador como herramienta de tinta digital. Opcional
Forma de onda PencilContinuous Señal háptica continua cuando el usuario selecciona lápiz como herramienta de tinta. 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 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.

Característica Description Obligatorio/Opcional
Onda de clic Una breve respuesta de "clic". Esta es la alternativa 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
Presione 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 liberación 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 RumbleContinuous Sensación continua de temblor. Opcional

Personalizaciones de comentarios hápticos

Algunos lápices hápticos pueden admitir las siguientes personalizaciones.

Característica Description 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, número de reproducciones, intervalo de pausa de reproducción y duración de reproducción, use las siguientes propiedades de SimpleHapticsController:

Enviar y desactivar la retroalimentación háptica de tinta digital

Utilice el método SendHapticFeedback del objeto SimpleHapticsController para enviar las formas de onda de inking al lápiz del usuario. Este método admite pasar una forma de onda o también una forma de onda con un valor de intensidad personalizado (consulte Personalizar comentarios hápticos).

Invoca SendHapticFeedback y pasa una forma de onda de entintado para configurar el lápiz para comenzar a reproducir esa forma de onda tan pronto como la punta del lápiz toque en cualquier parte de la pantalla. La forma de onda continuará reproduciéndose hasta que se levante el lápiz o se llame StopFeedback, lo que ocurra primero. Recomendamos hacerlo en el controlador de eventos PointerEntered para el elemento en el que desea que se activen hápticos. Por ejemplo, una aplicación con una implementación de entintado personalizada llevaría a cabo esto en el método PointerEntered de su lienzo de entintado.

Para recuperar la forma de onda de tinta deseada, debe recorrer la colección SupportedFeedback de SimpleHapticsController, asegurándose de que sea compatible con el lápiz activo.

Si no se admite, puede elegir no reproducir nada en absoluto o volver a la forma de onda InkContinuous, ya que se garantiza que está admitida.

En el ejemplo siguiente, intentamos enviar la forma de onda BrushContinuous (pero volvemos 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 se detenga la retroalimentación háptica cuando el puntero asociado salga del elemento que registró para dicha retroalimentación. 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í solo cuando el lápiz sale del rango de la pantalla. Sin embargo, no es necesario que todos los lápices ópticos 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 cerrado, llame a StopFeedback como se muestra aquí.

hapticsController.StopFeedback();

Enviar y detener retroalimentación de interacción

Enviar comentarios de interacción es bastante similar al envío de comentarios de entintado.

Utilice el método SendHapticFeedback del objeto SimpleHapticsController para pasar formas de onda de interacción al lápiz del usuario. Este método permite pasar 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 entrada digital para configurar el lápiz a fin de que comience a reproducir esa forma de onda de inmediato en respuesta a alguna interacción dentro de tu aplicación (en lugar de cuando la punta del lápiz toca la pantalla para la retroalimentación háptica de la entrada digital).

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 cuando se está reproduciendo una forma de onda de tinta digital interrumpirá temporalmente la forma de onda de tinta digital. La forma de onda de tinta se reanudará cuando se detenga la forma de onda interactiva.

Para recuperar la forma de onda de interacción deseada, debe recorrer la colección SupportedFeedback de SimpleHapticsController, asegurándose de su compatibilidad con el lápiz activo.

Si no se admite, puede optar por no reproducir nada en absoluto o volver a utilizar la forma de onda Click, ya que está garantizado que es compatible.

En el ejemplo siguiente, intentamos enviar la forma de onda Error (pero cambiamos 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 tanto la tinta digital como los comentarios de 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);
            }
        }
    }
    

Examples

Consulte el ejemplo de hápticos del lápiz para ver ejemplos prácticos de la siguiente funcionalidad: