Utilize o acelerómetro

Aprenda a usar o acelerómetro para responder ao movimento do utilizador.

Este exemplo cria uma aplicação simples que depende do acelerómetro como dispositivo de entrada. Pode usar o acelerómetro para responder quando um utilizador move o dispositivo. Uma aplicação baseada num acelerómetro normalmente usa apenas um ou dois eixos para a entrada.

Note

Este artigo foca-se em código que demonstra como usar um acelerómetro. Para uma visão geral do sensor do acelerómetro, veja Sensores: Acelerómetro.

Pré-requisitos

Deves estar familiarizado com o sensor do acelerómetro e as suas utilizações. Ver sensores: Acelerómetro.

O dispositivo que está a usar deve suportar um acelerómetro.

Código de exemplo

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>

Quando a aplicação corre, pode alterar os valores do acelerómetro movendo o dispositivo.

O exemplo anterior demonstra o código essencial que precisa de escrever para integrar a entrada do acelerómetro na sua aplicação.

Liga-te ao sensor

Chame o método GetDefault para estabelecer uma ligação com o acelerómetro padrão.

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

Também pode chamar FromIdAsync para criar um objeto Accelerometer a partir de um valor DeviceInformation.Id. Para mais informações, consulte Enumerar dispositivos.

Se não for detetado um sensor de acelerómetro, a mensagem de estado é atualizada para informar o utilizador.

Definir o intervalo de relatório

O intervalo de relatório é definido dentro do construtor da página. Este código recupera o intervalo mínimo suportado pelo dispositivo e compara-o com um intervalo solicitado de 16 milissegundos (que aproxima uma taxa de atualização de 60 Hz). Se o intervalo mínimo suportado for maior do que o intervalo solicitado, o código define o valor para o mínimo. Caso contrário, define o valor para o intervalo solicitado.

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

Ler dados dos sensores

Os novos dados do acelerómetro são capturados no processador do evento ReadingChanged. Cada vez que o driver do sensor recebe novos dados do sensor, ele transmite os valores para a sua aplicação através deste evento. Neste exemplo, estes novos valores são escritos nos blocos de texto encontrados no XAML da página correspondente.

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

Também podes usar o evento Shaken como outra fonte de entrada. O suporte ao Shaken evento depende do suporte ao hardware e ao driver. Na prática, muito poucos acelerómetros suportam o evento Shaken.