Nesse post faço uma pequena demonstração sobre como utilizar o acelerometro do Windows Phone. No exemplo, capturamos as informações relacionadas ao plano XYZ e aproveitamos também para montar uma aplicação que simula o nível e prumo de um determinado objeto.
O valor do acelerometro é disponibilizado em um vetor tridimensional que representa os componentes de aceleração nos eixos X, Y, e Z em unidades gravitacionais.
O sensor do acelerometro irá detectar a força da gravidade, juntamente com quaisquer forças resultantes do movimento do telefone. A classe MotionReading utiliza sensores de dispositivos múltiplos para separar o vetor gravidade da aceleração do dispositivo e permite a você facilmente determinar a atitude atual (yaw, pitch e roll) do dispositivo.
Para capturar as informações do acelerometro é necessário utilizar a classe Accelerometer, onde se obtem, por exemplo, as coordenadas XYZ de acordo com a posição que o usuário estiver segurando o telefone.
Para o exemplo em questão, você precisará utilizar os namespaces Microsoft.Devices.Sensors e Microsoft.Xna.Framework.
Abaixo, demonstro o código Silverlight para composição dos elementos da tela:
... <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <StackPanel> <TextBlock x:Name="CoordX" Foreground="Red" HorizontalAlignment="Center" Text="{Binding ValorXProperty, StringFormat='X: {0}'}" FontSize="30" FontWeight="Bold" /> <TextBlock x:Name="CoordY" Foreground="Green" HorizontalAlignment="Center" Text="{Binding ValorY, StringFormat='Y: {0}'}" FontSize="30" FontWeight="Bold" /> <TextBlock x:Name="CoordZ" Foreground="Blue" HorizontalAlignment="Center" Text="{Binding ValorZ, StringFormat='Z: {0}'}" FontSize="30" FontWeight="Bold" /> </StackPanel> <Line x:Name="LinhaX" X1="220" Y1="400" X2="320" Y2="400" Stroke="Red" StrokeThickness="5" /> <Line x:Name="LinhaY" X1="220" Y1="400" X2="220" Y2="310" Stroke="Green" StrokeThickness="5" /> <Line x:Name="LinhaZ" X1="220" Y1="400" X2="170" Y2="450" Stroke="Blue" StrokeThickness="5" /> <Rectangle x:Name="Regua" Margin="0,480,0,0" Width="450" Height="80" Stroke="#FFC0C0C0" RadiusX="40" RadiusY="40"/> <Line Margin="0,480,0,0" Stroke="#FFC0C0C0" X1="0" Y1="0" X2="0" Y2="120" HorizontalAlignment="Center" /> <Ellipse x:Name="ball" Width="70" Height="70" Fill="Red" Margin="0,480,0,0"> <Ellipse.RenderTransform> <TranslateTransform x:Name="BallTransform"/> </Ellipse.RenderTransform> </Ellipse> </Grid> ...
Declaração do objeto da classe Accelerometer, inicialização e definição dos métodos para tratamento dos movimentos:
... Accelerometer acelerometroOBJ = null; // Constructor public MainPage() { InitializeComponent(); if (Accelerometer.IsSupported) { acelerometroOBJ = new Accelerometer { TimeBetweenUpdates = TimeSpan.FromMilliseconds(10) }; acelerometroOBJ.CurrentValueChanged += acelerometro_CurrentValueChanged; acelerometroOBJ.ReadingChanged += new EventHandler(acelerometroOBJ_ReadingChanged); acelerometroOBJ.Start(); } else MessageBox.Show("Desculpe, mas seu dispositivo não oferece suporte para o acelerometro"); } ...
Nesse método chamamos outro método via Dispatcher que receberá as informações X, Y e Z (gravitacional)
... void acelerometro_CurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e) { Dispatcher.BeginInvoke(() => UpdateUI(e.SensorReading)); } ...
Nesse chamamos um método para trabalhar com as coordenadas X e Y
... void acelerometroOBJ_ReadingChanged(object sender, AccelerometerReadingEventArgs e) { double x = e.X; x = x > 0.5 ? 0.5 : x; x = x < -0.5 ? -0.5 : x; Dispatcher.BeginInvoke(() => UpdateBall(x)); } ...
Tratando o movimento para as linhas do plano X, Y e Z
... private void UpdateUI(AccelerometerReading accelerometerReading) { Vector3 aceleracao = accelerometerReading.Acceleration; CoordX.Text = "X: " + aceleracao.X.ToString("0.000"); CoordY.Text = "Y: " + aceleracao.Y.ToString("0.000"); CoordZ.Text = "Z: " + aceleracao.Z.ToString("0.000"); LinhaX.X2 = LinhaX.X1 + aceleracao.X * 200; LinhaY.Y2 = LinhaY.Y1 + aceleracao.Y * 200; LinhaZ.X2 = LinhaZ.X1 + aceleracao.Z * 100; LinhaZ.Y2 = LinhaZ.Y1 + aceleracao.Z * 100; } ...
Tratando o movimento para o exemplo do prumo e nível (X e Y)
... private void UpdateBall(double x) { BallTransform.X = x * (Regua.Width - ball.Width); } ...
Para início é isso, daqui para frente é só usar a imaginação.
Grande abraço,
Eduardo Henrique Rizo
[twitter-follow screen_name=’eduardorizo’ show_count=’yes’]
Pingback: Curso Windows Phone – Tópicos « Blog do Eduardo H. Rizo
Parabéns , seu post me ajudou muito