Delen via


Peninteracties en haptische (tactiele) feedback

Windows heeft lange tijd digitale pennen ondersteund waarmee gebruikers hun apparaten op natuurlijke, directe wijze kunnen gebruiken en hun creativiteit kunnen uitdrukken door middel van rijke schrijf- en tekenervaringen met behulp van digitale inkt.

Met Windows 11 wordt een nieuwe mogelijkheid geïntroduceerd die de digitale penervaring nog natuurlijker en aantrekkelijker maakt: Wanneer gebruikers een pen gebruiken die 'haptische feedback' ondersteunt, kunnen gebruikers hun pen op een tactile manier voelen communiceren met de gebruikersinterface (UI) van een app.

Opmerking

Wanneer u naar deze nieuwe functie verwijst, wordt 'haptisch' gebruikt in de ontwikkelaars-API's en de bijbehorende documentatie, terwijl 'tactiele' de beschrijvende naam is die aan gebruikers wordt gepresenteerd voor het instellen van voorkeuren voor feedback in de Windows-instellingen.

Haptische feedback ervaringen die worden ondersteund in Windows 11 omvatten inking feedback en interaction feedback:

  • Inktfeedback simuleert het gevoel van verschillende typen schrijf- of tekenhulpmiddelen (zoals pen, markering, potlood, markeerstift, enzovoort) door doorlopende trillingen terwijl de pen in contact is met het scherm. Het Windows Ink Platform biedt standaard ondersteuning voor haptische feedback voor alle hulpmiddelen voor tekenen (in dit onderwerp wordt beschreven hoe u een aangepaste inktoplossing kunt bieden buiten de oplossing die wordt ondersteund door Windows Inkt).
  • Interactiefeedback is daarentegen directe feedback op basis van belangrijke gebruikersacties, zoals het hoveren of klikken op een knop, het reageren op de voltooiing van een actie, of om de aandacht van de gebruiker te trekken.

Normaal gesproken zijn vijf stappen vereist om haptische feedback volledig te ondersteunen:

  • Peninvoer detecteren.
  • Bepaal of de huidige pen en het huidige apparaat haptische feedback ondersteunen en welke haptische feedbackfuncties het ondersteunt.
  • Beslis over het haptische feedbacksignaal dat moet worden verzonden.
  • Stuur de haptische feedback.
  • De haptische feedback stoppen

Peninvoer detecteren

Als u peninvoer wilt detecteren en isoleren, moet u zich eerst registreren voor de gebeurtenis PointerEntered en vervolgens controleren of het PointerDeviceType een pen is.

De volgende code laat zien hoe u het apparaattype van de aanwijzer controleert binnen een pointerEntered-gebeurtenis. In dit voorbeeld, als de invoer niet van een pen komt, keren we gewoon terug vanuit de eventhandler. Anders controleren we de penmogelijkheden en configureren we de haptische feedback.


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;
    }
    
    ...    
}

Ondersteuning voor haptische feedback bepalen

Niet alle pennen en digitale pennen ondersteunen haptische feedback, en de pennen die dat wel doen, ondersteunen niet noodzakelijkerwijs alle haptische feedbackfuncties die in dit onderwerp worden beschreven. Daarom is het belangrijk om programmatisch te bevestigen welke functies worden ondersteund door de actieve pen.

In een vervolg van het voorgaande voorbeeld laten we zien hoe we kunnen controleren of de actieve pen haptische feedback ondersteunt.

We proberen eerst een PenDevice-object op te halen uit de huidige PointerId. Als een PenDevice niet kan worden verkregen, keren we gewoon terug uit de gebeurtenis-handler.

Als er een PenDevice is verkregen, testen we of deze de eigenschap SimpleHapticsController ondersteunt. Als dat niet het geval is, keren we terug van de event-handler.

// 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;
}

De SimpleHapticsController die in het vorige voorbeeld is opgehaald, wordt gebruikt in volgende voorbeelden om haptische mogelijkheden op te vragen en haptische feedback te verzenden/stoppen.

Opmerking

Als u apps bouwt met de Windows App SDK, u kunt PenDevice interop (PenDeviceInterop.FromPointerPoint(PointerPoint)) gebruiken voor toegang tot het systeem PenDevice.

private void InputObserver_PointerEntered(PointerInputObserver sender, PointerEventArgs args)
{
    var penDevice = PenDeviceInterop.PenDeviceFromPointerPoint(args.CurrentPoint);
}

In de volgende secties worden de feedbackfuncties beschreven die haptische pennen moeten ondersteunen, evenals de functies die optioneel zijn. Een vereist haptisch feedbacktype kan doorgaans worden gebruikt als een terugval in plaats van een optionele functie.

Inktgolfvormen

Inktgolfvormen spelen continu af terwijl de pen in contact is met het scherm en probeer het gevoel van verschillende schrijf- of tekenhulpmiddelen te simuleren.

