PointerPredictor Kelas
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Menyediakan dukungan untuk menghasilkan kumpulan objek PointerPoint yang memprediksi jalur yang paling mungkin dari Pointer input saat ini.
public ref class PointerPredictor sealed : IClosable
/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.Foundation.WindowsAppSDKContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class PointerPredictor final : IClosable
[Windows.Foundation.Metadata.ContractVersion(typeof(Microsoft.Foundation.WindowsAppSDKContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public sealed class PointerPredictor : System.IDisposable
Public NotInheritable Class PointerPredictor
Implements IDisposable
- Warisan
- Atribut
- Penerapan
Contoh
Dalam contoh berikut, kami menunjukkan cara menggunakan objek PointerPredictor dengan menerima input untuk SwapChainPanel pada utas latar belakang.
class PointerPredictionRenderer : IDisposable
{
private DispatcherQueueController _queuecontroller;
private InputPointerSource _inputPointerSource;
private PointerPredictor _pointerPredictor;
private List<Point> _actualPoints = new List<Point>();
private List<Point> _predictedPoints = new List<Point>();
private SwapChainPanel _panel;
public PointerPredictionRenderer(SwapChainPanel panel)
{
_panel = panel;
_panel.Loaded += SwapChainPanel_Loaded;
}
private void SwapChainPanel_Loaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
{
_queuecontroller = DispatcherQueueController.CreateOnDedicatedThread();
_queuecontroller.DispatcherQueue.TryEnqueue(DispatcherQueuePriority.High,
() =>
{
// Set up the pointer input source to receive pen input for the swap chain panel.
_inputPointerSource = _panel.CreateCoreIndependentInputSource(InputPointerSourceDeviceKinds.Pen);
_inputPointerSource.PointerPressed += InputPointerSource_PointerPressed;
_inputPointerSource.PointerMoved += InputPointerSource_PointerMoved;
_inputPointerSource.PointerReleased += InputPointerSource_PointerReleased;
// Create the pointer predictor for the input pointer source. By default it will be configured
// to predict points 15ms into the future
_pointerPredictor = PointerPredictor.CreateForInputPointerSource(_inputPointerSource);
});
}
~PointerPredictionRenderer()
{
Dispose();
}
public void Dispose()
{
if (_pointerPredictor != null)
{
_pointerPredictor.Dispose();
_pointerPredictor = null;
}
_inputPointerSource.PointerPressed -= InputPointerSource_PointerPressed;
_inputPointerSource.PointerMoved -= InputPointerSource_PointerMoved;
_inputPointerSource.PointerReleased -= InputPointerSource_PointerReleased;
_inputPointerSource = null;
_queuecontroller = null;
}
private void InputPointerSource_PointerPressed(InputPointerSource sender, PointerEventArgs args)
{
// Store the new point in contact.
_actualPoints.Add(args.CurrentPoint.Position);
}
private void InputPointerSource_PointerMoved(InputPointerSource sender, PointerEventArgs args)
{
// Only render ink and query for predicted points when the pointer is in contact.
// There are no predicted points if the pointer is not in contact.
if (args.CurrentPoint.IsInContact)
{
// Store new points received in this event.
var intermediatePoints = args.GetIntermediatePoints();
foreach (var point in intermediatePoints)
{
_actualPoints.Add(point.Position);
}
// Query for the predicted points from the predictor.
var predictedPoints = _pointerPredictor.GetPredictedPoints(args.CurrentPoint);
if (predictedPoints != null)
{
foreach (var predictedPoint in predictedPoints)
{
_predictedPoints.Add(predictedPoint.Position);
}
}
// Render the new ink stroke and the predicted ink stroke.
RenderInk();
}
}
private void InputPointerSource_PointerReleased(InputPointerSource sender, PointerEventArgs args)
{
// Clear the stored ink points and erase the predicted ink rendered for this stroke.
_actualPoints.Clear();
ClearPredictedInk();
_predictedPoints.Clear();
}
private void RenderInk()
{
// Render the ink strokes defined by _actualPoints and _predictedPoints.
throw new NotImplementedException();
}
private void ClearPredictedInk()
{
// Clear the ink stroke defined by _predictedPoints.
throw new NotImplementedException();
}
}
Keterangan
Objek ini biasanya digunakan untuk mengurangi latensi penyajian untuk input tinta. Dalam beberapa kasus, ketika pengguna menggambar dengan sangat cepat, mungkin ada celah yang nyata antara ujung pena dan tinta yang dirender.
Properti
PredictionTime |
Mendapatkan atau mengatur seberapa jauh ke masa depan dari waktu saat ini objek PointerPredictor harus mencoba memprediksi input pointer. |
Metode
Close() |
Menutup PointerPredictor dan merilis sumber daya sistem. |
CreateForInputPointerSource(InputPointerSource) |
Membuat instans PointerPredictor untuk InputPointerSource yang ditentukan. |
Dispose() |
Melakukan tugas yang ditentukan aplikasi yang terkait dengan membebaskan, merilis, atau mengatur ulang sumber daya yang tidak dikelola. |
GetPredictedPoints(PointerPoint) |
Mengambil kumpulan titik yang diprediksi untuk PointerPoint yang ditentukan. |
Berlaku untuk
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk