Emoticons – Windows Phone

Olá pessoal, tudo bom?

Nesse post apenas compartilho uma dica que também foi publicada no site WinPhoneBrasil. Quando você envia mensagens através do seu Windows Phone o teclado virtual apresenta algumas opções de emoticons, porém, há várias outras imagens que não foram adicionadas ao teclado, mas que também podem ser enviadas junto à mensagem. Veja a imagem abaixo:

Windows Phone Emoticons – Fonte: http://winphonebrasil.com.br/11893/dica-emoticons-nativos-do-windows-phone/wpemoticons-4

Clique AQUI para aumentar o tamanho da imagem.

 

Grande abraço e fica a dica!
Eduardo Henrique Rizo

Post relacionado:

Curso Windows Phone – Tópicos

Curso Windows Phone – Acelerometro (Accelerometer)

Olá pessoal, tudo bom?

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

Post relacionado:

Curso Windows Phone – Tópicos

Curso Windows Phone – Execução de rotinas em background (BackgroundWorker / Multithread – WP7)

Olá pessoal, tudo bom?

Em várias ocasiões nos deparamos com situações onde mais de uma coisa deve acontecer no software ao mesmo tempo (multithreading), seja execução de processos diferentes e/ou atualização de componentes de tela enquanto algum processo ainda está em execução.

Para resolução de situações parecidas com essa, uma das soluções pertinentes, seria a criação de rotinas que possam ser executadas em segundo plano, “liberando” assim outras rotinas de software para que também possam ser executadas.

A execução de rotinas em segundo plano é controlada por uma classe chamada BackgroundWorker. Vejam abaixo um exemplo de como utilizá-la:

1) Logo abaixo da declaração da classe da página onde o multithreading será necessário, instancie um objeto da classe BackgroundWorker

...
public partial class Toggle_Progress : PhoneApplicationPage
{
   private BackgroundWorker bw = new BackgroundWorker();
   ...
   ...
}

2) No construtor da classe, indique características e métodos que deverão ser tratados para o objeto da classe BackgroundWorker:

...
public Toggle_Progress()
{
   InitializeComponent();
   //Indica que você gostaria de reportar o progresso da execução da rotina de segundo plano
   bw.WorkerReportsProgress = true;
   //Indica que a rotina de segundo plano poderá ser cancelada
   bw.WorkerSupportsCancellation = true;
   //Definição do método que irá executar a rotina em segundo plano
   bw.DoWork += new DoWorkEventHandler(bw_DoWork);
   //Definição do método que irá tratar da progressão do processo
   bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
   //Definição do método que será executado após a conclusão do processo em segundo plano
   bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}
...
...

3) No método bw_DoWork você deve então executar as rotinas que queira que aconteçam em segundo plano, veja um exemplo:

...
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
   BackgroundWorker worker = sender as BackgroundWorker;
   for (i = 1; i < 1000000000; i++)
   {
      if (worker.CancellationPending == true)
      {
         e.Cancel = true;
         break;
      }
      else
      {
      if (i % 1000 == 0)
         worker.ReportProgress((i/1000000000)*100); //Chamada ao método bw_ProgressChanged
      }
   }
}
...
...

4) O método bw_ProgressChanged você deve executar a ação que quiser para cada vez que o mesmo for acionado


private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
   txtContagem.Text = i.ToString();
}

5) Já no método bw_RunWorkerCompleted execute alguma ação que você queira logo após o encerramento do processo que estava em execução em segundo plano


private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
   progressBar.IsIndeterminate = false; //Por exemplo, finalize uma barra de progressão
   ...
   ...
}

Realizados todos os passos acima, basta agora invocar a criação do processo em segundo plano a partir do clique de um botão ou de alguma outra ação que esteja vinculada ao seu programa, por exemplo:


//Nesse exemplo simulo o clique em um elemento do tipo ToggleSwitch e então habilito uma barra de progressão que deve ficar ativa enquanto o processo em segundo plano não terminar.
private void tsProgressBar_Click(object sender, RoutedEventArgs e)
{
   if (tsProgressBar.IsChecked == true)
   {
      tsProgressBar.Content = "Desabilitar ProgressBar";
      progressBar.IsIndeterminate = true;
      if (bw.IsBusy != true)
         bw.RunWorkerAsync(); //Isso fará o método bw_DoWork ser executado
   }
   else
   {
      tsProgressBar.Content = "Habilitar ProgressBar";
      progressBar.IsIndeterminate = false;
      if (bw.WorkerSupportsCancellation == true)
         bw.CancelAsync(); //Isso finaliza a execução do método em segundo plano.
   }
}

Bem, espero que esse post possa ajudar.

Grande abraço,
Eduardo Henrique Rizo

Post relacionado:

Curso Windows Phone – Tópicos

Inventário de Hardware e Software: Instalação e configuração da ferramenta OCS Inventory

Olá pessoal, tudo bom?

Produzi um vídeo que demonstra como instalar e configurar a ferramenta para inventário de hardware e software OCS Inventory.

Vale ressaltar que essa é uma ferramenta free, ou seja, não há necessidade de aquisição de licenças para uso.

Um grande abraço a todos,

Eduardo Henrique Rizo

Post relacionado:

Instalação do OCS Inventory no Debian via apt-get

Curso Windows Phone – Aplicações com suporte a versões Trial

Olá pessoal, tudo bom?

Criei um vídeo (sem audio, mas legendado) que explica passo a passo uma técnica para incluir em seu aplicativo o suporte a versões Trial. Isso passa a ser importante quando você disponibiliza no Marketplace aplicações com custo para o usuário, sendo assim, ele poderá testar seu aplicativo antes de decidir pela compra do mesmo.

Grande abraço,
Eduardo Henrique Rizo

Post relacionado:

Curso Windows Phone – Tópicos

Curso Windows Phone – Como tratar o clique do botão Back do celular com Windows Phone

Olá pessoal, tudo bom?

Segue uma dica rápida sobre como tratar o clique do botão Back (voltar) de um aparelho celular com o sistema Windows Phone da Microsoft. Essa dica pode vir a ser importante em situações onde o desenvolvedor queira perguntar ao usuário, por exemplo, se ele realmente gostaria de sair da aplicação que está usando, ou quando você quiser personalizar a ação desse botão.

Veja o código C# que você deve adicionar em toda página da aplicação Windows Phone onde se queira utilizar esse recurso:

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
   if (MessageBox.Show("Sair do aplicativo?", "Logout", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
   {
      //Faça alguma coisa aqui...
      base.OnBackKeyPress(e);
   }
   else
      e.Cancel = true;
}

Grande abraço,
Eduardo Henrique Rizo

Post relacionado:

Curso Windows Phone – Tópicos

Processo de instalação do OpenNMS em um servidor Debian 6 (vídeo)

Logo OpenNMSOlá pessoal, tudo bom?

O vídeo disponibilizado neste post visa complementar o artigo “Instalação do OpenNMS no Debian – Passo a passo” que também está disponível neste Blog.

Um grande abraço,

Eduardo Henrique Rizo

Post relacionado:

Instalação do OpenNMS no Debian – Passo a passo

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Join 203 other followers