Umpan balik haptik (taktil) pada stylus

Pelajari cara menggunakan umpan balik haptik dari perangkat pena untuk memberikan interaksi yang lebih alami dan taktil di aplikasi SDK Aplikasi Windows Anda.

Windows 11 memperkenalkan umpan balik haptik untuk pena digital, memungkinkan pengguna merasakan pena mereka berinteraksi dengan UI aplikasi. Saat merujuk ke fitur ini, haptic digunakan dalam API pengembang dan dokumentasi, sedangkan taktil adalah nama yang ditampilkan kepada pengguna di Pengaturan Windows.

API Utama

Jenis umpan balik haptik

Tersedia dua jenis umpan balik haptik:

  • Umpan balik penintaan — Mensimulasikan nuansa alat tulis atau gambar (pena, penanda, pensil, penyorot) melalui getaran berkelanjutan saat pena menyentuh layar.
  • Umpan balik interaksi — Sinyal taktil singkat untuk tindakan pengguna seperti mengarahkan mouse ke atas tombol, mengklik, atau mengonfirmasi tindakan yang telah selesai.

Mendeteksi input pena

Daftarkan untuk kejadian PointerEntered dan periksa apakah jenis perangkat penunjuk berupa pena:

private void InputObserver_PointerEntered(object sender, PointerRoutedEventArgs e)
{
    if (e.Pointer.PointerDeviceType != Microsoft.UI.Input.PointerDeviceType.Pen)
    {
        return;
    }

    // Pen detected — check for haptic support.
}

Dapatkan PenDevice di SDK Aplikasi Windows

Di aplikasi SDK Aplikasi Windows, gunakan PenDeviceInterop — kelas interop SDK Aplikasi Windows — untuk mendapatkan objek WinRT PenDevice dari titik penunjuk. PenDevice, SimpleHapticsController, dan KnownSimpleHapticsControllerWaveforms adalah jenis WinRT dari namespace Windows.Devices.Input dan Windows.Devices.Haptics; hanya panggilan interopnya sendiri yang berasal dari namespace Microsoft.UI.Input.Interop milik SDK Aplikasi Windows:

using Microsoft.UI.Input.Interop;
using Windows.Devices.Haptics;
using Windows.Devices.Input;
using Windows.Foundation.Metadata;

private void InputObserver_PointerEntered(object sender, PointerRoutedEventArgs e)
{
    if (e.Pointer.PointerDeviceType != Microsoft.UI.Input.PointerDeviceType.Pen)
    {
        return;
    }

    var penDevice = PenDeviceInterop.FromPointerPoint(e.GetCurrentPoint(null));

    if (penDevice == null)
    {
        return; // Pen does not support advanced features.
    }

    // SimpleHapticsController requires Windows 11. Check for API presence
    // before accessing it so the app doesn't throw on Windows 10.
    if (!ApiInformation.IsPropertyPresent(
        "Windows.Devices.Input.PenDevice", "SimpleHapticsController"))
    {
        return; // Haptic feedback requires Windows 11.
    }

    var hapticsController = penDevice.SimpleHapticsController;
    if (hapticsController == null)
    {
        return; // Pen does not support haptic feedback.
    }

    // Configure haptic feedback (see examples below).
}

Nota

Di aplikasi UWP, gunakan PenDevice.GetFromPointerId sebagai gantinya. Kelas PenDeviceInterop ini khusus untuk SDK Aplikasi Windows.

Bentuk gelombang penintaan

Pola gelombang tinta ditampilkan secara terus-menerus saat pena menyentuh layar. Bentuk gelombang yang diperlukan dijamin didukung oleh pena haptik apa pun.

Gelombang Description Diperlukan
InkContinuous Nuansa pena titik bola default. Cadangan untuk bentuk gelombang yang tidak didukung. Yes
SikatBerlanjut Alat kuas No
PensilBerlanjut Alat pensil No
MarkerContinuous Alat penanda No
ChiselMarkerContinuous Penanda / penyorot pahat No
PenghapusKontinu Alat penghapus No
GalaxyPenContinuous Tinta khusus (kuas multi-warna) No

Bentuk gelombang interaksi

Bentuk gelombang interaksi memberikan umpan balik langsung singkat untuk tindakan UI.

Gelombang Description Diperlukan
Click Klik singkat bawaan. Fallback untuk interaksi yang tidak didukung. Yes
Kesalahan Tindakan gagal atau terjadi kesalahan No
Arahkan Mulai mengarahkan kursor ke elemen interaktif No
Tekan Menekan elemen interaktif No
Lepaskan Merilis elemen interaktif No
Keberhasilan Tindakan berhasil No
BuzzContinuous Dengungan terus-menerus No
RumbleContinuous Gemuruh berkelanjutan No

Kirim umpan balik haptik

Iterasi melalui SupportedFeedback untuk menemukan bentuk gelombang yang diinginkan, lalu panggil SendHapticFeedback:

SimpleHapticsControllerFeedback currentWaveform = null;

// Try to use BrushContinuous, fall back to InkContinuous.
foreach (var waveform in hapticsController.SupportedFeedback)
{
    if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.BrushContinuous)
    {
        currentWaveform = waveform;
        break;
    }
}

if (currentWaveform == null)
{
    foreach (var waveform in hapticsController.SupportedFeedback)
    {
        if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.InkContinuous)
        {
            currentWaveform = waveform;
            break;
        }
    }
}

if (currentWaveform != null)
{
    hapticsController.SendHapticFeedback(currentWaveform);
}

Matikan getaran

Selalu hentikan umpan balik haptik saat penunjuk keluar dari elemen . Daftarkan PointerExited pada elemen yang sama:

private void Canvas_PointerExited(object sender, PointerRoutedEventArgs e)
{
    hapticsController?.StopFeedback();
}

Nota

Beberapa pena digital menonaktifkan haptik secara otomatis saat pena diangkat dari layar. Namun, tidak semua pena berfungsi seperti ini, jadi selalu panggil StopFeedback secara eksplisit.

Menyesuaikan umpan balik haptik

Beberapa pulpen memiliki opsi penyesuaian tambahan. Periksa dukungan sebelum menggunakannya:

Harta benda Periksa dukungan dengan
Intensitas IsIntensitySupported
Jumlah pemutaran IsPlayCountSupported
Durasi putar IsPlayDurationSupported
Interval jeda pemutaran ulang IsReplayPauseIntervalSupported
if (hapticsController.IsIntensitySupported)
{
    hapticsController.SendHapticFeedback(currentWaveform, 0.75); // 75% intensity
}