Clique e receba as novidades quentinhas no Telegram

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