Eigenschap Beschrijving Vereist/optioneel
InkContinous-golfvorm Simuleert het gevoel van inkt met een fysieke balpen. Dit is de standaardvalval wanneer een inktgolfvorm niet wordt ondersteund door een haptische pen. Verplicht
BrushContinuous-golfvorm Continu haptisch signaal wanneer de gebruiker penseel selecteert als inkthulpmiddel. Optioneel
ChiselMarkerContinuous-golfvorm Continu haptisch signaal wanneer de gebruiker chiselmarkering/markeerstift selecteert als inkthulpmiddel. Optioneel
Gum doorlopende golfvorm Doorlopend haptisch signaal wanneer de gebruiker de gum selecteert als inkttool. Optioneel
GalaxyContinuous-golfvorm
(de HID-documentatie en implementatiehandleiding verwijst naar deze golfvorm als SparkleContinuous)
Doorlopende haptische feedback voor speciale inkttechnieken, zoals een borstel met meerdere kleuren. Optioneel
Doorlopende markergolfvorm Continu haptisch signaal wanneer de gebruiker markering selecteert als handschrifthulpmiddel. Optioneel
PotloodContinuous-golfvorm Continu haptisch signaal wanneer de gebruiker potlood selecteert als inkthulpmiddel. Optioneel

Interactiegolfvormen

Interactiegolfvormen zijn meestal kort (uitzonderingen die worden vermeld in de volgende tabel), directe feedbackgolfvormen die op aanvraag worden gegenereerd om belangrijke acties te bevestigen, zoals het aanwijzen of klikken op een knop, reageren op de voltooiing van een actie of om de aandacht van de gebruiker te trekken.

Eigenschap Beschrijving Vereist/optioneel
Klikgolfvorm Een korte "klik" feedback. Dit is de standaardterugval wanneer een interactiegolfvorm die door de app is geselecteerd, niet wordt ondersteund door een haptische pen. Verplicht
Foutgolfvorm Een sterk signaal om de gebruiker te waarschuwen dat een actie is mislukt of dat er een fout is opgetreden. Optioneel
Golfvorm aanwijzen Geeft aan dat de gebruiker over een interactief gebruikersinterface-element beweegt. Optioneel
Druk op de golfvorm Geeft aan wanneer een gebruiker op een interactief UI-element in een incrementele actie drukt (zie Release). Optioneel
Golfsignaal vrijgeven Geeft aan wanneer een gebruiker een interactief UI-element uitgeeft in een incrementele actie (zie Druk). Optioneel
Succesgolfvorm Sterk signaal om de gebruiker te waarschuwen dat een actie is geslaagd. Optioneel
"BuzzContinuous golfvorm" Continue bruisende sensatie. Optioneel
RumbleContinuous-golfvorm Continue gerommel gevoel. Optioneel

Haptische feedbackaanpassingen

Sommige haptische pennen kunnen de volgende aanpassingen ondersteunen.

Eigenschap Beschrijving Vereist/optioneel
Intensiteit Hiermee stelt u de intensiteit van het haptische signaal in. Optioneel
Aantal afspelen Herhaalt een haptisch signaal een opgegeven aantal keren. Optioneel
Onderbrekingsinterval opnieuw afspelen Hiermee stelt u de tijd in tussen elk herhaald afspelen van het haptische signaal. Optioneel
Duur van afspelen Hiermee stelt u het tijdsinterval in dat een haptisch signaal wordt afgespeeld. Optioneel

Controleren op ondersteuning voor aangepaste instellingen

Gebruik de volgende eigenschappen van de SimpleHapticsController om te controleren op Intensiteit, Afspeelfrequentie, Herhalingspauze-interval en Afspeelduur:

Haptische feedback verzenden en stoppen van inkt

Gebruik de SendHapticFeedback-methode van het Object SimpleHapticsController om inktgolfvormen door te geven aan de pen van de gebruiker. Deze methode ondersteunt het doorgeven van een golfvorm of beide een golfvorm met een aangepaste intensiteitswaarde (zie Haptische feedback aanpassen).

Roep SendHapticFeedback aan en geef een inktgolfvorm door om de pen zo te configureren dat deze golfvorm wordt afgespeeld zodra de tip van de pen ergens op het scherm aanraakt. De golfvorm blijft afspelen totdat de pen wordt opgeheven of StopFeedback wordt aangeroepen, afhankelijk van wat zich het eerst voordoet. We raden u aan dit te doen in de PointerEntered event handler voor het element waarin u haptische feedback wilt laten afspelen. Een app met een aangepaste inkt-implementatie zou dit bijvoorbeeld uitvoeren in de methode 'PointerEntered' van het inktcanvas.

Als u de gewenste inktgolfvorm wilt ophalen, moet u de SupportedFeedback-verzameling van de SimpleHapticsController herhalen, zodat deze wordt ondersteund door de actieve pen.

Als het niet wordt ondersteund, kunt u ervoor kiezen om helemaal niets af te spelen of terug te vallen op de InkContinuous-golfvorm , omdat dat gegarandeerd wordt ondersteund.

