Compartilhar

Olá galera do UbuntuBlogBr ! Vamos juntos em mais um tutorial. Dessa vez tratando de uma característica bem interessante dos aparelhos com Android: o sensor de gravidade. Você já deve ter jogado algum jogo que usa esse recurso. É muito legal.
Esse tutorial mostra o básico de como lidar com o acelerômetro (programaticamente e claro)
Vamos começar um novo project. ‘Clicar’ em ‘New App – Eclipse/Android SDK/Java/Xml’. Vamos dar o nome de ‘TutorialAcelerometro’ para o ‘Project’ e o ‘package’ vai ser tutorial.acelerometro.

Criando App

Tutorial Desenvolvimento Android

A ide automaticamente cria alguns arquivos úteis e inúteis. Pra esse tutorial vamos apenas editar o ‘MainActivity.java’. Os outros arquivos ficam como estão (alguns úteis, alguns inúteis). Podemos compilar/executar para ver um ‘Hello, world’.

Instalando

Hello World
Os arquivos que são inúteis nós não vamos limpar… Mas faço questão de eliminar do meu código-fonte qualquer comando inútil!
Então vamos começar eliminando alguns import…

Deletar:
import android.widget.*;
import android.view.*;

Mudar de ‘import android.app.*;’ para ‘import android.app.Activity;’

Mudar de ‘import android.os.*;’ para ‘import android.os.Bundle;’

Apagar o ‘comment’ que ‘apresenta’ o método ‘onCreate’… E depois deixar na mesma linha o comando ‘@Override’ e a assinatura do ‘onCreate’.
Fica assim:

MainActivity.java

Temos 13 linhas de código e ainda temos apenas o ‘Hello world’. Vamos começar a escrever código!

Em um outro tutorial eu expliquei como, e porquê, criar nossa ‘View’. Nesse tutorial vamos criar nossa ‘View’ novamente:

Dentro da classe ‘MainActivity’ vamos criar uma classe: ‘class CustomView extends View’
Essa classe nos permite desenhar na tela programaticamente.

Isso gera alguns erros porque falta importar algumas bibliotecas:

No outro artigo eu expliquei o Canvas, o Paint, o Color… Mas se mesmo assim houver qualquer dúvida, então deixe um comentário aí embaixo…

Assim que colocamos os ‘import’, já não dá mais erro… Mas pra funcionar ainda falta instanciar a classe que criamos:

E dentro do método onCreate vamos excluir a linha setContentView(R.layout.main); e vamos usar a classe que criamos…

Pronto, agora podemos compilar/executar/testar. Deve ser exibida uma tela escrito direita e esquerda. Aqui no tablet que eu estou usando, o texto ‘direita’ fica quase no canto da tela porque esse tablet aqui tem aproximadamente 800 pixels da largura. Se na sua tela o texto não estiver no canto, então altere o segundo parâmetro da primeira chamada da função: ‘c.drawText’. (Altere pra mais de 700 para o texto ir mais pra direita e altere para menos para o texto ir mais para esquerda)

Screenshot Acelerometro
Isso é a base para começarmos a poder lidar com o Acelerômetro.

Vamos criar um atributo ‘sensorlistener’ do tipo ‘SensorEventListener’ na classe ‘MainActivity’ (antes da ‘class CustomView’ e depois do ‘onCreate’)

Vamos precisar importar:
import android.hardware.SensorEventListener;

Ainda dá erro porque precisamos implementar dois métodos (que foram abstraídos na ‘classe-pai’ ‘SensorEventListener’)

Precisamos importar:
import android.hardware.Sensor;
import android.hardware.SensorEvent;

Pronto… Já não dá mais erro… Estamos construindo o esqueleto que nos permite usar o sensor de gravidade.

Vamos criar um atributo (uma variável) da classe ‘MainActivity’ chamado ‘x’. (float).
Esse ‘x’ vai ser alterado pelo acelerômetro. Quando o tablet/celular inclinar para a direita o ‘x’ será positivo e quando o tablet/celular inclinar para a esquerda o ‘x’ será negativo.
E dentro da ‘onSensorChanged’ vamos codificar:

O ‘invalidate’ serve pra chamar/executar o onDraw. Não sei por que não posso chamar diretamente onDraw… E não entendo porque escolheram o nome ‘invalidate’. Mas sei que quando chamamos ‘v.invalidate();’ o ‘onDraw’ é ‘executado’/’chamado’!

Vamos precisar ‘setar’ o ‘sensorlistener’ (dentro do onCreate):

E importar…
import android.hardware.SensorManager;

Pronto de novo! Agora dá pra usar o ‘drawText’ dentro da ‘onDraw’ para exibir o valor do ‘x’ e constatar que ele varia de acordo com a inclinação do aparelho!

Mas para o tutorial ficar mais ilustrativo vamos desenhar um quadradinho no centro da tela e vamos fazer esse quadradinho se mover de acordo com o ‘x’. Vamos criar uma variável(atributo) ‘int qx’ que armazena a posição do quadrado. Essa posição será alterada pela ‘onSensorChanged’…
int qx=350;
Usei 350 porque aqui no meu tablet 350 pixels fica mais ou menos no centro da tela… Se você precisar ajustar, ajuste… Talvez outro dia eu fale sobre como ‘pegar’ o tamanho da tela…
O código para desenhar o quadrado no ponto qx é:
c.drawRect(qx,240,qx+10,250,p);
Temos o quadrado no meio da tela… Vamos fazer ele se mover ! Antes do ‘c.invalidate()’ cabe o código:

Isso resolve !
Já temos um ponto se movendo na tela de acordo com a inclinação do tablet/celular !!!

Mas o ponto se move demais… Não para quieto…
Aprendi um ‘truque’ para resolver isso e vou compartilhar aqui: Vamos criar uma variável/atributo ‘ultimox’.

O código ‘completo’ fica:

Esse tutorial não encerra o assunto, mas mostra um caminho. Qualquer dúvida me envie um e-mail: [email protected]

Avalie esse Post