Utiliser l’accéléromètre

Découvrez comment utiliser l’accéléromètre pour répondre au mouvement de l’utilisateur.

Cet exemple crée une application simple qui s’appuie sur un accéléromètre en tant qu’appareil d’entrée. Vous pouvez utiliser l’accéléromètre pour répondre lorsqu’un utilisateur déplace l’appareil. Une application basée sur un accéléromètre utilise généralement un ou deux axes pour l’entrée.

Note

Cet article se concentre sur le code qui montre comment utiliser un accéléromètre. Pour obtenir une vue d’ensemble du capteur d’accéléromètre, consultez Capteurs : Accéléromètre.

Prerequisites

Vous devez être familiarisé avec le capteur d’accéléromètre et ses utilisations. Voir Capteurs : Accéléromètre.

L’appareil que vous utilisez doit prendre en charge un accéléromètre.

Exemple de code

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>

Lorsque l’application s’exécute, vous pouvez modifier les valeurs de l’accéléromètre en déplaçant l’appareil.

L’exemple précédent illustre le code essentiel que vous devez écrire pour intégrer l’entrée accéléromètre dans votre application.

Se connecter au capteur

Appelez la méthode GetDefault pour établir une connexion avec l’accéléromètre par défaut.

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

Vous pouvez également appeler FromIdAsync pour créer une valeur Accelerometer à partir d’une valeur DeviceInformation.Id. Pour plus d’informations, consultez Énumérer les appareils.

Si aucun capteur d’accéléromètre n’est détecté, le message d’état est mis à jour pour informer l’utilisateur.

Définir l’intervalle de rapport

L’intervalle de rapport est défini dans le constructeur de la page. Ce code récupère l’intervalle minimal pris en charge par l’appareil et le compare à un intervalle demandé de 16 millisecondes (ce qui correspond approximativement à un taux d’actualisation de 60-Hz). Si l’intervalle minimal pris en charge est supérieur à l’intervalle demandé, le code fixe la valeur à la valeur minimale. Sinon, elle définit la valeur à l’intervalle demandé.

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

Lire les données du capteur

Les nouvelles données d’accéléromètre sont capturées dans le gestionnaire d’événements ReadingChanged . Chaque fois que le pilote de capteur reçoit de nouvelles données du capteur, il transmet les valeurs à votre application à l’aide de cet événement. Pour cet exemple, ces nouvelles valeurs sont écrites dans les blocs de texte trouvés dans le code XAML pour la page correspondante.

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

Vous pouvez également utiliser l’événement Shaken comme autre source d’entrée. La prise en charge de l’événement dépend du matériel et de la Shaken prise en charge des pilotes. En pratique, très peu d’accéléromètres prennent en charge l’événement Shaken .