Bagikan melalui


Interaksi pena dan umpan balik haptik (taktil)

Windows memiliki pena digital yang didukung lama yang memungkinkan pengguna berinteraksi dengan perangkat mereka secara alami, langsung dan untuk mengekspresikan kreativitas mereka melalui pengalaman menulis dan menggambar yang kaya menggunakan tinta digital.

Dengan Windows 11, kemampuan baru sedang diperkenalkan yang membuat pengalaman pena digital lebih alami dan menarik: Saat menggunakan pena yang mendukung "umpan balik haptik", pengguna benar-benar dapat merasakan pena mereka berinteraksi secara taktil dengan antarmuka pengguna (UI) aplikasi.

Catatan

Jika mengacu pada fitur baru ini, "haptic" digunakan di seluruh API pengembang dan dokumentasi terkait, sementara "taktil" adalah nama yang mudah dipaparkan kepada pengguna untuk mengatur preferensi umpan balik di Pengaturan Windows.

Pengalaman umpan balik haptic yang didukung di Windows 11 termasuk umpan balik penintaan dan umpan balik interaksi:

  • Umpan balik penintaan mensimulasikan nuansa berbagai jenis alat tulis atau gambar (seperti pena, penanda, pensil, penyorot, dan sebagainya) melalui getaran berkelanjutan saat pena bersentuhan dengan layar. Secara default, Platform Windows Ink mendukung umpan balik haptik untuk semua alat menggambar (topik ini mencakup cara memberikan solusi penintaan kustom di luar yang didukung oleh Windows Ink).
  • Umpan balik interaksi, di sisi lain, adalah umpan balik langsung berdasarkan tindakan pengguna utama seperti mengarahkan mouse ke atas atau mengklik tombol, menanggapi penyelesaian tindakan, atau untuk menarik perhatian pengguna.

Biasanya, lima langkah diperlukan untuk sepenuhnya mendukung umpan balik haptik:

  • Mendeteksi input pena.
  • Tentukan apakah pena dan perangkat saat ini mendukung umpan balik haptik dan, jika demikian, fitur umpan balik haptik apa yang didukungnya.
  • Tentukan sinyal umpan balik haptik untuk dikirim.
  • Kirim umpan balik haptik.
  • Menghentikan umpan balik haptik

Mendeteksi input pena

Untuk mendeteksi dan mengisolasi input pena, Anda harus terlebih dahulu mendaftar untuk peristiwa PointerEntered lalu memeriksa apakah PointerDeviceType adalah pena.

Kode berikut menunjukkan cara memeriksa jenis perangkat penunjuk dalam peristiwa PointerEntered. Untuk contoh ini, jika input bukan dari pena, kami hanya mengembalikan dari penanganan aktivitas. Jika tidak, kami memeriksa kemampuan pena dan mengonfigurasi umpan balik haptik.


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

Menentukan dukungan untuk umpan balik haptik

Tidak semua pena dan digitizer mendukung umpan balik haptik, dan pena yang tidak akan selalu mendukung semua fitur umpan balik haptik yang dijelaskan dalam topik ini. Dengan demikian, penting untuk secara terprogram mengonfirmasi fitur mana yang didukung oleh pena aktif.

Dalam kelanjutan dari contoh sebelumnya, kami menunjukkan cara memeriksa apakah pena aktif mendukung umpan balik haptik.

Kami pertama kali mencoba mengambil objek PenDevice dari PointerId saat ini. Jika PenDevice tidak dapat diperoleh, kami hanya kembali dari penanganan aktivitas.

Jika PenDevice diperoleh, kami menguji apakah pendevice mendukung properti SimpleHapticsController. Jika tidak, kita hanya kembali dari penanganan aktivitas.

// 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 yang diambil dalam contoh sebelumnya digunakan dalam contoh berikutnya untuk mengkueri kemampuan haptik dan untuk mengirim/menghentikan umpan balik haptik.

Catatan

Jika Anda membangun aplikasi dengan Pratinjau SDK Aplikasi Windows 1.0, Anda dapat menggunakan interop PenDevice (PenDeviceInterop.FromPointerPoint(PointerPoint)) untuk mengakses penDevice sistem.

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

Bagian berikut menjelaskan fitur umpan balik yang harus didukung pena haptic, serta yang bersifat opsional. Jenis umpan balik haptik yang diperlukan biasanya dapat digunakan sebagai fallback alih-alih fitur opsional.

Bentuk gelombang penintaan

Bentuk gelombang penintaan bermain terus-menerus saat pena bersentuhan dengan layar, dan mencoba mensimulasikan nuansa berbagai alat tulis atau gambar.

