Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Windows ha supportato da molto tempo penne digitali che consentono agli utenti di interagire con i propri dispositivi in modo naturale, diretto e di esprimere la propria creatività attraverso esperienze di scrittura e disegno ricche usando l'input penna digitale.
Con Windows 11, viene introdotta una nuova funzionalità che rende l'esperienza della penna digitale ancora più naturale e accattivante: quando si usa una penna che supporta il "feedback aptico", gli utenti possono effettivamente sentire la penna interagire in modo tattile con l'interfaccia utente di un'app.
Annotazioni
Quando si fa riferimento a questa nuova funzionalità, "aptico" viene usato in tutte le API per sviluppatori e nella documentazione correlata, mentre "tattile" è il nome descrittivo presentato agli utenti per impostare le preferenze di feedback in Impostazioni di Windows.
Le esperienze di feedback aptico supportate in Windows 11 includono feedback di scrittura con penna e feedback di interazione:
- Il feedback tattile simula la sensazione di vari tipi di strumenti di scrittura o disegno (come penna, marcatore, matita, evidenziatore e così via) attraverso vibrazioni continue mentre la penna è in contatto con lo schermo. Per impostazione predefinita, la Piattaforma Windows Ink supporta il feedback aptico per tutti gli strumenti di disegno (questo argomento, illustra come fornire una soluzione di inchiostrazione personalizzata oltre a quella supportata da Windows Ink).
- Il feedback di interazione, d'altra parte, è un feedback diretto basato su azioni chiave dell'utente, ad esempio il passaggio del mouse o il clic di un pulsante, la risposta al completamento di un'azione o l'attenzione dell'utente.
In genere, sono necessari cinque passaggi per supportare completamente il feedback aptico:
- Rilevare l'input della penna.
- Determinare se la penna corrente e il dispositivo supportano il feedback aptico e, in tal caso, quali funzionalità di feedback aptico supportano.
- Decidere il segnale di feedback aptico da inviare.
- Invia il feedback aptico.
- Fermare il feedback aptico
Rilevare l'input della penna
Per rilevare e isolare l'input penna, è prima necessario registrarsi all'evento PointerEntered e quindi controllare se PointerDeviceType è una penna.
Il codice seguente illustra come controllare il tipo di dispositivo puntatore all'interno di un evento PointerEntered. Per questo esempio, se l'input non proviene da una penna, viene semplicemente restituito dal gestore eventi. In caso contrario, si controllano le funzionalità della penna e si configura il feedback aptico.
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;
}
...
}
Determinare il supporto per il feedback aptico
Non tutte le penne e i digitalizzatori supportano il feedback aptico e le penne che lo fanno non supportano necessariamente tutte le funzionalità di feedback aptico descritte in questo argomento. Di conseguenza, è importante verificare a livello di codice quali funzionalità sono supportate dalla penna attiva.
In una continuazione dell'esempio precedente viene illustrato come verificare se la penna attiva supporta il feedback aptico.
Per prima cosa si tenta di recuperare un oggetto PenDevicedall'elemento PointerId corrente. Se non è possibile ottenere un PenDevice, semplicemente si esce dal gestore dell'evento.
Se è stato ottenuto un oggetto PenDevice, verifichiamo se supporta una proprietà SimpleHapticsController. In caso contrario, viene semplicemente restituito dal gestore eventi.
// 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;
}
Il SimpleHapticsController recuperato nell'esempio precedente viene utilizzato negli esempi successivi per interrogare le funzionalità aptiche e per inviare o interrompere il feedback aptico.
Annotazioni
Se si creano app con Windows App SDK Preview 1.0, è possibile usare l'interoperabilità PenDevice (PenDeviceInterop.FromPoint(PointerPoint)) per accedere al sistema PenDevice.
private void InputObserver_PointerEntered(PointerInputObserver sender, PointerEventArgs args)
{
var penDevice = PenDeviceInterop.PenDeviceFromPointerPoint(args.CurrentPoint);
}
Le sezioni seguenti descrivono le funzionalità di feedback che le penne aptico devono supportare, nonché quelle facoltative. Un tipo di feedback aptico necessario può in genere essere usato come fallback anziché come funzionalità facoltativa.
Forme d'onda di inchiostrazione
Le forme d'onda di inchiostrazione vengono riprodotte continuamente mentre la penna è in contatto con lo schermo e cercano di simulare l'impressione di vari strumenti di scrittura o disegno.
| Caratteristica / Funzionalità | Description | Obbligatorio/Facoltativo |
|---|---|---|
| Forma d'onda "InkContinous" | Simula la sensazione di scrivere con una penna a sfera fisica. Questa è la modalità di fallback predefinita quando una forma d'onda di inchiostrazione non è supportata da una penna aptica. | Obbligatorio |
| Forma d'onda BrushContinuous | Segnale aptico continuo quando l'utente seleziona il pennello come strumento di inchiostro. | Opzionale |
| ChiselMarkerContinuous forma d'onda | Segnale aptico continuo quando l'utente seleziona il marcatore/evidenziatore di scalpello come strumento di inking. | Opzionale |
| Forma d'onda eraserContinuous | Segnale aptico continuo quando l'utente seleziona la gomma come strumento di inchiostrazione. | Opzionale |
| GalaxyForma d'ondacontinua (La documentazione HID e la guida all'implementazione si riferiscono a questa forma d'onda come SparkleContinuous) |
Segnale aptico continuo per strumenti di inchiostro speciali, ad esempio un pennello multicolore. | Opzionale |
| Forma d'onda continua di marker | Segnale aptico continuo quando l'utente seleziona il pennarello come strumento di inchiostrazione. | Opzionale |
| Forma d'onda PencilContinuous | Segnale aptico continuo quando l'utente seleziona il pencil come strumento di inchiostrazione. | Opzionale |
Forme d'onda di interazione
Le forme d'onda di interazione sono in genere brevi (eccezioni indicate nella tabella seguente), le forme d'onda di feedback dirette generate su richiesta per confermare azioni chiave, ad esempio il passaggio del mouse o il clic su un pulsante, la risposta al completamento di un'azione o per attirare l'attenzione dell'utente.
| Caratteristica / Funzionalità | Description | Obbligatorio/Facoltativo |
|---|---|---|
| Fare clic su forma d'onda | Un breve feedback di clic. Si tratta del fallback predefinito quando una forma d'onda di interazione selezionata dall'app non è supportata da una penna aptica. | Obbligatorio |
| Forma d'onda di errore | Segnale sicuro per avvisare l'utente che un'azione non è riuscita o si è verificato un errore. | Opzionale |
| Forma d'onda al passaggio del mouse | Indica che l'utente ha iniziato a passare il puntatore del mouse su un elemento interattivo dell'interfaccia utente. | Opzionale |
| Premere forma d'onda | Indica quando un utente preme un elemento interattivo dell'interfaccia utente in un'azione incrementale (vedere Release). | Opzionale |
| Forma d'onda di rilascio | Indica quando un utente rilascia un elemento interattivo dell'interfaccia utente in un'azione incrementale (vedere Press). | Opzionale |
| Forma d'onda di successo | Segnale sicuro per avvisare l'utente che un'azione è riuscita. | Opzionale |
| Onda continua Buzz | Sensazione di ronzio continuo. | Opzionale |
| Forma d'onda RumbleContinuous | Sensazione di rombo continuo. | Opzionale |
Personalizzazioni del feedback aptico
Alcune penne aptiche possono supportare le personalizzazioni seguenti.
| Caratteristica / Funzionalità | Description | Obbligatorio/Facoltativo |
|---|---|---|
| Intensità | Imposta l'intensità del segnale aptico. | Opzionale |
| Numero di riproduzioni | Ripete un segnale aptico un numero specificato di volte. | Opzionale |
| Intervallo di pausa della riproduzione | Imposta il tempo tra ogni riproduzione ripetuta del segnale aptico. | Opzionale |
| Durata della riproduzione | Imposta l'intervallo di tempo in cui viene riprodotto un segnale aptico. | Opzionale |
Verificare il supporto delle impostazioni personalizzate
Per verificare il supporto per Intensità, Conteggio Riproduzioni, Intervallo di Pausa per Riproduzione e Durata della Riproduzione, utilizzare le seguenti proprietà di SimpleHapticsController:
Invia e interrompi l'inchiostrazione del feedback aptico
Utilizzare il metodo SendHapticFeedback dell'oggetto SimpleHapticsController per passare forme d'onda dell'inchiostrazione alla penna. Questo metodo supporta il passaggio di una forma d'onda o di entrambe le forme d'onda con un valore di intensità personalizzato (vedere Personalizzare il feedback aptico).
Chiama SendHapticFeedback e passa una forma d'onda di inchiostrazione per configurare la penna affinché inizi a riprodurre tale forma d'onda appena la punta della penna tocca in qualsiasi punto dello schermo. La forma d'onda continuerà a riprodursi finché la penna non viene sollevata o viene chiamato StopFeedback, a seconda di quale condizione si verifichi per prima. È consigliabile eseguire questa operazione nel gestore eventi PointerEntered per l'elemento in cui si desidera attivare il feedback aptico. Ad esempio, un'app con un'implementazione di inchiostrazione personalizzata eseguirà questa operazione nel metodo PointerEntered del relativo canvas di inchiostrazione.
Per recuperare la forma d'onda di inchiostratura desiderata, è necessario scorrere l'insieme SupportedFeedback di SimpleHapticsController, assicurandosi che essa sia supportata dalla penna attiva.
Se non è supportato, puoi scegliere di non riprodurre nulla oppure ripiegare sulla forma d'onda InkContinuous, dato che è garantito che sia supportata.
Nell'esempio seguente si tenta di inviare la forma d'onda BrushContinuous (ma si esegue il fallback a InkContinuous se BrushContinuous non è supportato).
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 anche arrestare il feedback aptico quando il puntatore associato esce dall'elemento registrato per il feedback aptico. In caso contrario, la forma d'onda continuerà a tentare di riprodursi tramite la penna attiva.
Annotazioni
Alcune penne possono interrompere il feedback aptico autonomamente quando la penna lascia il raggio d'azione dello schermo. Tuttavia, non è necessario che tutte le penne eseseguono questa operazione, quindi le applicazioni devono sempre interrompere in modo esplicito il feedback aptico come descritto qui.
Per interrompere il feedback aptico su un elemento, registrarsi per l'evento PointerExited sullo stesso elemento registrato dal gestore PointerEntered che ha inviato il segnale aptico. In tale gestore eventi chiuso chiamare StopFeedback come illustrato di seguito.
hapticsController.StopFeedback();
Inviare e interrompere il feedback di interazione
L'invio di feedback di interazione è molto simile all'invio di feedback per l'inchiostro digitale.
Utilizzare il metodo SendHapticFeedback dell'oggetto SimpleHapticsController per passare le forme d'onda di interazione alla penna dell'utente. Questo metodo supporta il passaggio di una forma d'onda o di entrambe le forme d'onda con un valore di intensità personalizzato (vedere Personalizzare il feedback aptico).
Chiamare SendHapticFeedback e passare una forma d'onda di inchiostrazione per configurare la penna per iniziare a riprodurre immediatamente tale forma d'onda in base a un'interazione nell'app (anziché quando la punta della penna tocca lo schermo per il feedback di inchiostrazione).
Quando si usa una delle forme d'onda di interazione non continue, non è necessario effettuare una chiamata StopFeedback corrispondente. È comunque necessario chiamare StopFeedback per le forme d'onda di interazione continue.
Annotazioni
L'invio di una forma d'onda di interazione quando viene riprodotta una forma d'onda di inchiostrazione interromperà temporaneamente la forma d'onda di inchiostrazione. La forma d'onda dell'inchiostrazione riprenderà quando la forma d'onda dell'interazione si arresta.
Per recuperare la forma d'onda di interazione desiderata, è necessario scorrere l'insieme SupportedFeedback di SimpleHapticsController, assicurando che sia supportato dalla penna attiva.
Se non è supportato, puoi scegliere di non riprodurre nulla oppure utilizzare la forma d'onda Click, in quanto è garantito che sia supportata.
Nell'esempio seguente proviamo a inviare la forma d'onda Errore, ma si effettua un fallback su Click se Errore non è supportato.
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);
Personalizzare il feedback aptico
Esistono tre modi per personalizzare il feedback aptico. Il primo è supportato sia dal feedback di penna che da quello di interazione, mentre il secondo e il terzo sono supportati solo dal feedback di interazione.
Regolare l'intensità del feedback rispetto all'impostazione massima dell'intensità del sistema. A tale scopo, è prima necessario verificare che SimpleHapticsController supporti l'impostazione dell'intensità e quindi chiamare SendHapticFeedback con il valore desiderato
Intensity.if (hapticsController.IsIntensitySupported) { foreach (var waveform in hapticsController.SupportedFeedback) { if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.Click) { double intensity = 0.75; hapticsController.SendHapticFeedback(waveform, intensity); } } }Ripetere il segnale aptico un numero specificato di volte. A tale scopo, è prima necessario verificare che SimpleHapticsController supporti l'impostazione dell'intensità e quindi chiamare SendHapticFeedbackForPlayCount con il valore di conteggio desiderato. È anche possibile impostare sia l'intensità che l'intervallo di pausa di riproduzione.
Annotazioni
Se SimpleHapticsController non supporta l'impostazione dell'intensità o l'intervallo di pausa di riproduzione, i valori specificati verranno ignorati.
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); } } }Impostare la durata del segnale aptico. A tale scopo, è prima necessario verificare che SimpleHapticsController supporti l'impostazione della durata di riproduzione e quindi chiamare SendHapticFeedbackForDuration con il valore dell'intervallo di tempo desiderato. È anche possibile impostare l'intensità.
Annotazioni
Se SimpleHapticsController non supporta l'impostazione dell'intensità, il valore fornito verrà ignorato.
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); } } }
Esempi
Per esempi pratici delle funzionalità seguenti, vedere l'esempio di aptica della penna .
- Ottenere un SimpleHapticsController dall'input della penna: devi passare da PointerId a PenDevice a SimpleHapticsController (richiede sia una penna con supporto aptico che un dispositivo che supporta la penna).
- Controllare le funzionalità aptiche della penna: SimpleHapticsController espone proprietà relative alle capacità hardware della penna, tra cui IsIntensitySupported, IsPlayCountSupported, SupportedFeedback e così via.
- Avviare e arrestare il feedback aptico: usare i metodi SendHapticFeedback e StopFeedback in modo appropriato.
- Attivare il feedback aptico: feedback sia per il feedback di inchiostrazione che per il feedback di interazione.