Usar o acelerômetro
Saiba como usar o acelerômetro para responder ao movimento do usuário.
APIs importantes
Pré-requisitos
Você deve estar familiarizado com XAML (Extensible Application Markup Language), Microsoft Visual C# e eventos.
O dispositivo ou emulador que você está usando deve dar suporte a um acelerômetro.
Crie um aplicativo de acelerômetro simples
Um aplicativo de jogo simples depende de um único sensor, o acelerômetro, como um dispositivo de entrada. Esses aplicativos normalmente usam apenas um ou dois eixos para entrada; Mas eles também podem usar o evento shake como outra fonte de entrada.
Observação
Para uma implementação mais completa, consulte o exemplo de acelerômetro.
Instruções
Crie um novo projeto, escolhendo um Aplicativo em Branco (Universal do Windows) nos modelos de projeto do Visual C# .
Abra o arquivo MainPage.xaml.cs do seu projeto e substitua o código existente pelo seguinte.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
// Required to support the core dispatcher and the accelerometer
using Windows.UI.Core;
using Windows.Devices.Sensors;
namespace App1
{
public sealed partial class MainPage : Page
{
// Sensor and dispatcher variables
private Accelerometer _accelerometer;
// This event handler writes the current accelerometer reading to
// the three acceleration text blocks on the app' s main page.
private async void ReadingChanged(object sender, AccelerometerReadingChangedEventArgs e)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
AccelerometerReading reading = e.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);
});
}
public MainPage()
{
this.InitializeComponent();
_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 += new TypedEventHandler<Accelerometer, AccelerometerReadingChangedEventArgs>(ReadingChanged);
}
}
}
}
Você precisará renomear o namespace no snippet anterior com o nome que você deu ao seu projeto. Por exemplo, se você criou um projeto chamado AccelerometerCS, substitua namespace App1
por namespace AccelerometerCS
.
- Abra o arquivo MainPage.xaml e substitua o conteúdo original pelo XML a seguir.
<Page
x:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid x:Name="LayoutRoot" Background="#FF0C0C0C">
<TextBlock HorizontalAlignment="Left" Height="25" Margin="8,20,0,0" TextWrapping="Wrap" Text="X-axis:" VerticalAlignment="Top" Width="62" Foreground="#FFEDE6E6"/>
<TextBlock HorizontalAlignment="Left" Height="27" Margin="8,49,0,0" TextWrapping="Wrap" Text="Y-axis:" VerticalAlignment="Top" Width="62" Foreground="#FFF5F2F2"/>
<TextBlock HorizontalAlignment="Left" Height="23" Margin="8,80,0,0" TextWrapping="Wrap" Text="Z-axis:" VerticalAlignment="Top" Width="62" Foreground="#FFF6F0F0"/>
<TextBlock x:Name="txtXAxis" HorizontalAlignment="Left" Height="15" Margin="70,16,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="61" Foreground="#FFF2F2F2"/>
<TextBlock x:Name="txtYAxis" HorizontalAlignment="Left" Height="15" Margin="70,49,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="53" Foreground="#FFF2EEEE"/>
<TextBlock x:Name="txtZAxis" HorizontalAlignment="Left" Height="15" Margin="70,80,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="53" Foreground="#FFFFF8F8"/>
</Grid>
</Page>
Você precisará substituir a primeira parte do nome da classe no snippet anterior pelo namespace do seu aplicativo. Por exemplo, se você criou um projeto chamado AccelerometerCS, substitua x:Class="App1.MainPage"
por x:Class="AccelerometerCS.MainPage"
. Você também deve substituir xmlns:local="using:App1"
por xmlns:local="using:AccelerometerCS"
.
- Pressione F5 ou selecione Depurar>Iniciar Depuração para compilar, implantar e executar o aplicativo.
Depois que o aplicativo estiver em execução, você poderá alterar os valores do acelerômetro movendo o dispositivo ou usando as ferramentas do emulador.
- Pare o aplicativo retornando ao Visual Studio e pressionando Shift+F5 ou selecione Depurar>Parar Depuração para interromper o aplicativo.
Explicação
O exemplo anterior demonstra o pouco código que você precisará escrever para integrar a entrada do acelerômetro em seu aplicativo.
O aplicativo estabelece uma conexão com o acelerômetro padrão no método MainPage .
_accelerometer = Accelerometer.GetDefault();
O aplicativo estabelece o intervalo de relatório dentro do método MainPage . Esse código recupera o intervalo mínimo com suporte do dispositivo e o compara a um intervalo solicitado de 16 milissegundos (que se aproxima de uma taxa de atualização de 60 Hz). Se o intervalo mínimo com suporte for maior que o intervalo solicitado, o código definirá o valor como o mínimo. Caso contrário, ele define o valor para o intervalo solicitado.
uint minReportInterval = _accelerometer.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
_accelerometer.ReportInterval = reportInterval;
Os novos dados do acelerômetro são capturados no método ReadingChanged . Cada vez que o driver do sensor recebe novos dados do sensor, ele passa os valores para seu aplicativo usando esse manipulador de eventos. O aplicativo registra esse manipulador de eventos na linha a seguir.
_accelerometer.ReadingChanged += new TypedEventHandler<Accelerometer,
AccelerometerReadingChangedEventArgs>(ReadingChanged);
Esses novos valores são gravados nos TextBlocks encontrados no XAML do projeto.
<TextBlock x:Name="txtXAxis" HorizontalAlignment="Left" Height="15" Margin="70,16,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="61" Foreground="#FFF2F2F2"/>
<TextBlock x:Name="txtYAxis" HorizontalAlignment="Left" Height="15" Margin="70,49,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="53" Foreground="#FFF2EEEE"/>
<TextBlock x:Name="txtZAxis" HorizontalAlignment="Left" Height="15" Margin="70,80,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="53" Foreground="#FFFFF8F8"/>