Fitur Deskripsi Diperlukan / Opsional
Bentuk gelombang InkContinous Mensimulasikan nuansa penintaan dengan pena titik bola fisik. Ini adalah fallback default ketika bentuk gelombang penintaan tidak didukung oleh pena haptic. Wajib
Bentuk gelombang BrushContinuous Sinyal haptik berkelanjutan saat pengguna memilih sikat sebagai alat penintaan. Opsional
Bentuk gelombang ChiselMarkerContinuous Sinyal haptik berkelanjutan saat pengguna memilih penanda/penyorot pahat sebagai alat penintaan. Opsional
Bentuk gelombang EraserContinuous Sinyal haptik berkelanjutan saat pengguna memilih penghapus sebagai alat penintaan. Opsional
Bentuk gelombang GalaxyContinuous
(dokumentasi HID dan panduan implementasi mengacu pada bentuk gelombang ini sebagai SparkleContinuous)
Sinyal haptik berkelanjutan untuk alat tinta khusus, seperti kuas multi-warna. Opsional
Bentuk gelombang MarkerContinuous Sinyal haptik berkelanjutan saat pengguna memilih penanda sebagai alat penintaan. Opsional
Bentuk gelombang PencilContinuous Sinyal haptik berkelanjutan saat pengguna memilih pensil sebagai alat penintaan. Opsional

Bentuk gelombang interaksi

Bentuk gelombang interaksi biasanya singkat (pengecualian yang dicatat dalam tabel berikut), bentuk gelombang umpan balik langsung yang dihasilkan sesuai permintaan untuk mengonfirmasi tindakan utama seperti mengarahkan kumparan atau mengklik tombol, menanggapi penyelesaian tindakan, atau untuk menarik perhatian pengguna.

Fitur Deskripsi Diperlukan / Opsional
Klik bentuk gelombang Umpan balik singkat "klik". Ini adalah fallback default ketika bentuk gelombang interaksi yang dipilih oleh aplikasi tidak didukung oleh pena haptic. Wajib
Bentuk gelombang kesalahan Sinyal kuat untuk memperingatkan pengguna bahwa tindakan gagal, atau telah terjadi kesalahan. Opsional
Bentuk gelombang hover Menunjukkan bahwa pengguna telah mulai mengarahkan kursor ke elemen UI interaktif. Opsional
Tekan bentuk gelombang Menunjukkan kapan pengguna menekan elemen UI interaktif dalam tindakan bertahap (lihat Rilis). Opsional
Bentuk gelombang rilis Menunjukkan kapan pengguna merilis elemen UI interaktif dalam tindakan bertahap (lihat Tekan). Opsional
Bentuk gelombang keberhasilan Sinyal kuat untuk memperingatkan pengguna bahwa tindakan berhasil. Opsional
Bentuk gelombang BuzzContinuous Sensasi berdengung berkelanjutan. Opsional
Bentuk gelombang RumbleContinuous Sensasi gemuruh berkelanjutan. Opsional

Kustomisasi umpan balik haptik

Beberapa pena haptik dapat mendukung kustomisasi berikut.

Fitur Deskripsi Diperlukan / Opsional
Intensitas Mengatur intensitas sinyal haptik. Opsional
Jumlah Putar Mengulangi sinyal haptik beberapa kali. Opsional
Interval Jeda Pemutaran Ulang Mengatur waktu antara setiap pemutaran berulang sinyal haptik. Opsional
Durasi Putar Mengatur interval waktu saat sinyal haptik diputar. Opsional

Periksa dukungan pengaturan kustom

Untuk memeriksa dukungan Intensitas, Jumlah Putar, Jeda Pemutaran Ulang, dan Durasi Pemutaran , gunakan properti SimpleHapticsController berikut:

Mengirim dan menghentikan umpan balik haptik penintaan

Gunakan metode SendHapticFeedback dari objek SimpleHapticsController untuk meneruskan bentuk gelombang penintaan ke pena pengguna. Metode ini mendukung passing dalam bentuk gelombang atau bentuk gelombang dengan nilai intensitas yang disesuaikan (lihat Menyesuaikan umpan balik haptik).

Panggil SendHapticFeedback dan berikan bentuk gelombang penintaan untuk mengonfigurasi pena untuk mulai memutar bentuk gelombang tersebut segera setelah ujung pena menyentuh di mana saja di layar. Bentuk gelombang akan terus diputar sampai pena diangkat atau StopFeedback dipanggil, mana yang terjadi terlebih dahulu. Sebaiknya lakukan ini di penanganan aktivitas PointerEntered untuk elemen tempat Anda ingin haptics dimainkan. Misalnya, aplikasi dengan implementasi penintaan kustom akan melakukan ini dalam metode PointerEntered dari kanvas penintaannya.

Untuk mengambil bentuk gelombang penintaan yang diinginkan, Anda harus melakukan iterasi melalui koleksi SupportedFeedback dari SimpleHapticsController, memastikannya didukung oleh pena aktif.

Jika tidak didukung, Anda dapat memilih untuk tidak memutar apa pun sama sekali atau kembali ke bentuk gelombang InkContinuous , karena dijamin didukung.

Dalam contoh berikut, kami mencoba mengirim bentuk gelombang BrushContinuous (tetapi kembali ke InkContinuous jika BrushContinuous tidak didukung).

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

Penting bagi Anda untuk menghentikan umpan balik haptik ketika pointer terkait keluar dari elemen yang Anda daftarkan untuk umpan balik haptik. Jika tidak, bentuk gelombang akan terus mencoba untuk bermain di pena aktif.

Catatan

Beberapa pena dapat secara opsional menghentikan haptik sendiri ketika pena meninggalkan rentang layar. Namun, tidak diperlukan semua pena untuk melakukan ini, sehingga aplikasi harus selalu secara eksplisit menghentikan umpan balik haptik seperti yang dijelaskan di sini.

Untuk menghentikan umpan balik haptik pada elemen, daftar untuk peristiwa PointerExited pada elemen yang sama saat Anda mendaftarkan handler PointerEntered yang mengirim sinyal haptik. Dalam penanganan aktivitas yang keluar, panggil StopFeedback seperti yang ditunjukkan di sini.

hapticsController.StopFeedback();

Mengirim dan menghentikan umpan balik interaksi

Mengirim umpan balik Interaksi sangat mirip dengan mengirim umpan balik penintaan.

Gunakan metode SendHapticFeedback dari objek SimpleHapticsController untuk meneruskan bentuk gelombang interaksi ke pena pengguna. Metode ini mendukung passing dalam bentuk gelombang atau bentuk gelombang dengan nilai intensitas yang disesuaikan (lihat Menyesuaikan umpan balik haptik).

Panggil SendHapticFeedback dan teruskan bentuk gelombang penintaan untuk mengonfigurasi pena untuk mulai memutar bentuk gelombang tersebut segera berdasarkan beberapa interaksi dalam aplikasi Anda (alih-alih ketika ujung pena menyentuh layar untuk umpan balik penintaan).

Saat menggunakan salah satu bentuk gelombang Interaksi non-berkelanjutan, tidak perlu melakukan panggilan StopFeedback yang sesuai. Anda masih perlu memanggil StopFeedback untuk bentuk gelombang Interaksi berkelanjutan.

Catatan

Mengirim bentuk gelombang interaksi ketika bentuk gelombang penintaan sedang dimainkan akan mengganggu bentuk gelombang penintaan untuk sementara. Bentuk gelombang penintaan akan dilanjutkan ketika bentuk gelombang interaksi berhenti.

Untuk mengambil bentuk gelombang interaksi yang diinginkan, Anda harus melakukan iterasi melalui koleksi SupportedFeedback dari SimpleHapticsController, memastikannya didukung oleh pena aktif.

Jika tidak didukung, Anda dapat memilih untuk tidak memutar apa pun sama sekali atau kembali ke bentuk gelombang Klik , karena dijamin didukung.

Dalam contoh berikut, kami mencoba mengirim bentuk gelombang Kesalahan (tetapi kembali ke Klik jika Kesalahan tidak didukung).

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

Menyesuaikan umpan balik haptik

Ada tiga cara untuk menyesuaikan umpan balik haptik. Yang pertama didukung oleh umpan balik Penintaan dan Interaksi, sedangkan yang kedua dan ketiga hanya didukung oleh umpan balik Interaksi.

  1. Sesuaikan intensitas umpan balik relatif terhadap pengaturan intensitas sistem maksimum. Untuk melakukan ini, Anda harus terlebih dahulu memeriksa untuk memastikan bahwa SimpleHapticsController mendukung pengaturan intensitas lalu memanggil SendHapticFeedback dengan nilai yang diinginkan Intensity .

    if (hapticsController.IsIntensitySupported) 
    {
        foreach (var waveform in hapticsController.SupportedFeedback)
        {
            if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.Click)
            {
                double intensity = 0.75;
                hapticsController.SendHapticFeedback(waveform, intensity);
            }
        }
    }
    
  2. Ulangi sinyal haptik beberapa kali. Untuk melakukan ini, Anda harus terlebih dahulu memeriksa untuk memastikan bahwa SimpleHapticsController mendukung pengaturan intensitas lalu memanggil SendHapticFeedbackForPlayCount dengan nilai hitungan yang diinginkan. Anda juga dapat mengatur intensitas dan interval jeda pemutaran ulang.

    Catatan

    Jika SimpleHapticsController tidak mendukung pengaturan intensitas atau interval jeda pemutaran ulang, nilai yang disediakan akan diabaikan.

    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. Atur durasi sinyal haptik. Untuk melakukan ini, Anda harus terlebih dahulu memeriksa untuk memastikan bahwa SimpleHapticsController mendukung pengaturan durasi pemutaran lalu memanggil SendHapticFeedbackForDuration dengan nilai interval waktu yang diinginkan. Anda juga dapat mengatur intensitas.

    Catatan

    Jika SimpleHapticsController tidak mendukung pengaturan intensitas, nilai yang disediakan akan diabaikan.

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

Contoh

Lihat sampel haptik Pena untuk contoh kerja fungsionalitas berikut: