Visão Geral dos Sensores no Windows Phone

16

Olá pessoal,

Desta vez, este tutorial fala sobre sensores no Windows Phone, o qual suporta vários para determinar, por exemplo, a orientação e movimento do aparelho. E o interessante é podermos atuar programaticamente nestes sensores, através das APIs disponíveis.

Cada um dos sensores da API é construída a partir classe básica SensorBase<TSensorReading> , seguindo um padrão nos dados capturados dos sensores. Importante lembrar que uma exceção no uso da API ocorre quando o aparelho estiver no modo [Lock Screen].

Portanto os 4 principais sensores são:

1 – Acelerômetro

Este sensor mede a força aplicada ao dispositivo em um momento do tempo. Estas forças podem ser usadas para determinar em qual direção o usuário está movimentando o dispositivo. O valor da aceleração é expresso em um vetor de três dimensões, representando as unidades gravitacionais do eixo X, Y e Z.

2 – Bússola

O sensor de Bússola, ou Magnetômetro, pode ser usado para determinar o ângulo na qual o dispositivo é girado, relativo ao polo magnético norte da Terra. Uma aplicação pode também usar informações Magnetometras básicas para detectar forças magnéticas ao redor do dispositivo.

Este tipo de sensor não é hoje obrigatório nos dispositivos a venda. Desta forma, tome cuidado ao criar uma aplicação que utiliza este recurso, verificando se o aparelho suporta tal recurso.

3 – Giroscópio

Este sensor é responsável por determinar a velocidade rotacional do dispositivo em cada eixo. Você pode usar os valores obtidos deste tipo de sensor para determinar a orientação do dispositivo no espaço em que se encontra. Note que este recurso mede a velocidade rotacional e não do ângulo.

Assim como o sensor de Bússula, este também não é obrigatório no hardware dos dispositivos à venda.

4 – Movimento Combinado

Existem limitações físicas que tornam difíceis de determinar os dados retornados  de uma orientação e movimento de um dispositivo Windows Phone. Por exemplo, ler informações do acelerômetro inclui a força da gravidade aplicada ao dispositivo em adição a força resultante do movimento do dispositivo. O sensor de giroscópio mede a velocidade rotacional, mas não a de posição, estando sujeita a desvios. Também existem cálculos geométricos complexos que são necessários para traduzir os dados básicos destes sensores dentro de uma orientação real do aparelho. A classe Motion suporta o cálculo do sensor em um nível mais baixo e permite às aplicações facilmente obter o comportamento do dispositivo (desvio, inclinação e rotação), a aceleração rotacional e a linear, ambas de acordo com a gravidade e movimento do usuário.

Pois bem, após estas definições notamos quão complexo sua aplicação pode se tornar!

Falando em aplicação, vamos então criar um exemplo de Acelerômetro, na qual criei um aplicativo do tipo “Game”, onde o usuário tenta acertar uma bolinha no buraco!

– Abra seu Visual Studio 2010 SP1 (ou Visual Studio 2010 Express for Windows Phone)

– Menu FILE->NEW->PROJECT-> Escolha [Visual C# – Silverlight for Windows Phone]

– Neste ponto, você deverá ter uma tela parecida com a seguinte:

– Após esta tela, aparecerá outra para confirmar a versão do Windows Phone OS; escolha [Windows Phone 7.1]

Como a aplicação vai usar dois arquivos do tipo .PNG, representando a [bolinha]e o [buraco], favor baixar estes arquivos através dos links abaixo:

Ball Png
Hole Png

Importante salvar estes arquivos com os nomes [ball.png] e [hole.png].

Após este processo, adicione os dois arquivos .PNG no projeto que estamos trabalhando.

– Como próximo passo, altere o conteúdo do arquivo [MainPage.xaml] para o proposto abaixo:

<phone:PhoneApplicationPagex:Class=”PhoneApp1.MainPage”xmlns=”https://schemas.microsoft.com/winfx/2006/xaml/presentation”xmlns:x=”https://schemas.microsoft.com/winfx/2006/xaml”xmlns:phone=”clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone”xmlns:shell=”clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone”xmlns:d=”https://schemas.microsoft.com/expression/blend/2008″xmlns:mc=”https://schemas.openxmlformats.org/markup-compatibility/2006″

mc:Ignorable=”d” d:DesignWidth=”480″ d:DesignHeight=”768″

FontFamily=”{StaticResource PhoneFontFamilyNormal}”

FontSize=”{StaticResource PhoneFontSizeNormal}”

Foreground=”{StaticResource PhoneForegroundBrush}”

SupportedOrientations=”Portrait” Orientation=”Portrait”

shell:SystemTray.IsVisible=”True”>

 

<!–LayoutRoot is the root grid where all page content is   placed–>

<Grid x:Name=”LayoutRoot” Background=”White”>

<Grid.RowDefinitions>

<RowDefinition Height=”Auto”/>

<RowDefinition Height=”*”/>

</Grid.RowDefinitions>

 

<!–TitlePanel contains the name of the application and page   title–>

<StackPanel x:Name=”TitlePanel” Grid.Row=”0″ Margin=”12,17,0,28″>

<TextBlock x:Name=”ApplicationTitle” Text=”MY APPLICATION” Style=”{StaticResource PhoneTextNormalStyle}”/>

</StackPanel>

 

<!–ContentPanel – place additional content here–>

<Canvas>

<Rectangle

Name=”imgHole”

Canvas.Left=”200″

Canvas.Top=”400″

Width=”100″

Height=”100″

Opacity=”1″>

<Rectangle.Fill>

<ImageBrush ImageSource=”hole.png” />

</Rectangle.Fill>

</Rectangle>

 

<Ellipse

Name=”ball”

Width=”50″

Height=”50″>

<Ellipse.Fill>

<ImageBrush ImageSource=”ball.png” />

</Ellipse.Fill>

</Ellipse>

 

</Canvas>

 

<Button Content=”Start Acc”

Height=”72″

Name=”button1″

Width=”160″

Click=”button1_Click”

Margin=”150,6,170,618″

Grid.Row=”1″ Foreground=”Black” BorderBrush=”Black” />

</Grid>

 

</phone:PhoneApplicationPage>

 

Rodando a aplicação neste momento sua tela deverá ter o layout abaixo:

Precisamos agora adicionar a referência da API de sensor do Windows Phone no nosso projeto. Adicione então as referências para os arquivos:

– Microsoft.Devices.Sensors.dll

– Microsoft.Xna.Framework.dll

Você deverá ter as referências, conforme a imagem abaixo:

Falta agora criarmos o código C# para manipularmos o sensor de acelerômetro. Abra seu arquivo [MainPage.xaml.cs] e SUBSTITUA TODO CÓDIGO pelo proposto abaixo:

using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using Microsoft.Phone.Controls;

using Microsoft.Devices.Sensors;

using Microsoft.Xna.Framework;

 

namespace PhoneApp1

{

public partial class MainPage : PhoneApplicationPage

{

double halfScreenWidth;

const double radius = 12;

Accelerometer acc = new Accelerometer();

bool useSensorReading = true;

 

// Constructor

public MainPage()

{

InitializeComponent();

InitializeAccelerometer();

}

 

private void InitializeAccelerometer()

{

useSensorReading = true;

halfScreenWidth = Application.Current.Host.Content.ActualWidth / 2;

 

acc.CurrentValueChanged +=

new EventHandler<SensorReadingEventArgs<AccelerometerReading>>(acc_CurrentValueChanged);

acc.Start();

}

 

void acc_CurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e)

{

Dispatcher.BeginInvoke(() =>

{

if (!useSensorReading) return;

 

double xPos = halfScreenWidth * (e.SensorReading.Acceleration.X + 1);

double yPos = halfScreenWidth * (e.SensorReading.Acceleration.Z + 1);

Canvas.SetLeft(ball, xPos);

Canvas.SetTop(ball, yPos);

 

double imgHoleLeft = Canvas.GetLeft(imgHole);

double imgHoleTop = Canvas.GetTop(imgHole);

double imgHoleLeftMax = imgHoleLeft + (imgHole.Height / 2);

double imgHoleTopMax = imgHoleTop + (imgHole.Width / 2);

 

if ( (xPos >= imgHoleLeft && xPos <= imgHoleLeftMax) &&

(yPos >= imgHoleTop && yPos <= imgHoleTopMax))

{

MessageBox.Show(“Acertou o   buraco!!”);

useSensorReading = false;

StopAccelerometer();

}

 

});

}

 

private void StopAccelerometer()

{

acc.Stop();

Canvas.SetLeft(ball, 200);

Canvas.SetTop(ball, 200);

}

 

private void button1_Click(object sender, RoutedEventArgs e)

{

InitializeAccelerometer();

}

 

}

}

 

Analise o código acima e note o uso da classe [Accelerometer] na qual, através do método [CurrentValueChanged], podemos capturar os eixos X e Y para mudar dinamicamente a imagem da bolinha!

Fonte: Sensors Overview for Windows Phone

É isto aí! A cada novo artigo, exploraremos mais os poderosos recursos deste importante Sistema Operacional!

Abraço a todos!!

Gilberto Tezini

https://gtezini.blogspot.com

 

Share.

About Author

  • Ewerton

    A bolinha ficou tremendo demais fora que não dá para levar a bolinha até em baixo na tela

  • eduardo

    Eu li que o lumia 800 não tem giroscópio, mas já vi vários videos como este por exemplo ( http://www.youtube.com/watch?v=ltBrueMUJPU ) que utilizam o sensor de movimento.. esse sensor não seria o giroscópio?

    • Andriw

      O Lumia 800 possuo sim Giroscopio. Quando vc entra no diagnóstico vc testa ele.

      • Andriw

        corrigindo, possui só aceleromentro, também confundi.

    • Importante notar a diferença principal entre os dois:
      >> Acelerômetro – Mede o [ângulo] do dispositivo em relação ao chão.
      >> Giroscópio – Mede a [velocidade rotacional] quando o dispositivo estiver em movimento.

      Inclusive os dois podem ser usados em conjunto, resultando em uma “captura” de movimentos muito mais precisa.

      Levando em consideração que no vídeo o aparelho não gira, não sacode, enfim, não ocorrem movimentos rápidos e brutos, o Game apresentado pode ser totalmente desenvolvido usando APENAS o recurso de ACELERÔMETRO!

      []s

      • eduardo

        entendi… obrigado!!! estava confundindo acelerômetro com giroscópio

  • paulo

    Tenho um omnia w. Como desativar o acelerômetro? Quero travar a tela na horizontal.

    • Paulo,
      Por enquanto (espero!) somente é possível realizar isto via desenvolvimento.
      Segue sugestão de uma aplicação gratuita que faz isto: http://windowsphonehacker.com/articles/orientation_lock_release-02-06-12

    • Rodrigo Moreira

      Se você for no hub de telefone e escolher fazer uma ligação (digitando os números) e digitar ##634#, aparece algum menu pra vc?
      Em alguns WP isso funciona e tem várias opções.

      • ANDERSON

        Pra que serve esse menu, entrei nele dai direciona para outro menu, eu acho…kkk, não entendi depois…
        Valeu pelas dicas muito o bom artigo, da uma boa ideia de como funcionam as aplicações valeu.

  • wr

    PARA QUEM AINDA NAO SABI…..!! Nokia Câmera Extra finalmente chega na Marketplace do Brasil

    • Andre Luiz

      Nao sabia, ja to baixando
      valeu (=

  • Andriw

    Muito bom o artigo. Parabéns.

  • Breno

    Ótimo tutorial!

    Continuem com essa iniciativa de dicas de desenvolvimento 🙂