使用加速計

學習如何使用加速度計來回應使用者的動作。

這個例子建立了一個簡單的應用程式,依賴加速度計作為輸入裝置。 你可以用加速度計在使用者移動裝置時做出反應。 基於加速度計的應用程式通常只使用一到兩個軸來輸入。

Note

本文重點介紹示範如何使用加速度計的程式碼。 欲了解加速度計感測器的概述,請參閱 感測器:加速度計

Prerequisites

你應該熟悉加速度計感測器及其用途。 參見 感測器:加速度計

你使用的裝置必須支援加速度計。

範例程式碼

using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml.Controls;
using Windows.Devices.Sensors;

namespace DevicesDemo.Pages
{
    public sealed partial class AccelerometerPage : Page
    {
        private Accelerometer? accelerometer;

        public AccelerometerPage()
        {
            InitializeComponent();

            // Get the default accelerometer sensor object.
            accelerometer = Accelerometer.GetDefault();

            if (accelerometer != null)
            {
                // Establish the report interval.
                uint minReportInterval = accelerometer.MinimumReportInterval;
                uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
                accelerometer.ReportInterval = reportInterval;

                // Assign an event handler for the reading-changed event.
                accelerometer.ReadingChanged += Accelerometer_ReadingChanged;
            }
            else
            {
                statusBar.Message = "No accelerometer was found.";
                statusBar.Severity = InfoBarSeverity.Error;
                statusBar.IsOpen = true;
            }
        }

        // This event handler writes the current accelerometer reading to
        // the three acceleration text blocks on the XAML page.
        private void Accelerometer_ReadingChanged(Accelerometer sender, AccelerometerReadingChangedEventArgs args)
        {
            DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
            {
                AccelerometerReading reading = args.Reading;
                txtXAxis.Text = String.Format("{0,5:0.00}", reading.AccelerationX);
                txtYAxis.Text = String.Format("{0,5:0.00}", reading.AccelerationY);
                txtZAxis.Text = String.Format("{0,5:0.00}", reading.AccelerationZ);
            });
        }
    }
}
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid Margin="24">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="44"/>
            <RowDefinition Height="44"/>
            <RowDefinition Height="44"/>
        </Grid.RowDefinitions>
        <TextBlock Text="X-axis:" Style="{StaticResource LabelTextBlockStyle}"/>
        <TextBlock x:Name="txtXAxis" Grid.Column="1" Text="---"/>

        <TextBlock Grid.Row="1" Text="Y-axis:" Style="{StaticResource LabelTextBlockStyle}"/>
        <TextBlock x:Name="txtYAxis" Grid.Column="1" Grid.Row="1" Text="---"/>

        <TextBlock Grid.Row="2" Text="Z-axis:" Style="{StaticResource LabelTextBlockStyle}"/>
        <TextBlock x:Name="txtZAxis" Grid.Column="1" Grid.Row="2" Text="---"/>
    </Grid>

    <InfoBar x:Name="statusBar" Grid.Row="1"/>
</Grid>

應用程式運行時,你可以透過移動裝置來改變加速度計的數值。

前一個範例展示了你需要撰寫的必要程式碼,以便將加速度計輸入整合進你的應用程式。

連接到感測器

呼叫 GetDefault 方法來建立與預設加速度計的連線。

private Accelerometer? accelerometer;
// ...
accelerometer = Accelerometer.GetDefault();

你也可以呼叫 FromIdAsync,從 DeviceInformation.Id 建立一個 Accelerometer 物件。 欲了解更多資訊,請參閱 列舉裝置

若未偵測到加速度計感測器,狀態訊息會更新以通知使用者。

設定報告間隔

報告間隔由頁面的建構子設定。 此程式碼會取得裝置所支援的最小間隔,並與請求的 16 毫秒間隔(約 60 Hz 更新率)比較。 若最小支援區間大於請求區間,程式碼會將該值設為最小值。 否則,它會將值設定為所要求的區間。

uint minReportInterval = accelerometer.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
accelerometer.ReportInterval = reportInterval;

讀取感測器資料

新的加速度計資料會被擷取在 ReadingChanged 事件處理程序中。 每當感測器驅動程式從感測器接收到新資料時,就會利用這個事件將數值傳給你的應用程式。 在此範例中,這些新值會寫入對應頁面的 XAML 文字區塊。

accelerometer.ReadingChanged += Accelerometer_ReadingChanged;
// ...

private void Accelerometer_ReadingChanged(Accelerometer sender, AccelerometerReadingChangedEventArgs args)
{
    DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
    {
        AccelerometerReading reading = args.Reading;
        txtXAxis.Text = String.Format("{0,5:0.00}", reading.AccelerationX);
        txtYAxis.Text = String.Format("{0,5:0.00}", reading.AccelerationY);
        txtZAxis.Text = String.Format("{0,5:0.00}", reading.AccelerationZ);
    });
}

你也可以把 Shaken 事件當作另一個輸入來源。 對 Shaken 事件的支援取決於硬體與驅動程式是否提供支援。 實際上,支援此 Shaken 事件的加速度計非常少。