In het volgende voorbeeld proberen we de golfvorm BrushContinuous te verzenden (maar terugvallen naar InkContinuous als BrushContinuous niet wordt ondersteund).

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);

Het is belangrijk dat u ook haptische feedback stopt wanneer de bijbehorende aanwijzer het element verlaat dat u hebt geregistreerd voor haptische feedback. Anders zal de signaalvorm blijven proberen af te spelen op de actieve pen.

Opmerking

Sommige pennen kunnen desgewenst haptiek op zichzelf stoppen wanneer de pen het bereik van het scherm verlaat. Het is echter niet vereist voor alle pennen om dit te doen, dus toepassingen moeten altijd expliciet haptische feedback stoppen zoals hier wordt beschreven.

Als u haptische feedback op een element wilt stoppen, registreert u zich voor de pointerExited-gebeurtenis op hetzelfde element als u de pointerEntered-handler hebt geregistreerd die het haptische signaal heeft verzonden. In die afgesloten gebeurtenishandler roept u StopFeedback aan , zoals hier wordt weergegeven.

hapticsController.StopFeedback();

Interactie-feedback verzenden en stoppen

Het verzenden van feedback over interactie is vergelijkbaar met het verzenden van inktfeedback.

Gebruik de SendHapticFeedback-methode van het Object SimpleHapticsController om interactiegolfvormen door te geven aan de pen van de gebruiker. Deze methode ondersteunt het doorgeven van een golfvorm of beide een golfvorm met een aangepaste intensiteitswaarde (zie Haptische feedback aanpassen).

Roep SendHapticFeedback aan en geef een inktgolfvorm door om de pen zo te configureren dat deze golfvorm onmiddellijk wordt afgespeeld op basis van enige interactie in uw app (in plaats van wanneer de tip van de pen het scherm aanraakt voor inktfeedback).

Wanneer u een van de niet-continue interactiegolfvormen gebruikt, is het niet nodig om een bijbehorende StopFeedback-aanroep te maken. U moet StopFeedback nog steeds aanroepen voor de continue interactiegolfvormen.

Opmerking

Het verzenden van een interactiegolfvorm wanneer een inktgolfvorm wordt afgespeeld, onderbreekt de inktgolfvorm tijdelijk. De inktgolfvorm wordt hervat wanneer de interactiegolfvorm stopt.

Als u de gewenste interactiegolfvorm wilt ophalen, moet u de SupportedFeedback-verzameling van de SimpleHapticsController herhalen, zodat deze wordt ondersteund door de actieve pen.

Als het niet wordt ondersteund, kunt u ervoor kiezen om helemaal niets af te spelen of terug te vallen op de klikgolfvorm , omdat dat gegarandeerd wordt ondersteund.

In het volgende voorbeeld proberen we de Error golfvorm te verzenden (maar vallen we terug op Click als Error niet wordt ondersteund).

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); 

Haptische feedback aanpassen

Er zijn drie manieren om haptische feedback aan te passen. De eerste wordt ondersteund door zowel inkt- als interactiefeedback, terwijl de tweede en derde alleen door interactiefeedback worden ondersteund.

  1. Pas de intensiteit van de feedback aan ten opzichte van de instelling voor maximale systeemintensiteit. Hiervoor moet u eerst controleren of simpleHapticsController ondersteuning biedt voor het instellen van de intensiteit en vervolgens SendHapticFeedback aanroept met de gewenste Intensity waarde.

    if (hapticsController.IsIntensitySupported) 
    {
        foreach (var waveform in hapticsController.SupportedFeedback)
        {
            if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.Click)
            {
                double intensity = 0.75;
                hapticsController.SendHapticFeedback(waveform, intensity);
            }
        }
    }
    
  2. Herhaal het haptische signaal een opgegeven aantal keren. Hiervoor moet u eerst controleren of simpleHapticsController ondersteuning biedt voor het instellen van de intensiteit en vervolgens SendHapticFeedbackForPlayCount aanroept met de gewenste tellingswaarde. U kunt ook zowel de intensiteit als het onderbrekingsinterval voor opnieuw afspelen instellen.

    Opmerking

    Als SimpleHapticsController het instellen van de intensiteit of het onderbrekingsinterval voor opnieuw afspelen niet ondersteunt, worden de opgegeven waarden genegeerd.

    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. Stel de duur van het haptische signaal in. Hiervoor moet u eerst controleren of simpleHapticsController ondersteuning biedt voor het instellen van de afspeelduur en vervolgens SendHapticFeedbackForDuration aanroept met de gewenste tijdsintervalwaarde. U kunt ook de intensiteit instellen.

    Opmerking

    Als SimpleHapticsController het instellen van de intensiteit niet ondersteunt, wordt de opgegeven waarde genegeerd.

    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);
            }
        }
    }
    

Voorbeelden

Zie het voorbeeld van pen haptiek voor werkende voorbeelden van de volgende functionaliteit: