Aracılığıyla paylaş


Kalem etkileşimleri ve dokunsal (dokunsal) geri bildirim

Windows, kullanıcıların cihazlarıyla doğal, doğrudan bir şekilde etkileşim kurmasına ve dijital mürekkep kullanarak zengin yazma ve çizim deneyimleri aracılığıyla yaratıcılıklarını ifade etmesine olanak sağlayan dijital kalemleri uzun zamandır desteklemektedir.

Windows 11 ile dijital kalem deneyimini daha doğal ve cazip hale getiren yeni bir özellik kullanıma sunulmuştur: "Dokunsal geri bildirim" destekleyen bir kalem kullanırken, kullanıcılar kalemlerinin bir uygulamanın kullanıcı arabirimi (UI) ile dokunsal bir şekilde etkileşim kurduğunu hissedebilir.

Uyarı

Bu yeni özelliğe başvururken, geliştirici API'leri ve ilgili belgelerde "haptik" terimi kullanılırken, "dokunsal" Windows Ayarları'nda geri bildirim tercihlerini ayarlamak için kullanıcılara sunulan kolay bir addır.

Windows 11'de desteklenen dokunsal geri bildirim deneyimleri arasında mürekkep geri bildirimi ve etkileşim geri bildirimi yer alır.

  • Mürekkep oluşturma geri bildirimi, kalem ekranla temas halindeyken sürekli titreşimler aracılığıyla çeşitli yazı veya çizim araçlarının (kalem, işaretçi, kalem, vurgulayıcı vb.) hissini simüle eder. Varsayılan olarak, Windows Ink Platform tüm çizim araçları için dokunsal geri bildirimi destekler (bu konu, Windows Mürekkep tarafından desteklenenin ötesinde özel bir mürekkep oluşturma çözümü sağlamayı kapsar).
  • Etkileşim geri bildirimi ise, bir düğmenin üzerine gelme veya tıklama, eylemin tamamlanmasına yanıt verme veya kullanıcının dikkatini çekme gibi önemli kullanıcı eylemlerine dayalı olarak doğrudan geri bildirimdir.

Genellikle, dokunsal geri bildirimleri tam olarak desteklemek için beş adım gerekir:

  • Kalem girişini algılama.
  • Geçerli kalemin ve cihazın dokunsal geri bildirimi destekleyip desteklemediğini ve destekliyorsa hangi dokunsal geri bildirim özelliklerini desteklediğini belirleyin.
  • Gönderilecek dokunsal geri bildirim sinyaline karar verin.
  • Dokunsal geri bildirim gönderin.
  • Dokunsal geri bildirimi durdurun

Kalem girişini algılama

Kalem girişini algılamak ve yalıtmak için önce PointerEntered olayına kaydolmanız ve ardından PointerDeviceType öğesinin kalem olup olmadığını denetlemeniz gerekir.

Aşağıdaki kod, pointerEntered olayı içinde işaretçi cihaz türünün nasıl denetleneceklerini gösterir. Bu örnekte, giriş bir kalemden değilse olay işleyicisinden geri döneriz. Aksi takdirde kalem özelliklerini denetler ve dokunsal geri bildirimi yapılandırabiliriz.


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

Dokunsal geri bildirim desteğini belirleme

Tüm kalemler ve dijitalleştiriciler dokunsal geri bildirimleri desteklemez ve bu konuda açıklanan tüm dokunsal geri bildirim özelliklerini desteklemez. Bu nedenle, etkin kalem tarafından desteklenen özellikleri program aracılığıyla onaylamak önemlidir.

Yukarıdaki örneğin devamında, etkin kalemin dokunsal geri bildirimi destekleyip desteklemediğini nasıl denetleyebileceğimizi göstereceğiz.

İlk olarak geçerli PointerId öğesinden bir PenDevice nesnesi almayı deneriz. Bir PenDevice alınamazsa, olay işleyicisinden geriye döneriz.

Bir PenDevice elde edildiyse, SimpleHapticsController özelliğini destekleyip desteklemediğini test ederiz. Aksi takdirde, olay işleyicisinden tekrar geri döneriz.

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

Önceki örnekte alınan SimpleHapticsController , sonraki örneklerde dokunsal özellikleri sorgulamak ve dokunsal geri bildirim göndermek/durdurmak için kullanılır.

Uyarı

Windows App SDK ile uygulama oluşturuyorsanız, sistem PenDevice'e erişmek için PenDevice interop (PenDeviceInterop.FromPointerPoint(PointerPoint)) kullanabilirsiniz.

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

Aşağıdaki bölümlerde, dokunsal kalemlerin desteklemesi gereken geri bildirim özellikleri ve isteğe bağlı olanlar açıklanmaktadır. Gerekli bir dokunsal geri bildirim türü genellikle isteğe bağlı bir özellik yerine geri dönüş olarak kullanılabilir.

Mürekkepleme dalga formları

Mürekkep dalga formları, kalem ekranla temas halindeyken sürekli devam eder ve çeşitli yazma veya çizim araçlarının hissini simüle etmeye çalışır.

Özellik Açıklama Gerekli / İsteğe Bağlı
Sürekli Mürekkep Dalga Formu Fiziksel bir tükenmez kalemle yazma hissini simüle eder. Mürekkep oluşturma dalga biçimi dokunsal kalem tarafından desteklenmediğinde varsayılan geri dönüş budur. Zorunlu
Sürekli Fırça Dalga Şekli Kullanıcı mürekkep oluşturma aracı olarak fırçayı seçtiğinde sürekli dokunsal sinyal. Opsiyonel
ChiselMarkerContinuous dalga biçimi Kullanıcı mürekkep oluşturma aracı olarak keski işaretçisi/vurgulayıcı seçtiğinde sürekli dokunsal sinyal. Opsiyonel
Silgi Sürekli dalga formu Kullanıcı çizim aracı olarak silgiyi seçtiğinde sürekli dokunsal geri bildirim. Opsiyonel
GalaxyContinuous dalga biçimi
(HID belgeleri ve uygulama kılavuzu bu dalga formunu SparkleContinuous olarak ifade eder)
Çok renkli fırça gibi özel mürekkep araçları için sürekli dokunsal sinyal. Opsiyonel
İşaretçi Sürekli dalga formu Kullanıcı mürekkep oluşturma aracı olarak işaretleyiciyi seçtiğinde sürekli dokunsal sinyal. Opsiyonel
PencilContinuous dalga formu Kullanıcı kalemi mürekkep aracı olarak seçtiğinde sürekli dokunsal sinyal. Opsiyonel

Etkileşim dalga formları

Etkileşim dalga formları genellikle kısadır (aşağıdaki tabloda belirtilen özel durumlar), bir düğmenin üzerine gelme veya tıklama, eylemin tamamlanmasına yanıt verme veya kullanıcının dikkatini çekme gibi önemli eylemleri onaylamak için isteğe bağlı olarak oluşturulan doğrudan geri bildirim dalga formlarıdır.

Özellik Açıklama Gerekli / İsteğe Bağlı
Dalga biçimine tıklayın Kısa bir "tıklama" geri bildirimi. Bu, uygulama tarafından seçilen bir etkileşim dalga biçimi bir dokunsal kalem tarafından desteklenmediğinde varsayılan geri dönüş olur. Zorunlu
Dalga biçimi hatası Kullanıcıyı bir eylemin başarısız olduğu veya bir hata oluştuğu konusunda uyaran güçlü bir sinyal. Opsiyonel
Hover dalga biçimi Kullanıcının etkileşimli bir kullanıcı arabirimi öğesinin üzerine geldiğini gösterir. Opsiyonel
Dalga biçimine basın Kullanıcının artımlı bir eylemde etkileşimli bir ui öğesine ne zaman basıldığını gösterir (bkz. Sürüm). Opsiyonel
Serbest bırakma dalga biçimi Kullanıcının, artımlı bir eylemde etkileşimli kullanıcı arayüzü öğesini ne zaman serbest bıraktığını gösterir (bkz. Basma). Opsiyonel
Başarı dalga biçimi Kullanıcıyı bir eylemin başarılı olduğu konusunda uyarmak için güçlü sinyal. Opsiyonel
BuzzContinuous dalga biçimi Sürekli vızıltı hissi. Opsiyonel
RumbleContinuous dalga modülü Sürekli gürültü hissi. Opsiyonel

Dokunsal geri bildirim özelleştirmeleri

Bazı dokunsal kalemler aşağıdaki özelleştirmeleri destekleyebilir.

Özellik Açıklama Gerekli / İsteğe Bağlı
Yoğunluk Dokunsal sinyalin yoğunluğunu ayarlar. Opsiyonel
Oynatma Sayısı Belirli bir sayıda dokunsal sinyali tekrarlar. Opsiyonel
Yeniden Oynatma Duraklatma Aralığı Dokunsal sinyalin tekrarlanan her oynatışı arasındaki süreyi ayarlar. Opsiyonel
Oynatma Süresi Dokunsal sinyalin çalındığı zaman aralığını ayarlar. Opsiyonel

Özel ayarlar desteğini denetleme

Yoğunluk, Oynatma Sayısı, Tekrar Aralığı ve Oynatma Süresi desteğini denetlemek için SimpleHapticsController'ın aşağıdaki özelliklerini kullanın.

Dokunsal geri bildirimi gönder ve mürekkep geribildirimini durdur

Mürekkep oluşturma dalga formlarını kullanıcının kalemine geçirmek için SimpleHapticsController nesnesinin SendHapticFeedback yöntemini kullanın. Bu yöntem, özelleştirilmiş yoğunluk değerine sahip bir dalga biçimi veya her iki dalga biçimi geçirmeyi destekler (bkz . Dokunsal geri bildirimi özelleştirme).

SendHapticFeedback'i kullanın ve kalemin ucu ekranın herhangi bir yerine dokunduğunda ink dalga formunu çalmaya başlayacak şekilde yapılandırmak için bir inking dalga formu geçirin. Dalga biçimi, kalem kaldırılana veya StopFeedback çağrılana kadar (hangisi önce gerçekleşirse) oynamaya devam eder. Bunu, haptics'in oynatılmasını istediğiniz öğe için PointerEntered olay işleyicisinde yapmanızı öneririz. Örneğin, özel mürekkep oluşturma uygulamasına sahip bir uygulama bunu mürekkep oluşturma tuvalinin PointerEntered yönteminde yapar.

İstenilen mürekkep dalga formunu almak için SimpleHapticsController'ınSupportedFeedback koleksiyonunda yineleme yapmanız ve bunun etkin kalem tarafından desteklendiğinden emin olmanız gerekir.

Desteklenmiyorsa, herhangi bir şey çalmamayı seçebilir veya desteklenmesi garanti edilen InkContinuous dalga biçimine geri dönebilirsiniz.

Aşağıdaki örnekte BrushContinuous dalga formunu göndermeye çalışırız (ancak BrushContinuous desteklenmiyorsa InkContinuous'a geri döneriz).

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

İlişkili işaretçi, dokunsal geri bildirim için kaydettiğiniz öğeden çıktığında da dokunsal geri bildirimi durdurmanız önemlidir. Aksi takdirde, dalga formu aktif kalem üzerinde çalmaya devam edecektir.

Uyarı

Kalem ekranın aralığından ayrıldığında bazı kalemler isteğe bağlı olarak haptics'i kendi başlarına durdurabilir. Ancak, tüm kalemlerin bunu yapması gerekli değildir, bu nedenle uygulamalar burada açıklandığı gibi her zaman açıkça dokunsal geri bildirimleri durdurmalıdır.

Bir öğeyle ilgili dokunsal geri bildirimi durdurmak için, dokunsal sinyali gönderen PointerEntered işleyicisini kaydettiğiniz öğede PointerExited olayına kaydolun. Çıkış olay işleyicisinde, burada gösterildiği gibi StopFeedback'i çağırın.

hapticsController.StopFeedback();

Etkileşim geri bildirimi gönderme ve durdurma

Etkileşim geri bildirimi göndermek, çizim geri bildirimi göndermeye oldukça benzer.

Etkileşim dalga formlarını kullanıcının kalemine geçirmek için SimpleHapticsController nesnesinin SendHapticFeedback yöntemini kullanın. Bu yöntem, özelleştirilmiş yoğunluk değerine sahip bir dalga biçimi veya her iki dalga biçimi geçirmeyi destekler (bkz . Dokunsal geri bildirimi özelleştirme).

SendHapticFeedback'i çağırın ve uygulamanızda bir etkileşim gerçekleştiğinde kalemin hemen titreşimli geri bildirim vermesi için bir mürekkep dalga formu seçin (bu, kalemin ucu ekranla temas ettiğinde verilen mürekkep geri bildiriminden farklıdır).

Sürekli olmayan Etkileşim dalga biçimlerinden herhangi birini kullanırken, karşılık gelen bir StopFeedback çağrısı yapmak gerekli değildir. Sürekli Etkileşim dalga formları için StopFeedback'i çağırmanız gerekir.

Uyarı

Mürekkep oluşturma dalga formu oynatılırken etkileşim dalga formu göndermek, mürekkep oluşturma dalga formunu geçici olarak kesintiye uğratır. Mürekkep oluşturma dalga biçimi, etkileşim dalga biçimi durduğunda devam eder.

İstenen etkileşim dalga formunu almak için SimpleHapticsController'ınSupportedFeedback koleksiyonunda yineleme yapmanız ve etkin kalem tarafından desteklendiğinden emin olmanız gerekir.

Desteklenmiyorsa, herhangi bir şey oynatmamayı seçebilir veya desteklenmesi garanti olduğundan Tıklama dalga biçimine geri dönebilirsiniz.

Aşağıdaki örnekte, Hata dalga formunu göndermeye çalışırız (ancak Hata desteklenmiyorsa Tıklama'ya geri döneriz).

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

Dokunsal geri bildirimleri özelleştirme

Dokunsal geri bildirimleri özelleştirmenin üç yolu vardır. Birincisi hem Mürekkep Oluşturma hem de Etkileşim geri bildirimi tarafından desteklenirken, ikincisi ve üçüncüsü yalnızca Etkileşim geri bildirimi tarafından desteklenir.

  1. Geri bildirimin yoğunluğunu maksimum sistem yoğunluğu ayarına göre ayarlayın. Bunu yapmak için önce SimpleHapticsController'ın yoğunluğu ayarlamayı desteklediğinden emin olmanız ve ardından SendHapticFeedback öğesini istenen Intensity değerle çağırmanız gerekir.

    if (hapticsController.IsIntensitySupported) 
    {
        foreach (var waveform in hapticsController.SupportedFeedback)
        {
            if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.Click)
            {
                double intensity = 0.75;
                hapticsController.SendHapticFeedback(waveform, intensity);
            }
        }
    }
    
  2. Dokunsal sinyali belirtilen sayıda tekrarlayın. Bunu yapmak için önce SimpleHapticsController'ın yoğunluğu ayarlamayı desteklediğinden emin olmanız ve ardından sendHapticFeedbackForPlayCount öğesini istenen sayı değeriyle çağırmanız gerekir. Ayrıca hem yoğunluğu hem de yeniden yürütme duraklatma aralığını ayarlayabilirsiniz.

    Uyarı

    SimpleHapticsController yoğunluğu veya yeniden yürütme duraklatma aralığını ayarlamayı desteklemiyorsa, sağlanan değerler yoksayılır.

    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. Dokunsal sinyalin süresini ayarlayın. Bunu yapmak için önce SimpleHapticsController'ın yürütme süresini ayarlamayı desteklediğinden emin olmanız ve ardından sendHapticFeedbackForDuration öğesini istenen zaman aralığı değeriyle çağırmanız gerekir. Yoğunluğu da ayarlayabilirsiniz.

    Uyarı

    SimpleHapticsController yoğunluğu ayarlamayı desteklemiyorsa, verilen değer yoksayılır.

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

Örnekler

Aşağıdaki işlevlerin çalışan örnekleri için Kalem dokunsal geri bildirim örneğine bakın.