Android - Parte 7

42
Android Programação para Dispositivos Móveis Parte 7 – Gráficos e outros recursos Prof. Manuel F. Paradela Ledón, 2011. Universidade Cruzeiro do Sul

Transcript of Android - Parte 7

Page 1: Android - Parte 7

Android

Programaccedilatildeo para Dispositivos Moacuteveis

Parte 7 ndash Graacuteficos e outros recursos

Prof Manuel F Paradela Ledoacuten 2011

Universidade Cruzeiro do Sul

Graacuteficos e outros recursos

Neste material introduziremos com exemplos a utilizaccedilatildeo de alguns recursos interessantes do Android

Elaborar graacuteficos desenhar mostrar figuras Uma tela de um programa Android poderaacute mostrar simultaneamente textos figuras bototildees desenhos etc (tambeacutem poderiacuteamos utilizar uma tela graacutefica uacutenica) Por exemplo uma tela poderia ter dois bototildees para accedilotildees duas caixas para entrada de texto e uma aacuterea para mostrar um graacutefico

Sensores Talvez uma das caracteriacutesticas que diferenciam PCs e notebooks tradicionais de um smartphone atual seja a utilizaccedilatildeo de sensores (de orientaccedilatildeo de giro de aceleraccedilatildeo temperatura luz humidade etc) Programas Android que utilizem estes recursos poderatildeo ser mais interativos e motivadores

Outras miacutedias Android permite mostrar viacutedeos ou tocar sons Efeitos sonoros e muacutesicas de fundo satildeo tambeacutem elementos importantes

Telas graacuteficas Desenhar e mostrar figuras

Exemplo 1

Neste primeiro exemplo mostramos um programa com uma uacutenica tela graacutefica (classe derivada de View)

Como natildeo existiratildeo outros elementos na tela natildeo precisaremos utilizar um arquivo xml de layout

Natildeo carregaremos figuras prontas apenas desenharemos na tela

Atenderemos os eventos onClick e onLongClick

A classe ActGraficos derivada de Activity

package comtestegraficosimples

import androidappActivity

import androidosBundle

import androidviewView

import androidwidget

public class ActGraficos extends Activity

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

final MinhaView mv = new MinhaView(this) classe derivada de View

setContentView(mv)

mvsetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(ActGraficosthis

nLegal Evento click normal atendidon ToastLENGTH_LONG)show()

mvsetTipoPaint(1)

)

Observe que o visual estaraacute definido por uma View (ver nos proacuteximos slides)

A classe MinhaView derivada de View - parte 1

package comtestegraficosimples

import androidcontentContext

import androidgraphicsCanvas

import androidgraphicsPaint

import androidgraphicsdrawableshapesOvalShape

import androidgraphicsdrawableshapesRectShape

import androidviewView

import androidwidgetToast

class MinhaView extends View

private int tipopaint=1

public MinhaView(Context cx)

super(cx)

final Context viewContext = cx

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

setTipoPaint(2)

return true

)

public void setTipoPaint(int i)

tipopaint = i

invalidate() Importante este meacutetodo invalida a tela e provoca uma chamada ao meacutetodo onDraw

Alguns meacutetodos da classe Canvas (ldquotela para pintarrdquo) Fonte Classe Canvas (em httpdeveloperandroidcomreferenceandroidgraphicsCanvashtml)

int getHeight()

Returns the height of the current drawing layer

int getWidth()

Returns the width of the current drawing layer

void drawRect(float left float top float right float bottom Paint paint)

Draw the specified Rect using the specified paint

void drawText(String text float x float y Paint paint)

Draw the text with origin at (xy) using the specified paint

void drawPicture(Picture picture Rect dst)

Draw the picture stretched to fit into the dst rectangle

void drawPoint(float x float y Paint paint)

Helper for drawPoints() for drawing a single point

void drawPoints(float[] pts int offset int count Paint paint)

Draw a series of points

void drawLine(float startX float startY float stopX float stopY Paint paint)

Draw a line segment with the specified start and stop xy coordinates using the specified paint

void drawLines(float[] pts Paint paint)

void drawCircle(float cx float cy float radius Paint paint)

Draw the specified circle using the specified paint

void drawArc(RectF oval float startAngle float sweepAngle boolean useCenter Paint paint)

Draw the specified arc which will be scaled to fit inside the specified oval

A classe MinhaView derivada de View - parte 2

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas (natildeo o interior) do que seraacute pintado

switch (tipopaint)

case 1

Pintamos uma figura em forma de retacircngulo

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFFFFF00) retacircngulo amarelo

Obs setBounds(int left int top int right int bottom)

setColor os primeiros dois nuacutemeros satildeo o componente

alpha (a opacidade) FF seraacute 100 opaco Resumindo 0xAARRGGBB

fig1setBounds(003570)

fig1draw(c)

psetColor(0xFFFFFFFF) retacircngulo branco

cdrawRect(3575cgetWidth()-30 cgetHeight()-110p)

psetColor(0xFF0000FF) ciacuterculo azul

cdrawCircle(cgetWidth()2 cgetHeight()2 cgetHeight()4 p)

psetColor(0xFF00FF00) ciacuterculo verde

cdrawCircle(cgetWidth()2 cgetHeight()2 cgetHeight()8 p)

psetColor(0xFFFFFFFF) linha branca

cdrawLine(00 getWidth()()2 cgetHeight()2p)

A classe MinhaView derivada de View - parte 3

Pintamos uma figura em forma de oval

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

Ou resumindo seria ShapeDrawable fig2 = new ShapeDrawable(new OvalShape())

fig2getPaint()setColor(0x88FF0000) certa transparecircncia com 88

fig2setBounds(1010getWidth()2getHeight()2 + 20)

getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2draw(c)

psetColor(0xFFFFFFFF) para textos brancos

cdrawText(Observe a transparecircncia do oval vermelho 2 getHeight()-25 p)

cdrawText(Experimente touch e touch longo na tela 2 getHeight()-10 p)

break

case 2

cdrawText(Experimente agora touch simples na tela 2 getHeight()-10 p)

break natildeo pintamos nada neste caso

switch

meacutetodo onDraw

classe MinhaView

Exemplo 2

Neste segundo exemplo mostramos um programa Android com uma tela com diferentes elementos incluindo um objeto de uma classe derivada de View (veja na parte superior da figura)

Utilizaremos um arquivo mainxml para definir este layout

Observe que na tela temos dois objetos TextView dois Button um EditText e uma View

Atenderemos os eventos onClick e onLongClick

O layout da tela no arquivo mainxml 12

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical

androidlayout_width=fill_parent

androidlayout_height=fill_parent

androidgravity=center_horizontal gt

ltexemplosexemplograficos2MinhaView

androidid=+idminha_view

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_margin =3dp

androidlayout_weight=5 gt peso =gt quanto espaccedilo ocuparaacute esta view na tela

ltTextView

androidid=+iddigite_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Digite um valor de 1 a 5 gt

ltEditText

androidid=+idedita_text

androidlayout_width=58dp

androidlayout_height=40dp

androidgravity=center_horizontal

androidinputType=number

androidtextSize=16sp gt

O layout da tela no arquivo mainxml 22

ltButton

androidid=+idgraf_botao

androidlayout_width=115dp

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Graacutefico gt

ltTextView

androidid=+idinfo_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Experimente click e click longo nna aacuterea do graacutefico gt

ltButton

androidid=+idoutro_botao

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Outro botatildeo gt

ltLinearLayoutgt

A classe ActGraficos (extends Activity) - parte 1

package comtestegraficos

import androidappActivity

import androidosBundle

import androidviewView

import androidwidget

public class ActGraficos extends Activity

private MinhaView mView

private EditText editatipo

private Button botaooutrobotao

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

try

setContentView(Rlayoutmain)

mView = (MinhaView) findViewById(Ridminha_view) mViewsetFocusable(true) para que a View receba o foco em modo touch

editatipo = (EditText) findViewById(Ridedita_text)

grafbotao = (Button) findViewById(Ridgraf_botao)

outrobotao = (Button) findViewById(Ridoutro_botao)

catch(Exception e)

ToastmakeText(ActGraficosthis

nErron + egetMessage() + n ToastLENGTH_LONG)show()

A classe ActGraficos (extends Activity) - parte 2

grafbotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

int tipo = 1

try

tipo = IntegerparseInt(editatipogetText()toString())

catch(Exception ew1)

mViewsetTipoPaint(tipo)

mViewinvalidate()

)

outrobotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(ActGraficosthis

nLegal Evento click normal atendidon

ToastLENGTH_LONG)show()

)

A classe MinhaView (extends View) - parte 1

package comtestegraficos

import androidcontentContext

class MinhaView extends View private int tipopaint=3

public MinhaView(Context cx AttributeSet attrs)

super(cx attrs)

requestFocus()

final Context viewContext = cx

setOnClickListener(new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(viewContext

nnVamos invalidar a tela estado inicialnn ToastLENGTH_LONG)show()

tipopaint = 1

invalidate()

)

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

tipopaint = 2

invalidate()

return true

)

A classe MinhaView (extends View) - parte 2

public void setTipoPaintv02(int i)

tipopaint=i

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas

switch (tipopaint)

case 1

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFDDFF00)

Obs setBounds(int left int top int right int bottom)

fig1setBounds(003050)

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

fig2getPaint()setColor(0x44DD44FF)

Obs getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2setBounds(060getWidth()getHeight())

fig1draw(c)

fig2draw(c)

break

A classe MinhaView (extends View) - parte 3

case 2

psetColor(0xFFCCCCCC) cinza

cdrawRect(33getWidth()-6 getWidth() p)

psetColor(0xFF0000FF) azul

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()10 p)

psetColor(0xFFFF0000) vermelho

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()8 p)

psetColor(0xFF00FF00) verde

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()6 p)

psetColor(0xFFFFFF00) amarelo

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()4 p)

break case 3

break

case 4

break

case 5

break

switch

Exemplo 3

Neste terceiro exemplo mostramos um programa com dois elementos na tela um objeto de uma classe derivada de View e um TextView (texto na parte superior da tela)

Utilizaremos um arquivo mainxml para definir este layout

Neste programa quase natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onKeyDown e onTouchEvent para permitir o movimento do aviatildeo como resposta agrave accedilatildeo do usuaacuterio

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidlayout_width=fill_parent androidlayout_height=fill_parent

androidorientation=verticalgt

ltTextView

androidlayout_width=wrap_content androidlayout_height=wrap_content

androidtext=Viajando en avioacuten por el mundo

androidheight=40px

androidgravity=center gt

ltcompckaviaoAviaoView

androidid=+ididaviao

androidlayout_width=wrap_content androidlayout_height=wrap_content

gt

ltLinearLayoutgt

A classe AviaoView eacute derivada de View para trabalhar em modo graacutefico

Os arquivos utilizados neste exemplo

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 2: Android - Parte 7

Graacuteficos e outros recursos

Neste material introduziremos com exemplos a utilizaccedilatildeo de alguns recursos interessantes do Android

Elaborar graacuteficos desenhar mostrar figuras Uma tela de um programa Android poderaacute mostrar simultaneamente textos figuras bototildees desenhos etc (tambeacutem poderiacuteamos utilizar uma tela graacutefica uacutenica) Por exemplo uma tela poderia ter dois bototildees para accedilotildees duas caixas para entrada de texto e uma aacuterea para mostrar um graacutefico

Sensores Talvez uma das caracteriacutesticas que diferenciam PCs e notebooks tradicionais de um smartphone atual seja a utilizaccedilatildeo de sensores (de orientaccedilatildeo de giro de aceleraccedilatildeo temperatura luz humidade etc) Programas Android que utilizem estes recursos poderatildeo ser mais interativos e motivadores

Outras miacutedias Android permite mostrar viacutedeos ou tocar sons Efeitos sonoros e muacutesicas de fundo satildeo tambeacutem elementos importantes

Telas graacuteficas Desenhar e mostrar figuras

Exemplo 1

Neste primeiro exemplo mostramos um programa com uma uacutenica tela graacutefica (classe derivada de View)

Como natildeo existiratildeo outros elementos na tela natildeo precisaremos utilizar um arquivo xml de layout

Natildeo carregaremos figuras prontas apenas desenharemos na tela

Atenderemos os eventos onClick e onLongClick

A classe ActGraficos derivada de Activity

package comtestegraficosimples

import androidappActivity

import androidosBundle

import androidviewView

import androidwidget

public class ActGraficos extends Activity

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

final MinhaView mv = new MinhaView(this) classe derivada de View

setContentView(mv)

mvsetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(ActGraficosthis

nLegal Evento click normal atendidon ToastLENGTH_LONG)show()

mvsetTipoPaint(1)

)

Observe que o visual estaraacute definido por uma View (ver nos proacuteximos slides)

A classe MinhaView derivada de View - parte 1

package comtestegraficosimples

import androidcontentContext

import androidgraphicsCanvas

import androidgraphicsPaint

import androidgraphicsdrawableshapesOvalShape

import androidgraphicsdrawableshapesRectShape

import androidviewView

import androidwidgetToast

class MinhaView extends View

private int tipopaint=1

public MinhaView(Context cx)

super(cx)

final Context viewContext = cx

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

setTipoPaint(2)

return true

)

public void setTipoPaint(int i)

tipopaint = i

invalidate() Importante este meacutetodo invalida a tela e provoca uma chamada ao meacutetodo onDraw

Alguns meacutetodos da classe Canvas (ldquotela para pintarrdquo) Fonte Classe Canvas (em httpdeveloperandroidcomreferenceandroidgraphicsCanvashtml)

int getHeight()

Returns the height of the current drawing layer

int getWidth()

Returns the width of the current drawing layer

void drawRect(float left float top float right float bottom Paint paint)

Draw the specified Rect using the specified paint

void drawText(String text float x float y Paint paint)

Draw the text with origin at (xy) using the specified paint

void drawPicture(Picture picture Rect dst)

Draw the picture stretched to fit into the dst rectangle

void drawPoint(float x float y Paint paint)

Helper for drawPoints() for drawing a single point

void drawPoints(float[] pts int offset int count Paint paint)

Draw a series of points

void drawLine(float startX float startY float stopX float stopY Paint paint)

Draw a line segment with the specified start and stop xy coordinates using the specified paint

void drawLines(float[] pts Paint paint)

void drawCircle(float cx float cy float radius Paint paint)

Draw the specified circle using the specified paint

void drawArc(RectF oval float startAngle float sweepAngle boolean useCenter Paint paint)

Draw the specified arc which will be scaled to fit inside the specified oval

A classe MinhaView derivada de View - parte 2

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas (natildeo o interior) do que seraacute pintado

switch (tipopaint)

case 1

Pintamos uma figura em forma de retacircngulo

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFFFFF00) retacircngulo amarelo

Obs setBounds(int left int top int right int bottom)

setColor os primeiros dois nuacutemeros satildeo o componente

alpha (a opacidade) FF seraacute 100 opaco Resumindo 0xAARRGGBB

fig1setBounds(003570)

fig1draw(c)

psetColor(0xFFFFFFFF) retacircngulo branco

cdrawRect(3575cgetWidth()-30 cgetHeight()-110p)

psetColor(0xFF0000FF) ciacuterculo azul

cdrawCircle(cgetWidth()2 cgetHeight()2 cgetHeight()4 p)

psetColor(0xFF00FF00) ciacuterculo verde

cdrawCircle(cgetWidth()2 cgetHeight()2 cgetHeight()8 p)

psetColor(0xFFFFFFFF) linha branca

cdrawLine(00 getWidth()()2 cgetHeight()2p)

A classe MinhaView derivada de View - parte 3

Pintamos uma figura em forma de oval

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

Ou resumindo seria ShapeDrawable fig2 = new ShapeDrawable(new OvalShape())

fig2getPaint()setColor(0x88FF0000) certa transparecircncia com 88

fig2setBounds(1010getWidth()2getHeight()2 + 20)

getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2draw(c)

psetColor(0xFFFFFFFF) para textos brancos

cdrawText(Observe a transparecircncia do oval vermelho 2 getHeight()-25 p)

cdrawText(Experimente touch e touch longo na tela 2 getHeight()-10 p)

break

case 2

cdrawText(Experimente agora touch simples na tela 2 getHeight()-10 p)

break natildeo pintamos nada neste caso

switch

meacutetodo onDraw

classe MinhaView

Exemplo 2

Neste segundo exemplo mostramos um programa Android com uma tela com diferentes elementos incluindo um objeto de uma classe derivada de View (veja na parte superior da figura)

Utilizaremos um arquivo mainxml para definir este layout

Observe que na tela temos dois objetos TextView dois Button um EditText e uma View

Atenderemos os eventos onClick e onLongClick

O layout da tela no arquivo mainxml 12

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical

androidlayout_width=fill_parent

androidlayout_height=fill_parent

androidgravity=center_horizontal gt

ltexemplosexemplograficos2MinhaView

androidid=+idminha_view

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_margin =3dp

androidlayout_weight=5 gt peso =gt quanto espaccedilo ocuparaacute esta view na tela

ltTextView

androidid=+iddigite_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Digite um valor de 1 a 5 gt

ltEditText

androidid=+idedita_text

androidlayout_width=58dp

androidlayout_height=40dp

androidgravity=center_horizontal

androidinputType=number

androidtextSize=16sp gt

O layout da tela no arquivo mainxml 22

ltButton

androidid=+idgraf_botao

androidlayout_width=115dp

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Graacutefico gt

ltTextView

androidid=+idinfo_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Experimente click e click longo nna aacuterea do graacutefico gt

ltButton

androidid=+idoutro_botao

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Outro botatildeo gt

ltLinearLayoutgt

A classe ActGraficos (extends Activity) - parte 1

package comtestegraficos

import androidappActivity

import androidosBundle

import androidviewView

import androidwidget

public class ActGraficos extends Activity

private MinhaView mView

private EditText editatipo

private Button botaooutrobotao

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

try

setContentView(Rlayoutmain)

mView = (MinhaView) findViewById(Ridminha_view) mViewsetFocusable(true) para que a View receba o foco em modo touch

editatipo = (EditText) findViewById(Ridedita_text)

grafbotao = (Button) findViewById(Ridgraf_botao)

outrobotao = (Button) findViewById(Ridoutro_botao)

catch(Exception e)

ToastmakeText(ActGraficosthis

nErron + egetMessage() + n ToastLENGTH_LONG)show()

A classe ActGraficos (extends Activity) - parte 2

grafbotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

int tipo = 1

try

tipo = IntegerparseInt(editatipogetText()toString())

catch(Exception ew1)

mViewsetTipoPaint(tipo)

mViewinvalidate()

)

outrobotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(ActGraficosthis

nLegal Evento click normal atendidon

ToastLENGTH_LONG)show()

)

A classe MinhaView (extends View) - parte 1

package comtestegraficos

import androidcontentContext

class MinhaView extends View private int tipopaint=3

public MinhaView(Context cx AttributeSet attrs)

super(cx attrs)

requestFocus()

final Context viewContext = cx

setOnClickListener(new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(viewContext

nnVamos invalidar a tela estado inicialnn ToastLENGTH_LONG)show()

tipopaint = 1

invalidate()

)

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

tipopaint = 2

invalidate()

return true

)

A classe MinhaView (extends View) - parte 2

public void setTipoPaintv02(int i)

tipopaint=i

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas

switch (tipopaint)

case 1

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFDDFF00)

Obs setBounds(int left int top int right int bottom)

fig1setBounds(003050)

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

fig2getPaint()setColor(0x44DD44FF)

Obs getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2setBounds(060getWidth()getHeight())

fig1draw(c)

fig2draw(c)

break

A classe MinhaView (extends View) - parte 3

case 2

psetColor(0xFFCCCCCC) cinza

cdrawRect(33getWidth()-6 getWidth() p)

psetColor(0xFF0000FF) azul

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()10 p)

psetColor(0xFFFF0000) vermelho

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()8 p)

psetColor(0xFF00FF00) verde

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()6 p)

psetColor(0xFFFFFF00) amarelo

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()4 p)

break case 3

break

case 4

break

case 5

break

switch

Exemplo 3

Neste terceiro exemplo mostramos um programa com dois elementos na tela um objeto de uma classe derivada de View e um TextView (texto na parte superior da tela)

Utilizaremos um arquivo mainxml para definir este layout

Neste programa quase natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onKeyDown e onTouchEvent para permitir o movimento do aviatildeo como resposta agrave accedilatildeo do usuaacuterio

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidlayout_width=fill_parent androidlayout_height=fill_parent

androidorientation=verticalgt

ltTextView

androidlayout_width=wrap_content androidlayout_height=wrap_content

androidtext=Viajando en avioacuten por el mundo

androidheight=40px

androidgravity=center gt

ltcompckaviaoAviaoView

androidid=+ididaviao

androidlayout_width=wrap_content androidlayout_height=wrap_content

gt

ltLinearLayoutgt

A classe AviaoView eacute derivada de View para trabalhar em modo graacutefico

Os arquivos utilizados neste exemplo

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 3: Android - Parte 7

Telas graacuteficas Desenhar e mostrar figuras

Exemplo 1

Neste primeiro exemplo mostramos um programa com uma uacutenica tela graacutefica (classe derivada de View)

Como natildeo existiratildeo outros elementos na tela natildeo precisaremos utilizar um arquivo xml de layout

Natildeo carregaremos figuras prontas apenas desenharemos na tela

Atenderemos os eventos onClick e onLongClick

A classe ActGraficos derivada de Activity

package comtestegraficosimples

import androidappActivity

import androidosBundle

import androidviewView

import androidwidget

public class ActGraficos extends Activity

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

final MinhaView mv = new MinhaView(this) classe derivada de View

setContentView(mv)

mvsetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(ActGraficosthis

nLegal Evento click normal atendidon ToastLENGTH_LONG)show()

mvsetTipoPaint(1)

)

Observe que o visual estaraacute definido por uma View (ver nos proacuteximos slides)

A classe MinhaView derivada de View - parte 1

package comtestegraficosimples

import androidcontentContext

import androidgraphicsCanvas

import androidgraphicsPaint

import androidgraphicsdrawableshapesOvalShape

import androidgraphicsdrawableshapesRectShape

import androidviewView

import androidwidgetToast

class MinhaView extends View

private int tipopaint=1

public MinhaView(Context cx)

super(cx)

final Context viewContext = cx

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

setTipoPaint(2)

return true

)

public void setTipoPaint(int i)

tipopaint = i

invalidate() Importante este meacutetodo invalida a tela e provoca uma chamada ao meacutetodo onDraw

Alguns meacutetodos da classe Canvas (ldquotela para pintarrdquo) Fonte Classe Canvas (em httpdeveloperandroidcomreferenceandroidgraphicsCanvashtml)

int getHeight()

Returns the height of the current drawing layer

int getWidth()

Returns the width of the current drawing layer

void drawRect(float left float top float right float bottom Paint paint)

Draw the specified Rect using the specified paint

void drawText(String text float x float y Paint paint)

Draw the text with origin at (xy) using the specified paint

void drawPicture(Picture picture Rect dst)

Draw the picture stretched to fit into the dst rectangle

void drawPoint(float x float y Paint paint)

Helper for drawPoints() for drawing a single point

void drawPoints(float[] pts int offset int count Paint paint)

Draw a series of points

void drawLine(float startX float startY float stopX float stopY Paint paint)

Draw a line segment with the specified start and stop xy coordinates using the specified paint

void drawLines(float[] pts Paint paint)

void drawCircle(float cx float cy float radius Paint paint)

Draw the specified circle using the specified paint

void drawArc(RectF oval float startAngle float sweepAngle boolean useCenter Paint paint)

Draw the specified arc which will be scaled to fit inside the specified oval

A classe MinhaView derivada de View - parte 2

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas (natildeo o interior) do que seraacute pintado

switch (tipopaint)

case 1

Pintamos uma figura em forma de retacircngulo

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFFFFF00) retacircngulo amarelo

Obs setBounds(int left int top int right int bottom)

setColor os primeiros dois nuacutemeros satildeo o componente

alpha (a opacidade) FF seraacute 100 opaco Resumindo 0xAARRGGBB

fig1setBounds(003570)

fig1draw(c)

psetColor(0xFFFFFFFF) retacircngulo branco

cdrawRect(3575cgetWidth()-30 cgetHeight()-110p)

psetColor(0xFF0000FF) ciacuterculo azul

cdrawCircle(cgetWidth()2 cgetHeight()2 cgetHeight()4 p)

psetColor(0xFF00FF00) ciacuterculo verde

cdrawCircle(cgetWidth()2 cgetHeight()2 cgetHeight()8 p)

psetColor(0xFFFFFFFF) linha branca

cdrawLine(00 getWidth()()2 cgetHeight()2p)

A classe MinhaView derivada de View - parte 3

Pintamos uma figura em forma de oval

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

Ou resumindo seria ShapeDrawable fig2 = new ShapeDrawable(new OvalShape())

fig2getPaint()setColor(0x88FF0000) certa transparecircncia com 88

fig2setBounds(1010getWidth()2getHeight()2 + 20)

getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2draw(c)

psetColor(0xFFFFFFFF) para textos brancos

cdrawText(Observe a transparecircncia do oval vermelho 2 getHeight()-25 p)

cdrawText(Experimente touch e touch longo na tela 2 getHeight()-10 p)

break

case 2

cdrawText(Experimente agora touch simples na tela 2 getHeight()-10 p)

break natildeo pintamos nada neste caso

switch

meacutetodo onDraw

classe MinhaView

Exemplo 2

Neste segundo exemplo mostramos um programa Android com uma tela com diferentes elementos incluindo um objeto de uma classe derivada de View (veja na parte superior da figura)

Utilizaremos um arquivo mainxml para definir este layout

Observe que na tela temos dois objetos TextView dois Button um EditText e uma View

Atenderemos os eventos onClick e onLongClick

O layout da tela no arquivo mainxml 12

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical

androidlayout_width=fill_parent

androidlayout_height=fill_parent

androidgravity=center_horizontal gt

ltexemplosexemplograficos2MinhaView

androidid=+idminha_view

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_margin =3dp

androidlayout_weight=5 gt peso =gt quanto espaccedilo ocuparaacute esta view na tela

ltTextView

androidid=+iddigite_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Digite um valor de 1 a 5 gt

ltEditText

androidid=+idedita_text

androidlayout_width=58dp

androidlayout_height=40dp

androidgravity=center_horizontal

androidinputType=number

androidtextSize=16sp gt

O layout da tela no arquivo mainxml 22

ltButton

androidid=+idgraf_botao

androidlayout_width=115dp

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Graacutefico gt

ltTextView

androidid=+idinfo_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Experimente click e click longo nna aacuterea do graacutefico gt

ltButton

androidid=+idoutro_botao

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Outro botatildeo gt

ltLinearLayoutgt

A classe ActGraficos (extends Activity) - parte 1

package comtestegraficos

import androidappActivity

import androidosBundle

import androidviewView

import androidwidget

public class ActGraficos extends Activity

private MinhaView mView

private EditText editatipo

private Button botaooutrobotao

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

try

setContentView(Rlayoutmain)

mView = (MinhaView) findViewById(Ridminha_view) mViewsetFocusable(true) para que a View receba o foco em modo touch

editatipo = (EditText) findViewById(Ridedita_text)

grafbotao = (Button) findViewById(Ridgraf_botao)

outrobotao = (Button) findViewById(Ridoutro_botao)

catch(Exception e)

ToastmakeText(ActGraficosthis

nErron + egetMessage() + n ToastLENGTH_LONG)show()

A classe ActGraficos (extends Activity) - parte 2

grafbotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

int tipo = 1

try

tipo = IntegerparseInt(editatipogetText()toString())

catch(Exception ew1)

mViewsetTipoPaint(tipo)

mViewinvalidate()

)

outrobotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(ActGraficosthis

nLegal Evento click normal atendidon

ToastLENGTH_LONG)show()

)

A classe MinhaView (extends View) - parte 1

package comtestegraficos

import androidcontentContext

class MinhaView extends View private int tipopaint=3

public MinhaView(Context cx AttributeSet attrs)

super(cx attrs)

requestFocus()

final Context viewContext = cx

setOnClickListener(new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(viewContext

nnVamos invalidar a tela estado inicialnn ToastLENGTH_LONG)show()

tipopaint = 1

invalidate()

)

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

tipopaint = 2

invalidate()

return true

)

A classe MinhaView (extends View) - parte 2

public void setTipoPaintv02(int i)

tipopaint=i

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas

switch (tipopaint)

case 1

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFDDFF00)

Obs setBounds(int left int top int right int bottom)

fig1setBounds(003050)

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

fig2getPaint()setColor(0x44DD44FF)

Obs getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2setBounds(060getWidth()getHeight())

fig1draw(c)

fig2draw(c)

break

A classe MinhaView (extends View) - parte 3

case 2

psetColor(0xFFCCCCCC) cinza

cdrawRect(33getWidth()-6 getWidth() p)

psetColor(0xFF0000FF) azul

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()10 p)

psetColor(0xFFFF0000) vermelho

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()8 p)

psetColor(0xFF00FF00) verde

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()6 p)

psetColor(0xFFFFFF00) amarelo

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()4 p)

break case 3

break

case 4

break

case 5

break

switch

Exemplo 3

Neste terceiro exemplo mostramos um programa com dois elementos na tela um objeto de uma classe derivada de View e um TextView (texto na parte superior da tela)

Utilizaremos um arquivo mainxml para definir este layout

Neste programa quase natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onKeyDown e onTouchEvent para permitir o movimento do aviatildeo como resposta agrave accedilatildeo do usuaacuterio

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidlayout_width=fill_parent androidlayout_height=fill_parent

androidorientation=verticalgt

ltTextView

androidlayout_width=wrap_content androidlayout_height=wrap_content

androidtext=Viajando en avioacuten por el mundo

androidheight=40px

androidgravity=center gt

ltcompckaviaoAviaoView

androidid=+ididaviao

androidlayout_width=wrap_content androidlayout_height=wrap_content

gt

ltLinearLayoutgt

A classe AviaoView eacute derivada de View para trabalhar em modo graacutefico

Os arquivos utilizados neste exemplo

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 4: Android - Parte 7

Exemplo 1

Neste primeiro exemplo mostramos um programa com uma uacutenica tela graacutefica (classe derivada de View)

Como natildeo existiratildeo outros elementos na tela natildeo precisaremos utilizar um arquivo xml de layout

Natildeo carregaremos figuras prontas apenas desenharemos na tela

Atenderemos os eventos onClick e onLongClick

A classe ActGraficos derivada de Activity

package comtestegraficosimples

import androidappActivity

import androidosBundle

import androidviewView

import androidwidget

public class ActGraficos extends Activity

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

final MinhaView mv = new MinhaView(this) classe derivada de View

setContentView(mv)

mvsetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(ActGraficosthis

nLegal Evento click normal atendidon ToastLENGTH_LONG)show()

mvsetTipoPaint(1)

)

Observe que o visual estaraacute definido por uma View (ver nos proacuteximos slides)

A classe MinhaView derivada de View - parte 1

package comtestegraficosimples

import androidcontentContext

import androidgraphicsCanvas

import androidgraphicsPaint

import androidgraphicsdrawableshapesOvalShape

import androidgraphicsdrawableshapesRectShape

import androidviewView

import androidwidgetToast

class MinhaView extends View

private int tipopaint=1

public MinhaView(Context cx)

super(cx)

final Context viewContext = cx

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

setTipoPaint(2)

return true

)

public void setTipoPaint(int i)

tipopaint = i

invalidate() Importante este meacutetodo invalida a tela e provoca uma chamada ao meacutetodo onDraw

Alguns meacutetodos da classe Canvas (ldquotela para pintarrdquo) Fonte Classe Canvas (em httpdeveloperandroidcomreferenceandroidgraphicsCanvashtml)

int getHeight()

Returns the height of the current drawing layer

int getWidth()

Returns the width of the current drawing layer

void drawRect(float left float top float right float bottom Paint paint)

Draw the specified Rect using the specified paint

void drawText(String text float x float y Paint paint)

Draw the text with origin at (xy) using the specified paint

void drawPicture(Picture picture Rect dst)

Draw the picture stretched to fit into the dst rectangle

void drawPoint(float x float y Paint paint)

Helper for drawPoints() for drawing a single point

void drawPoints(float[] pts int offset int count Paint paint)

Draw a series of points

void drawLine(float startX float startY float stopX float stopY Paint paint)

Draw a line segment with the specified start and stop xy coordinates using the specified paint

void drawLines(float[] pts Paint paint)

void drawCircle(float cx float cy float radius Paint paint)

Draw the specified circle using the specified paint

void drawArc(RectF oval float startAngle float sweepAngle boolean useCenter Paint paint)

Draw the specified arc which will be scaled to fit inside the specified oval

A classe MinhaView derivada de View - parte 2

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas (natildeo o interior) do que seraacute pintado

switch (tipopaint)

case 1

Pintamos uma figura em forma de retacircngulo

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFFFFF00) retacircngulo amarelo

Obs setBounds(int left int top int right int bottom)

setColor os primeiros dois nuacutemeros satildeo o componente

alpha (a opacidade) FF seraacute 100 opaco Resumindo 0xAARRGGBB

fig1setBounds(003570)

fig1draw(c)

psetColor(0xFFFFFFFF) retacircngulo branco

cdrawRect(3575cgetWidth()-30 cgetHeight()-110p)

psetColor(0xFF0000FF) ciacuterculo azul

cdrawCircle(cgetWidth()2 cgetHeight()2 cgetHeight()4 p)

psetColor(0xFF00FF00) ciacuterculo verde

cdrawCircle(cgetWidth()2 cgetHeight()2 cgetHeight()8 p)

psetColor(0xFFFFFFFF) linha branca

cdrawLine(00 getWidth()()2 cgetHeight()2p)

A classe MinhaView derivada de View - parte 3

Pintamos uma figura em forma de oval

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

Ou resumindo seria ShapeDrawable fig2 = new ShapeDrawable(new OvalShape())

fig2getPaint()setColor(0x88FF0000) certa transparecircncia com 88

fig2setBounds(1010getWidth()2getHeight()2 + 20)

getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2draw(c)

psetColor(0xFFFFFFFF) para textos brancos

cdrawText(Observe a transparecircncia do oval vermelho 2 getHeight()-25 p)

cdrawText(Experimente touch e touch longo na tela 2 getHeight()-10 p)

break

case 2

cdrawText(Experimente agora touch simples na tela 2 getHeight()-10 p)

break natildeo pintamos nada neste caso

switch

meacutetodo onDraw

classe MinhaView

Exemplo 2

Neste segundo exemplo mostramos um programa Android com uma tela com diferentes elementos incluindo um objeto de uma classe derivada de View (veja na parte superior da figura)

Utilizaremos um arquivo mainxml para definir este layout

Observe que na tela temos dois objetos TextView dois Button um EditText e uma View

Atenderemos os eventos onClick e onLongClick

O layout da tela no arquivo mainxml 12

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical

androidlayout_width=fill_parent

androidlayout_height=fill_parent

androidgravity=center_horizontal gt

ltexemplosexemplograficos2MinhaView

androidid=+idminha_view

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_margin =3dp

androidlayout_weight=5 gt peso =gt quanto espaccedilo ocuparaacute esta view na tela

ltTextView

androidid=+iddigite_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Digite um valor de 1 a 5 gt

ltEditText

androidid=+idedita_text

androidlayout_width=58dp

androidlayout_height=40dp

androidgravity=center_horizontal

androidinputType=number

androidtextSize=16sp gt

O layout da tela no arquivo mainxml 22

ltButton

androidid=+idgraf_botao

androidlayout_width=115dp

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Graacutefico gt

ltTextView

androidid=+idinfo_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Experimente click e click longo nna aacuterea do graacutefico gt

ltButton

androidid=+idoutro_botao

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Outro botatildeo gt

ltLinearLayoutgt

A classe ActGraficos (extends Activity) - parte 1

package comtestegraficos

import androidappActivity

import androidosBundle

import androidviewView

import androidwidget

public class ActGraficos extends Activity

private MinhaView mView

private EditText editatipo

private Button botaooutrobotao

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

try

setContentView(Rlayoutmain)

mView = (MinhaView) findViewById(Ridminha_view) mViewsetFocusable(true) para que a View receba o foco em modo touch

editatipo = (EditText) findViewById(Ridedita_text)

grafbotao = (Button) findViewById(Ridgraf_botao)

outrobotao = (Button) findViewById(Ridoutro_botao)

catch(Exception e)

ToastmakeText(ActGraficosthis

nErron + egetMessage() + n ToastLENGTH_LONG)show()

A classe ActGraficos (extends Activity) - parte 2

grafbotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

int tipo = 1

try

tipo = IntegerparseInt(editatipogetText()toString())

catch(Exception ew1)

mViewsetTipoPaint(tipo)

mViewinvalidate()

)

outrobotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(ActGraficosthis

nLegal Evento click normal atendidon

ToastLENGTH_LONG)show()

)

A classe MinhaView (extends View) - parte 1

package comtestegraficos

import androidcontentContext

class MinhaView extends View private int tipopaint=3

public MinhaView(Context cx AttributeSet attrs)

super(cx attrs)

requestFocus()

final Context viewContext = cx

setOnClickListener(new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(viewContext

nnVamos invalidar a tela estado inicialnn ToastLENGTH_LONG)show()

tipopaint = 1

invalidate()

)

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

tipopaint = 2

invalidate()

return true

)

A classe MinhaView (extends View) - parte 2

public void setTipoPaintv02(int i)

tipopaint=i

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas

switch (tipopaint)

case 1

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFDDFF00)

Obs setBounds(int left int top int right int bottom)

fig1setBounds(003050)

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

fig2getPaint()setColor(0x44DD44FF)

Obs getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2setBounds(060getWidth()getHeight())

fig1draw(c)

fig2draw(c)

break

A classe MinhaView (extends View) - parte 3

case 2

psetColor(0xFFCCCCCC) cinza

cdrawRect(33getWidth()-6 getWidth() p)

psetColor(0xFF0000FF) azul

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()10 p)

psetColor(0xFFFF0000) vermelho

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()8 p)

psetColor(0xFF00FF00) verde

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()6 p)

psetColor(0xFFFFFF00) amarelo

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()4 p)

break case 3

break

case 4

break

case 5

break

switch

Exemplo 3

Neste terceiro exemplo mostramos um programa com dois elementos na tela um objeto de uma classe derivada de View e um TextView (texto na parte superior da tela)

Utilizaremos um arquivo mainxml para definir este layout

Neste programa quase natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onKeyDown e onTouchEvent para permitir o movimento do aviatildeo como resposta agrave accedilatildeo do usuaacuterio

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidlayout_width=fill_parent androidlayout_height=fill_parent

androidorientation=verticalgt

ltTextView

androidlayout_width=wrap_content androidlayout_height=wrap_content

androidtext=Viajando en avioacuten por el mundo

androidheight=40px

androidgravity=center gt

ltcompckaviaoAviaoView

androidid=+ididaviao

androidlayout_width=wrap_content androidlayout_height=wrap_content

gt

ltLinearLayoutgt

A classe AviaoView eacute derivada de View para trabalhar em modo graacutefico

Os arquivos utilizados neste exemplo

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 5: Android - Parte 7

A classe ActGraficos derivada de Activity

package comtestegraficosimples

import androidappActivity

import androidosBundle

import androidviewView

import androidwidget

public class ActGraficos extends Activity

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

final MinhaView mv = new MinhaView(this) classe derivada de View

setContentView(mv)

mvsetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(ActGraficosthis

nLegal Evento click normal atendidon ToastLENGTH_LONG)show()

mvsetTipoPaint(1)

)

Observe que o visual estaraacute definido por uma View (ver nos proacuteximos slides)

A classe MinhaView derivada de View - parte 1

package comtestegraficosimples

import androidcontentContext

import androidgraphicsCanvas

import androidgraphicsPaint

import androidgraphicsdrawableshapesOvalShape

import androidgraphicsdrawableshapesRectShape

import androidviewView

import androidwidgetToast

class MinhaView extends View

private int tipopaint=1

public MinhaView(Context cx)

super(cx)

final Context viewContext = cx

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

setTipoPaint(2)

return true

)

public void setTipoPaint(int i)

tipopaint = i

invalidate() Importante este meacutetodo invalida a tela e provoca uma chamada ao meacutetodo onDraw

Alguns meacutetodos da classe Canvas (ldquotela para pintarrdquo) Fonte Classe Canvas (em httpdeveloperandroidcomreferenceandroidgraphicsCanvashtml)

int getHeight()

Returns the height of the current drawing layer

int getWidth()

Returns the width of the current drawing layer

void drawRect(float left float top float right float bottom Paint paint)

Draw the specified Rect using the specified paint

void drawText(String text float x float y Paint paint)

Draw the text with origin at (xy) using the specified paint

void drawPicture(Picture picture Rect dst)

Draw the picture stretched to fit into the dst rectangle

void drawPoint(float x float y Paint paint)

Helper for drawPoints() for drawing a single point

void drawPoints(float[] pts int offset int count Paint paint)

Draw a series of points

void drawLine(float startX float startY float stopX float stopY Paint paint)

Draw a line segment with the specified start and stop xy coordinates using the specified paint

void drawLines(float[] pts Paint paint)

void drawCircle(float cx float cy float radius Paint paint)

Draw the specified circle using the specified paint

void drawArc(RectF oval float startAngle float sweepAngle boolean useCenter Paint paint)

Draw the specified arc which will be scaled to fit inside the specified oval

A classe MinhaView derivada de View - parte 2

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas (natildeo o interior) do que seraacute pintado

switch (tipopaint)

case 1

Pintamos uma figura em forma de retacircngulo

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFFFFF00) retacircngulo amarelo

Obs setBounds(int left int top int right int bottom)

setColor os primeiros dois nuacutemeros satildeo o componente

alpha (a opacidade) FF seraacute 100 opaco Resumindo 0xAARRGGBB

fig1setBounds(003570)

fig1draw(c)

psetColor(0xFFFFFFFF) retacircngulo branco

cdrawRect(3575cgetWidth()-30 cgetHeight()-110p)

psetColor(0xFF0000FF) ciacuterculo azul

cdrawCircle(cgetWidth()2 cgetHeight()2 cgetHeight()4 p)

psetColor(0xFF00FF00) ciacuterculo verde

cdrawCircle(cgetWidth()2 cgetHeight()2 cgetHeight()8 p)

psetColor(0xFFFFFFFF) linha branca

cdrawLine(00 getWidth()()2 cgetHeight()2p)

A classe MinhaView derivada de View - parte 3

Pintamos uma figura em forma de oval

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

Ou resumindo seria ShapeDrawable fig2 = new ShapeDrawable(new OvalShape())

fig2getPaint()setColor(0x88FF0000) certa transparecircncia com 88

fig2setBounds(1010getWidth()2getHeight()2 + 20)

getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2draw(c)

psetColor(0xFFFFFFFF) para textos brancos

cdrawText(Observe a transparecircncia do oval vermelho 2 getHeight()-25 p)

cdrawText(Experimente touch e touch longo na tela 2 getHeight()-10 p)

break

case 2

cdrawText(Experimente agora touch simples na tela 2 getHeight()-10 p)

break natildeo pintamos nada neste caso

switch

meacutetodo onDraw

classe MinhaView

Exemplo 2

Neste segundo exemplo mostramos um programa Android com uma tela com diferentes elementos incluindo um objeto de uma classe derivada de View (veja na parte superior da figura)

Utilizaremos um arquivo mainxml para definir este layout

Observe que na tela temos dois objetos TextView dois Button um EditText e uma View

Atenderemos os eventos onClick e onLongClick

O layout da tela no arquivo mainxml 12

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical

androidlayout_width=fill_parent

androidlayout_height=fill_parent

androidgravity=center_horizontal gt

ltexemplosexemplograficos2MinhaView

androidid=+idminha_view

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_margin =3dp

androidlayout_weight=5 gt peso =gt quanto espaccedilo ocuparaacute esta view na tela

ltTextView

androidid=+iddigite_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Digite um valor de 1 a 5 gt

ltEditText

androidid=+idedita_text

androidlayout_width=58dp

androidlayout_height=40dp

androidgravity=center_horizontal

androidinputType=number

androidtextSize=16sp gt

O layout da tela no arquivo mainxml 22

ltButton

androidid=+idgraf_botao

androidlayout_width=115dp

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Graacutefico gt

ltTextView

androidid=+idinfo_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Experimente click e click longo nna aacuterea do graacutefico gt

ltButton

androidid=+idoutro_botao

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Outro botatildeo gt

ltLinearLayoutgt

A classe ActGraficos (extends Activity) - parte 1

package comtestegraficos

import androidappActivity

import androidosBundle

import androidviewView

import androidwidget

public class ActGraficos extends Activity

private MinhaView mView

private EditText editatipo

private Button botaooutrobotao

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

try

setContentView(Rlayoutmain)

mView = (MinhaView) findViewById(Ridminha_view) mViewsetFocusable(true) para que a View receba o foco em modo touch

editatipo = (EditText) findViewById(Ridedita_text)

grafbotao = (Button) findViewById(Ridgraf_botao)

outrobotao = (Button) findViewById(Ridoutro_botao)

catch(Exception e)

ToastmakeText(ActGraficosthis

nErron + egetMessage() + n ToastLENGTH_LONG)show()

A classe ActGraficos (extends Activity) - parte 2

grafbotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

int tipo = 1

try

tipo = IntegerparseInt(editatipogetText()toString())

catch(Exception ew1)

mViewsetTipoPaint(tipo)

mViewinvalidate()

)

outrobotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(ActGraficosthis

nLegal Evento click normal atendidon

ToastLENGTH_LONG)show()

)

A classe MinhaView (extends View) - parte 1

package comtestegraficos

import androidcontentContext

class MinhaView extends View private int tipopaint=3

public MinhaView(Context cx AttributeSet attrs)

super(cx attrs)

requestFocus()

final Context viewContext = cx

setOnClickListener(new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(viewContext

nnVamos invalidar a tela estado inicialnn ToastLENGTH_LONG)show()

tipopaint = 1

invalidate()

)

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

tipopaint = 2

invalidate()

return true

)

A classe MinhaView (extends View) - parte 2

public void setTipoPaintv02(int i)

tipopaint=i

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas

switch (tipopaint)

case 1

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFDDFF00)

Obs setBounds(int left int top int right int bottom)

fig1setBounds(003050)

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

fig2getPaint()setColor(0x44DD44FF)

Obs getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2setBounds(060getWidth()getHeight())

fig1draw(c)

fig2draw(c)

break

A classe MinhaView (extends View) - parte 3

case 2

psetColor(0xFFCCCCCC) cinza

cdrawRect(33getWidth()-6 getWidth() p)

psetColor(0xFF0000FF) azul

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()10 p)

psetColor(0xFFFF0000) vermelho

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()8 p)

psetColor(0xFF00FF00) verde

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()6 p)

psetColor(0xFFFFFF00) amarelo

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()4 p)

break case 3

break

case 4

break

case 5

break

switch

Exemplo 3

Neste terceiro exemplo mostramos um programa com dois elementos na tela um objeto de uma classe derivada de View e um TextView (texto na parte superior da tela)

Utilizaremos um arquivo mainxml para definir este layout

Neste programa quase natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onKeyDown e onTouchEvent para permitir o movimento do aviatildeo como resposta agrave accedilatildeo do usuaacuterio

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidlayout_width=fill_parent androidlayout_height=fill_parent

androidorientation=verticalgt

ltTextView

androidlayout_width=wrap_content androidlayout_height=wrap_content

androidtext=Viajando en avioacuten por el mundo

androidheight=40px

androidgravity=center gt

ltcompckaviaoAviaoView

androidid=+ididaviao

androidlayout_width=wrap_content androidlayout_height=wrap_content

gt

ltLinearLayoutgt

A classe AviaoView eacute derivada de View para trabalhar em modo graacutefico

Os arquivos utilizados neste exemplo

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 6: Android - Parte 7

A classe MinhaView derivada de View - parte 1

package comtestegraficosimples

import androidcontentContext

import androidgraphicsCanvas

import androidgraphicsPaint

import androidgraphicsdrawableshapesOvalShape

import androidgraphicsdrawableshapesRectShape

import androidviewView

import androidwidgetToast

class MinhaView extends View

private int tipopaint=1

public MinhaView(Context cx)

super(cx)

final Context viewContext = cx

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

setTipoPaint(2)

return true

)

public void setTipoPaint(int i)

tipopaint = i

invalidate() Importante este meacutetodo invalida a tela e provoca uma chamada ao meacutetodo onDraw

Alguns meacutetodos da classe Canvas (ldquotela para pintarrdquo) Fonte Classe Canvas (em httpdeveloperandroidcomreferenceandroidgraphicsCanvashtml)

int getHeight()

Returns the height of the current drawing layer

int getWidth()

Returns the width of the current drawing layer

void drawRect(float left float top float right float bottom Paint paint)

Draw the specified Rect using the specified paint

void drawText(String text float x float y Paint paint)

Draw the text with origin at (xy) using the specified paint

void drawPicture(Picture picture Rect dst)

Draw the picture stretched to fit into the dst rectangle

void drawPoint(float x float y Paint paint)

Helper for drawPoints() for drawing a single point

void drawPoints(float[] pts int offset int count Paint paint)

Draw a series of points

void drawLine(float startX float startY float stopX float stopY Paint paint)

Draw a line segment with the specified start and stop xy coordinates using the specified paint

void drawLines(float[] pts Paint paint)

void drawCircle(float cx float cy float radius Paint paint)

Draw the specified circle using the specified paint

void drawArc(RectF oval float startAngle float sweepAngle boolean useCenter Paint paint)

Draw the specified arc which will be scaled to fit inside the specified oval

A classe MinhaView derivada de View - parte 2

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas (natildeo o interior) do que seraacute pintado

switch (tipopaint)

case 1

Pintamos uma figura em forma de retacircngulo

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFFFFF00) retacircngulo amarelo

Obs setBounds(int left int top int right int bottom)

setColor os primeiros dois nuacutemeros satildeo o componente

alpha (a opacidade) FF seraacute 100 opaco Resumindo 0xAARRGGBB

fig1setBounds(003570)

fig1draw(c)

psetColor(0xFFFFFFFF) retacircngulo branco

cdrawRect(3575cgetWidth()-30 cgetHeight()-110p)

psetColor(0xFF0000FF) ciacuterculo azul

cdrawCircle(cgetWidth()2 cgetHeight()2 cgetHeight()4 p)

psetColor(0xFF00FF00) ciacuterculo verde

cdrawCircle(cgetWidth()2 cgetHeight()2 cgetHeight()8 p)

psetColor(0xFFFFFFFF) linha branca

cdrawLine(00 getWidth()()2 cgetHeight()2p)

A classe MinhaView derivada de View - parte 3

Pintamos uma figura em forma de oval

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

Ou resumindo seria ShapeDrawable fig2 = new ShapeDrawable(new OvalShape())

fig2getPaint()setColor(0x88FF0000) certa transparecircncia com 88

fig2setBounds(1010getWidth()2getHeight()2 + 20)

getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2draw(c)

psetColor(0xFFFFFFFF) para textos brancos

cdrawText(Observe a transparecircncia do oval vermelho 2 getHeight()-25 p)

cdrawText(Experimente touch e touch longo na tela 2 getHeight()-10 p)

break

case 2

cdrawText(Experimente agora touch simples na tela 2 getHeight()-10 p)

break natildeo pintamos nada neste caso

switch

meacutetodo onDraw

classe MinhaView

Exemplo 2

Neste segundo exemplo mostramos um programa Android com uma tela com diferentes elementos incluindo um objeto de uma classe derivada de View (veja na parte superior da figura)

Utilizaremos um arquivo mainxml para definir este layout

Observe que na tela temos dois objetos TextView dois Button um EditText e uma View

Atenderemos os eventos onClick e onLongClick

O layout da tela no arquivo mainxml 12

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical

androidlayout_width=fill_parent

androidlayout_height=fill_parent

androidgravity=center_horizontal gt

ltexemplosexemplograficos2MinhaView

androidid=+idminha_view

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_margin =3dp

androidlayout_weight=5 gt peso =gt quanto espaccedilo ocuparaacute esta view na tela

ltTextView

androidid=+iddigite_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Digite um valor de 1 a 5 gt

ltEditText

androidid=+idedita_text

androidlayout_width=58dp

androidlayout_height=40dp

androidgravity=center_horizontal

androidinputType=number

androidtextSize=16sp gt

O layout da tela no arquivo mainxml 22

ltButton

androidid=+idgraf_botao

androidlayout_width=115dp

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Graacutefico gt

ltTextView

androidid=+idinfo_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Experimente click e click longo nna aacuterea do graacutefico gt

ltButton

androidid=+idoutro_botao

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Outro botatildeo gt

ltLinearLayoutgt

A classe ActGraficos (extends Activity) - parte 1

package comtestegraficos

import androidappActivity

import androidosBundle

import androidviewView

import androidwidget

public class ActGraficos extends Activity

private MinhaView mView

private EditText editatipo

private Button botaooutrobotao

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

try

setContentView(Rlayoutmain)

mView = (MinhaView) findViewById(Ridminha_view) mViewsetFocusable(true) para que a View receba o foco em modo touch

editatipo = (EditText) findViewById(Ridedita_text)

grafbotao = (Button) findViewById(Ridgraf_botao)

outrobotao = (Button) findViewById(Ridoutro_botao)

catch(Exception e)

ToastmakeText(ActGraficosthis

nErron + egetMessage() + n ToastLENGTH_LONG)show()

A classe ActGraficos (extends Activity) - parte 2

grafbotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

int tipo = 1

try

tipo = IntegerparseInt(editatipogetText()toString())

catch(Exception ew1)

mViewsetTipoPaint(tipo)

mViewinvalidate()

)

outrobotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(ActGraficosthis

nLegal Evento click normal atendidon

ToastLENGTH_LONG)show()

)

A classe MinhaView (extends View) - parte 1

package comtestegraficos

import androidcontentContext

class MinhaView extends View private int tipopaint=3

public MinhaView(Context cx AttributeSet attrs)

super(cx attrs)

requestFocus()

final Context viewContext = cx

setOnClickListener(new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(viewContext

nnVamos invalidar a tela estado inicialnn ToastLENGTH_LONG)show()

tipopaint = 1

invalidate()

)

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

tipopaint = 2

invalidate()

return true

)

A classe MinhaView (extends View) - parte 2

public void setTipoPaintv02(int i)

tipopaint=i

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas

switch (tipopaint)

case 1

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFDDFF00)

Obs setBounds(int left int top int right int bottom)

fig1setBounds(003050)

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

fig2getPaint()setColor(0x44DD44FF)

Obs getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2setBounds(060getWidth()getHeight())

fig1draw(c)

fig2draw(c)

break

A classe MinhaView (extends View) - parte 3

case 2

psetColor(0xFFCCCCCC) cinza

cdrawRect(33getWidth()-6 getWidth() p)

psetColor(0xFF0000FF) azul

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()10 p)

psetColor(0xFFFF0000) vermelho

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()8 p)

psetColor(0xFF00FF00) verde

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()6 p)

psetColor(0xFFFFFF00) amarelo

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()4 p)

break case 3

break

case 4

break

case 5

break

switch

Exemplo 3

Neste terceiro exemplo mostramos um programa com dois elementos na tela um objeto de uma classe derivada de View e um TextView (texto na parte superior da tela)

Utilizaremos um arquivo mainxml para definir este layout

Neste programa quase natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onKeyDown e onTouchEvent para permitir o movimento do aviatildeo como resposta agrave accedilatildeo do usuaacuterio

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidlayout_width=fill_parent androidlayout_height=fill_parent

androidorientation=verticalgt

ltTextView

androidlayout_width=wrap_content androidlayout_height=wrap_content

androidtext=Viajando en avioacuten por el mundo

androidheight=40px

androidgravity=center gt

ltcompckaviaoAviaoView

androidid=+ididaviao

androidlayout_width=wrap_content androidlayout_height=wrap_content

gt

ltLinearLayoutgt

A classe AviaoView eacute derivada de View para trabalhar em modo graacutefico

Os arquivos utilizados neste exemplo

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 7: Android - Parte 7

Alguns meacutetodos da classe Canvas (ldquotela para pintarrdquo) Fonte Classe Canvas (em httpdeveloperandroidcomreferenceandroidgraphicsCanvashtml)

int getHeight()

Returns the height of the current drawing layer

int getWidth()

Returns the width of the current drawing layer

void drawRect(float left float top float right float bottom Paint paint)

Draw the specified Rect using the specified paint

void drawText(String text float x float y Paint paint)

Draw the text with origin at (xy) using the specified paint

void drawPicture(Picture picture Rect dst)

Draw the picture stretched to fit into the dst rectangle

void drawPoint(float x float y Paint paint)

Helper for drawPoints() for drawing a single point

void drawPoints(float[] pts int offset int count Paint paint)

Draw a series of points

void drawLine(float startX float startY float stopX float stopY Paint paint)

Draw a line segment with the specified start and stop xy coordinates using the specified paint

void drawLines(float[] pts Paint paint)

void drawCircle(float cx float cy float radius Paint paint)

Draw the specified circle using the specified paint

void drawArc(RectF oval float startAngle float sweepAngle boolean useCenter Paint paint)

Draw the specified arc which will be scaled to fit inside the specified oval

A classe MinhaView derivada de View - parte 2

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas (natildeo o interior) do que seraacute pintado

switch (tipopaint)

case 1

Pintamos uma figura em forma de retacircngulo

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFFFFF00) retacircngulo amarelo

Obs setBounds(int left int top int right int bottom)

setColor os primeiros dois nuacutemeros satildeo o componente

alpha (a opacidade) FF seraacute 100 opaco Resumindo 0xAARRGGBB

fig1setBounds(003570)

fig1draw(c)

psetColor(0xFFFFFFFF) retacircngulo branco

cdrawRect(3575cgetWidth()-30 cgetHeight()-110p)

psetColor(0xFF0000FF) ciacuterculo azul

cdrawCircle(cgetWidth()2 cgetHeight()2 cgetHeight()4 p)

psetColor(0xFF00FF00) ciacuterculo verde

cdrawCircle(cgetWidth()2 cgetHeight()2 cgetHeight()8 p)

psetColor(0xFFFFFFFF) linha branca

cdrawLine(00 getWidth()()2 cgetHeight()2p)

A classe MinhaView derivada de View - parte 3

Pintamos uma figura em forma de oval

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

Ou resumindo seria ShapeDrawable fig2 = new ShapeDrawable(new OvalShape())

fig2getPaint()setColor(0x88FF0000) certa transparecircncia com 88

fig2setBounds(1010getWidth()2getHeight()2 + 20)

getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2draw(c)

psetColor(0xFFFFFFFF) para textos brancos

cdrawText(Observe a transparecircncia do oval vermelho 2 getHeight()-25 p)

cdrawText(Experimente touch e touch longo na tela 2 getHeight()-10 p)

break

case 2

cdrawText(Experimente agora touch simples na tela 2 getHeight()-10 p)

break natildeo pintamos nada neste caso

switch

meacutetodo onDraw

classe MinhaView

Exemplo 2

Neste segundo exemplo mostramos um programa Android com uma tela com diferentes elementos incluindo um objeto de uma classe derivada de View (veja na parte superior da figura)

Utilizaremos um arquivo mainxml para definir este layout

Observe que na tela temos dois objetos TextView dois Button um EditText e uma View

Atenderemos os eventos onClick e onLongClick

O layout da tela no arquivo mainxml 12

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical

androidlayout_width=fill_parent

androidlayout_height=fill_parent

androidgravity=center_horizontal gt

ltexemplosexemplograficos2MinhaView

androidid=+idminha_view

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_margin =3dp

androidlayout_weight=5 gt peso =gt quanto espaccedilo ocuparaacute esta view na tela

ltTextView

androidid=+iddigite_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Digite um valor de 1 a 5 gt

ltEditText

androidid=+idedita_text

androidlayout_width=58dp

androidlayout_height=40dp

androidgravity=center_horizontal

androidinputType=number

androidtextSize=16sp gt

O layout da tela no arquivo mainxml 22

ltButton

androidid=+idgraf_botao

androidlayout_width=115dp

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Graacutefico gt

ltTextView

androidid=+idinfo_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Experimente click e click longo nna aacuterea do graacutefico gt

ltButton

androidid=+idoutro_botao

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Outro botatildeo gt

ltLinearLayoutgt

A classe ActGraficos (extends Activity) - parte 1

package comtestegraficos

import androidappActivity

import androidosBundle

import androidviewView

import androidwidget

public class ActGraficos extends Activity

private MinhaView mView

private EditText editatipo

private Button botaooutrobotao

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

try

setContentView(Rlayoutmain)

mView = (MinhaView) findViewById(Ridminha_view) mViewsetFocusable(true) para que a View receba o foco em modo touch

editatipo = (EditText) findViewById(Ridedita_text)

grafbotao = (Button) findViewById(Ridgraf_botao)

outrobotao = (Button) findViewById(Ridoutro_botao)

catch(Exception e)

ToastmakeText(ActGraficosthis

nErron + egetMessage() + n ToastLENGTH_LONG)show()

A classe ActGraficos (extends Activity) - parte 2

grafbotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

int tipo = 1

try

tipo = IntegerparseInt(editatipogetText()toString())

catch(Exception ew1)

mViewsetTipoPaint(tipo)

mViewinvalidate()

)

outrobotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(ActGraficosthis

nLegal Evento click normal atendidon

ToastLENGTH_LONG)show()

)

A classe MinhaView (extends View) - parte 1

package comtestegraficos

import androidcontentContext

class MinhaView extends View private int tipopaint=3

public MinhaView(Context cx AttributeSet attrs)

super(cx attrs)

requestFocus()

final Context viewContext = cx

setOnClickListener(new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(viewContext

nnVamos invalidar a tela estado inicialnn ToastLENGTH_LONG)show()

tipopaint = 1

invalidate()

)

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

tipopaint = 2

invalidate()

return true

)

A classe MinhaView (extends View) - parte 2

public void setTipoPaintv02(int i)

tipopaint=i

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas

switch (tipopaint)

case 1

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFDDFF00)

Obs setBounds(int left int top int right int bottom)

fig1setBounds(003050)

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

fig2getPaint()setColor(0x44DD44FF)

Obs getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2setBounds(060getWidth()getHeight())

fig1draw(c)

fig2draw(c)

break

A classe MinhaView (extends View) - parte 3

case 2

psetColor(0xFFCCCCCC) cinza

cdrawRect(33getWidth()-6 getWidth() p)

psetColor(0xFF0000FF) azul

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()10 p)

psetColor(0xFFFF0000) vermelho

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()8 p)

psetColor(0xFF00FF00) verde

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()6 p)

psetColor(0xFFFFFF00) amarelo

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()4 p)

break case 3

break

case 4

break

case 5

break

switch

Exemplo 3

Neste terceiro exemplo mostramos um programa com dois elementos na tela um objeto de uma classe derivada de View e um TextView (texto na parte superior da tela)

Utilizaremos um arquivo mainxml para definir este layout

Neste programa quase natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onKeyDown e onTouchEvent para permitir o movimento do aviatildeo como resposta agrave accedilatildeo do usuaacuterio

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidlayout_width=fill_parent androidlayout_height=fill_parent

androidorientation=verticalgt

ltTextView

androidlayout_width=wrap_content androidlayout_height=wrap_content

androidtext=Viajando en avioacuten por el mundo

androidheight=40px

androidgravity=center gt

ltcompckaviaoAviaoView

androidid=+ididaviao

androidlayout_width=wrap_content androidlayout_height=wrap_content

gt

ltLinearLayoutgt

A classe AviaoView eacute derivada de View para trabalhar em modo graacutefico

Os arquivos utilizados neste exemplo

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 8: Android - Parte 7

A classe MinhaView derivada de View - parte 2

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas (natildeo o interior) do que seraacute pintado

switch (tipopaint)

case 1

Pintamos uma figura em forma de retacircngulo

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFFFFF00) retacircngulo amarelo

Obs setBounds(int left int top int right int bottom)

setColor os primeiros dois nuacutemeros satildeo o componente

alpha (a opacidade) FF seraacute 100 opaco Resumindo 0xAARRGGBB

fig1setBounds(003570)

fig1draw(c)

psetColor(0xFFFFFFFF) retacircngulo branco

cdrawRect(3575cgetWidth()-30 cgetHeight()-110p)

psetColor(0xFF0000FF) ciacuterculo azul

cdrawCircle(cgetWidth()2 cgetHeight()2 cgetHeight()4 p)

psetColor(0xFF00FF00) ciacuterculo verde

cdrawCircle(cgetWidth()2 cgetHeight()2 cgetHeight()8 p)

psetColor(0xFFFFFFFF) linha branca

cdrawLine(00 getWidth()()2 cgetHeight()2p)

A classe MinhaView derivada de View - parte 3

Pintamos uma figura em forma de oval

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

Ou resumindo seria ShapeDrawable fig2 = new ShapeDrawable(new OvalShape())

fig2getPaint()setColor(0x88FF0000) certa transparecircncia com 88

fig2setBounds(1010getWidth()2getHeight()2 + 20)

getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2draw(c)

psetColor(0xFFFFFFFF) para textos brancos

cdrawText(Observe a transparecircncia do oval vermelho 2 getHeight()-25 p)

cdrawText(Experimente touch e touch longo na tela 2 getHeight()-10 p)

break

case 2

cdrawText(Experimente agora touch simples na tela 2 getHeight()-10 p)

break natildeo pintamos nada neste caso

switch

meacutetodo onDraw

classe MinhaView

Exemplo 2

Neste segundo exemplo mostramos um programa Android com uma tela com diferentes elementos incluindo um objeto de uma classe derivada de View (veja na parte superior da figura)

Utilizaremos um arquivo mainxml para definir este layout

Observe que na tela temos dois objetos TextView dois Button um EditText e uma View

Atenderemos os eventos onClick e onLongClick

O layout da tela no arquivo mainxml 12

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical

androidlayout_width=fill_parent

androidlayout_height=fill_parent

androidgravity=center_horizontal gt

ltexemplosexemplograficos2MinhaView

androidid=+idminha_view

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_margin =3dp

androidlayout_weight=5 gt peso =gt quanto espaccedilo ocuparaacute esta view na tela

ltTextView

androidid=+iddigite_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Digite um valor de 1 a 5 gt

ltEditText

androidid=+idedita_text

androidlayout_width=58dp

androidlayout_height=40dp

androidgravity=center_horizontal

androidinputType=number

androidtextSize=16sp gt

O layout da tela no arquivo mainxml 22

ltButton

androidid=+idgraf_botao

androidlayout_width=115dp

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Graacutefico gt

ltTextView

androidid=+idinfo_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Experimente click e click longo nna aacuterea do graacutefico gt

ltButton

androidid=+idoutro_botao

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Outro botatildeo gt

ltLinearLayoutgt

A classe ActGraficos (extends Activity) - parte 1

package comtestegraficos

import androidappActivity

import androidosBundle

import androidviewView

import androidwidget

public class ActGraficos extends Activity

private MinhaView mView

private EditText editatipo

private Button botaooutrobotao

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

try

setContentView(Rlayoutmain)

mView = (MinhaView) findViewById(Ridminha_view) mViewsetFocusable(true) para que a View receba o foco em modo touch

editatipo = (EditText) findViewById(Ridedita_text)

grafbotao = (Button) findViewById(Ridgraf_botao)

outrobotao = (Button) findViewById(Ridoutro_botao)

catch(Exception e)

ToastmakeText(ActGraficosthis

nErron + egetMessage() + n ToastLENGTH_LONG)show()

A classe ActGraficos (extends Activity) - parte 2

grafbotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

int tipo = 1

try

tipo = IntegerparseInt(editatipogetText()toString())

catch(Exception ew1)

mViewsetTipoPaint(tipo)

mViewinvalidate()

)

outrobotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(ActGraficosthis

nLegal Evento click normal atendidon

ToastLENGTH_LONG)show()

)

A classe MinhaView (extends View) - parte 1

package comtestegraficos

import androidcontentContext

class MinhaView extends View private int tipopaint=3

public MinhaView(Context cx AttributeSet attrs)

super(cx attrs)

requestFocus()

final Context viewContext = cx

setOnClickListener(new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(viewContext

nnVamos invalidar a tela estado inicialnn ToastLENGTH_LONG)show()

tipopaint = 1

invalidate()

)

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

tipopaint = 2

invalidate()

return true

)

A classe MinhaView (extends View) - parte 2

public void setTipoPaintv02(int i)

tipopaint=i

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas

switch (tipopaint)

case 1

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFDDFF00)

Obs setBounds(int left int top int right int bottom)

fig1setBounds(003050)

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

fig2getPaint()setColor(0x44DD44FF)

Obs getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2setBounds(060getWidth()getHeight())

fig1draw(c)

fig2draw(c)

break

A classe MinhaView (extends View) - parte 3

case 2

psetColor(0xFFCCCCCC) cinza

cdrawRect(33getWidth()-6 getWidth() p)

psetColor(0xFF0000FF) azul

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()10 p)

psetColor(0xFFFF0000) vermelho

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()8 p)

psetColor(0xFF00FF00) verde

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()6 p)

psetColor(0xFFFFFF00) amarelo

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()4 p)

break case 3

break

case 4

break

case 5

break

switch

Exemplo 3

Neste terceiro exemplo mostramos um programa com dois elementos na tela um objeto de uma classe derivada de View e um TextView (texto na parte superior da tela)

Utilizaremos um arquivo mainxml para definir este layout

Neste programa quase natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onKeyDown e onTouchEvent para permitir o movimento do aviatildeo como resposta agrave accedilatildeo do usuaacuterio

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidlayout_width=fill_parent androidlayout_height=fill_parent

androidorientation=verticalgt

ltTextView

androidlayout_width=wrap_content androidlayout_height=wrap_content

androidtext=Viajando en avioacuten por el mundo

androidheight=40px

androidgravity=center gt

ltcompckaviaoAviaoView

androidid=+ididaviao

androidlayout_width=wrap_content androidlayout_height=wrap_content

gt

ltLinearLayoutgt

A classe AviaoView eacute derivada de View para trabalhar em modo graacutefico

Os arquivos utilizados neste exemplo

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 9: Android - Parte 7

A classe MinhaView derivada de View - parte 3

Pintamos uma figura em forma de oval

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

Ou resumindo seria ShapeDrawable fig2 = new ShapeDrawable(new OvalShape())

fig2getPaint()setColor(0x88FF0000) certa transparecircncia com 88

fig2setBounds(1010getWidth()2getHeight()2 + 20)

getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2draw(c)

psetColor(0xFFFFFFFF) para textos brancos

cdrawText(Observe a transparecircncia do oval vermelho 2 getHeight()-25 p)

cdrawText(Experimente touch e touch longo na tela 2 getHeight()-10 p)

break

case 2

cdrawText(Experimente agora touch simples na tela 2 getHeight()-10 p)

break natildeo pintamos nada neste caso

switch

meacutetodo onDraw

classe MinhaView

Exemplo 2

Neste segundo exemplo mostramos um programa Android com uma tela com diferentes elementos incluindo um objeto de uma classe derivada de View (veja na parte superior da figura)

Utilizaremos um arquivo mainxml para definir este layout

Observe que na tela temos dois objetos TextView dois Button um EditText e uma View

Atenderemos os eventos onClick e onLongClick

O layout da tela no arquivo mainxml 12

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical

androidlayout_width=fill_parent

androidlayout_height=fill_parent

androidgravity=center_horizontal gt

ltexemplosexemplograficos2MinhaView

androidid=+idminha_view

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_margin =3dp

androidlayout_weight=5 gt peso =gt quanto espaccedilo ocuparaacute esta view na tela

ltTextView

androidid=+iddigite_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Digite um valor de 1 a 5 gt

ltEditText

androidid=+idedita_text

androidlayout_width=58dp

androidlayout_height=40dp

androidgravity=center_horizontal

androidinputType=number

androidtextSize=16sp gt

O layout da tela no arquivo mainxml 22

ltButton

androidid=+idgraf_botao

androidlayout_width=115dp

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Graacutefico gt

ltTextView

androidid=+idinfo_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Experimente click e click longo nna aacuterea do graacutefico gt

ltButton

androidid=+idoutro_botao

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Outro botatildeo gt

ltLinearLayoutgt

A classe ActGraficos (extends Activity) - parte 1

package comtestegraficos

import androidappActivity

import androidosBundle

import androidviewView

import androidwidget

public class ActGraficos extends Activity

private MinhaView mView

private EditText editatipo

private Button botaooutrobotao

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

try

setContentView(Rlayoutmain)

mView = (MinhaView) findViewById(Ridminha_view) mViewsetFocusable(true) para que a View receba o foco em modo touch

editatipo = (EditText) findViewById(Ridedita_text)

grafbotao = (Button) findViewById(Ridgraf_botao)

outrobotao = (Button) findViewById(Ridoutro_botao)

catch(Exception e)

ToastmakeText(ActGraficosthis

nErron + egetMessage() + n ToastLENGTH_LONG)show()

A classe ActGraficos (extends Activity) - parte 2

grafbotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

int tipo = 1

try

tipo = IntegerparseInt(editatipogetText()toString())

catch(Exception ew1)

mViewsetTipoPaint(tipo)

mViewinvalidate()

)

outrobotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(ActGraficosthis

nLegal Evento click normal atendidon

ToastLENGTH_LONG)show()

)

A classe MinhaView (extends View) - parte 1

package comtestegraficos

import androidcontentContext

class MinhaView extends View private int tipopaint=3

public MinhaView(Context cx AttributeSet attrs)

super(cx attrs)

requestFocus()

final Context viewContext = cx

setOnClickListener(new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(viewContext

nnVamos invalidar a tela estado inicialnn ToastLENGTH_LONG)show()

tipopaint = 1

invalidate()

)

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

tipopaint = 2

invalidate()

return true

)

A classe MinhaView (extends View) - parte 2

public void setTipoPaintv02(int i)

tipopaint=i

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas

switch (tipopaint)

case 1

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFDDFF00)

Obs setBounds(int left int top int right int bottom)

fig1setBounds(003050)

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

fig2getPaint()setColor(0x44DD44FF)

Obs getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2setBounds(060getWidth()getHeight())

fig1draw(c)

fig2draw(c)

break

A classe MinhaView (extends View) - parte 3

case 2

psetColor(0xFFCCCCCC) cinza

cdrawRect(33getWidth()-6 getWidth() p)

psetColor(0xFF0000FF) azul

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()10 p)

psetColor(0xFFFF0000) vermelho

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()8 p)

psetColor(0xFF00FF00) verde

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()6 p)

psetColor(0xFFFFFF00) amarelo

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()4 p)

break case 3

break

case 4

break

case 5

break

switch

Exemplo 3

Neste terceiro exemplo mostramos um programa com dois elementos na tela um objeto de uma classe derivada de View e um TextView (texto na parte superior da tela)

Utilizaremos um arquivo mainxml para definir este layout

Neste programa quase natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onKeyDown e onTouchEvent para permitir o movimento do aviatildeo como resposta agrave accedilatildeo do usuaacuterio

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidlayout_width=fill_parent androidlayout_height=fill_parent

androidorientation=verticalgt

ltTextView

androidlayout_width=wrap_content androidlayout_height=wrap_content

androidtext=Viajando en avioacuten por el mundo

androidheight=40px

androidgravity=center gt

ltcompckaviaoAviaoView

androidid=+ididaviao

androidlayout_width=wrap_content androidlayout_height=wrap_content

gt

ltLinearLayoutgt

A classe AviaoView eacute derivada de View para trabalhar em modo graacutefico

Os arquivos utilizados neste exemplo

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 10: Android - Parte 7

Exemplo 2

Neste segundo exemplo mostramos um programa Android com uma tela com diferentes elementos incluindo um objeto de uma classe derivada de View (veja na parte superior da figura)

Utilizaremos um arquivo mainxml para definir este layout

Observe que na tela temos dois objetos TextView dois Button um EditText e uma View

Atenderemos os eventos onClick e onLongClick

O layout da tela no arquivo mainxml 12

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical

androidlayout_width=fill_parent

androidlayout_height=fill_parent

androidgravity=center_horizontal gt

ltexemplosexemplograficos2MinhaView

androidid=+idminha_view

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_margin =3dp

androidlayout_weight=5 gt peso =gt quanto espaccedilo ocuparaacute esta view na tela

ltTextView

androidid=+iddigite_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Digite um valor de 1 a 5 gt

ltEditText

androidid=+idedita_text

androidlayout_width=58dp

androidlayout_height=40dp

androidgravity=center_horizontal

androidinputType=number

androidtextSize=16sp gt

O layout da tela no arquivo mainxml 22

ltButton

androidid=+idgraf_botao

androidlayout_width=115dp

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Graacutefico gt

ltTextView

androidid=+idinfo_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Experimente click e click longo nna aacuterea do graacutefico gt

ltButton

androidid=+idoutro_botao

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Outro botatildeo gt

ltLinearLayoutgt

A classe ActGraficos (extends Activity) - parte 1

package comtestegraficos

import androidappActivity

import androidosBundle

import androidviewView

import androidwidget

public class ActGraficos extends Activity

private MinhaView mView

private EditText editatipo

private Button botaooutrobotao

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

try

setContentView(Rlayoutmain)

mView = (MinhaView) findViewById(Ridminha_view) mViewsetFocusable(true) para que a View receba o foco em modo touch

editatipo = (EditText) findViewById(Ridedita_text)

grafbotao = (Button) findViewById(Ridgraf_botao)

outrobotao = (Button) findViewById(Ridoutro_botao)

catch(Exception e)

ToastmakeText(ActGraficosthis

nErron + egetMessage() + n ToastLENGTH_LONG)show()

A classe ActGraficos (extends Activity) - parte 2

grafbotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

int tipo = 1

try

tipo = IntegerparseInt(editatipogetText()toString())

catch(Exception ew1)

mViewsetTipoPaint(tipo)

mViewinvalidate()

)

outrobotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(ActGraficosthis

nLegal Evento click normal atendidon

ToastLENGTH_LONG)show()

)

A classe MinhaView (extends View) - parte 1

package comtestegraficos

import androidcontentContext

class MinhaView extends View private int tipopaint=3

public MinhaView(Context cx AttributeSet attrs)

super(cx attrs)

requestFocus()

final Context viewContext = cx

setOnClickListener(new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(viewContext

nnVamos invalidar a tela estado inicialnn ToastLENGTH_LONG)show()

tipopaint = 1

invalidate()

)

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

tipopaint = 2

invalidate()

return true

)

A classe MinhaView (extends View) - parte 2

public void setTipoPaintv02(int i)

tipopaint=i

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas

switch (tipopaint)

case 1

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFDDFF00)

Obs setBounds(int left int top int right int bottom)

fig1setBounds(003050)

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

fig2getPaint()setColor(0x44DD44FF)

Obs getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2setBounds(060getWidth()getHeight())

fig1draw(c)

fig2draw(c)

break

A classe MinhaView (extends View) - parte 3

case 2

psetColor(0xFFCCCCCC) cinza

cdrawRect(33getWidth()-6 getWidth() p)

psetColor(0xFF0000FF) azul

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()10 p)

psetColor(0xFFFF0000) vermelho

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()8 p)

psetColor(0xFF00FF00) verde

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()6 p)

psetColor(0xFFFFFF00) amarelo

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()4 p)

break case 3

break

case 4

break

case 5

break

switch

Exemplo 3

Neste terceiro exemplo mostramos um programa com dois elementos na tela um objeto de uma classe derivada de View e um TextView (texto na parte superior da tela)

Utilizaremos um arquivo mainxml para definir este layout

Neste programa quase natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onKeyDown e onTouchEvent para permitir o movimento do aviatildeo como resposta agrave accedilatildeo do usuaacuterio

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidlayout_width=fill_parent androidlayout_height=fill_parent

androidorientation=verticalgt

ltTextView

androidlayout_width=wrap_content androidlayout_height=wrap_content

androidtext=Viajando en avioacuten por el mundo

androidheight=40px

androidgravity=center gt

ltcompckaviaoAviaoView

androidid=+ididaviao

androidlayout_width=wrap_content androidlayout_height=wrap_content

gt

ltLinearLayoutgt

A classe AviaoView eacute derivada de View para trabalhar em modo graacutefico

Os arquivos utilizados neste exemplo

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 11: Android - Parte 7

O layout da tela no arquivo mainxml 12

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical

androidlayout_width=fill_parent

androidlayout_height=fill_parent

androidgravity=center_horizontal gt

ltexemplosexemplograficos2MinhaView

androidid=+idminha_view

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_margin =3dp

androidlayout_weight=5 gt peso =gt quanto espaccedilo ocuparaacute esta view na tela

ltTextView

androidid=+iddigite_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Digite um valor de 1 a 5 gt

ltEditText

androidid=+idedita_text

androidlayout_width=58dp

androidlayout_height=40dp

androidgravity=center_horizontal

androidinputType=number

androidtextSize=16sp gt

O layout da tela no arquivo mainxml 22

ltButton

androidid=+idgraf_botao

androidlayout_width=115dp

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Graacutefico gt

ltTextView

androidid=+idinfo_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Experimente click e click longo nna aacuterea do graacutefico gt

ltButton

androidid=+idoutro_botao

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Outro botatildeo gt

ltLinearLayoutgt

A classe ActGraficos (extends Activity) - parte 1

package comtestegraficos

import androidappActivity

import androidosBundle

import androidviewView

import androidwidget

public class ActGraficos extends Activity

private MinhaView mView

private EditText editatipo

private Button botaooutrobotao

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

try

setContentView(Rlayoutmain)

mView = (MinhaView) findViewById(Ridminha_view) mViewsetFocusable(true) para que a View receba o foco em modo touch

editatipo = (EditText) findViewById(Ridedita_text)

grafbotao = (Button) findViewById(Ridgraf_botao)

outrobotao = (Button) findViewById(Ridoutro_botao)

catch(Exception e)

ToastmakeText(ActGraficosthis

nErron + egetMessage() + n ToastLENGTH_LONG)show()

A classe ActGraficos (extends Activity) - parte 2

grafbotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

int tipo = 1

try

tipo = IntegerparseInt(editatipogetText()toString())

catch(Exception ew1)

mViewsetTipoPaint(tipo)

mViewinvalidate()

)

outrobotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(ActGraficosthis

nLegal Evento click normal atendidon

ToastLENGTH_LONG)show()

)

A classe MinhaView (extends View) - parte 1

package comtestegraficos

import androidcontentContext

class MinhaView extends View private int tipopaint=3

public MinhaView(Context cx AttributeSet attrs)

super(cx attrs)

requestFocus()

final Context viewContext = cx

setOnClickListener(new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(viewContext

nnVamos invalidar a tela estado inicialnn ToastLENGTH_LONG)show()

tipopaint = 1

invalidate()

)

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

tipopaint = 2

invalidate()

return true

)

A classe MinhaView (extends View) - parte 2

public void setTipoPaintv02(int i)

tipopaint=i

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas

switch (tipopaint)

case 1

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFDDFF00)

Obs setBounds(int left int top int right int bottom)

fig1setBounds(003050)

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

fig2getPaint()setColor(0x44DD44FF)

Obs getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2setBounds(060getWidth()getHeight())

fig1draw(c)

fig2draw(c)

break

A classe MinhaView (extends View) - parte 3

case 2

psetColor(0xFFCCCCCC) cinza

cdrawRect(33getWidth()-6 getWidth() p)

psetColor(0xFF0000FF) azul

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()10 p)

psetColor(0xFFFF0000) vermelho

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()8 p)

psetColor(0xFF00FF00) verde

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()6 p)

psetColor(0xFFFFFF00) amarelo

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()4 p)

break case 3

break

case 4

break

case 5

break

switch

Exemplo 3

Neste terceiro exemplo mostramos um programa com dois elementos na tela um objeto de uma classe derivada de View e um TextView (texto na parte superior da tela)

Utilizaremos um arquivo mainxml para definir este layout

Neste programa quase natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onKeyDown e onTouchEvent para permitir o movimento do aviatildeo como resposta agrave accedilatildeo do usuaacuterio

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidlayout_width=fill_parent androidlayout_height=fill_parent

androidorientation=verticalgt

ltTextView

androidlayout_width=wrap_content androidlayout_height=wrap_content

androidtext=Viajando en avioacuten por el mundo

androidheight=40px

androidgravity=center gt

ltcompckaviaoAviaoView

androidid=+ididaviao

androidlayout_width=wrap_content androidlayout_height=wrap_content

gt

ltLinearLayoutgt

A classe AviaoView eacute derivada de View para trabalhar em modo graacutefico

Os arquivos utilizados neste exemplo

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 12: Android - Parte 7

O layout da tela no arquivo mainxml 22

ltButton

androidid=+idgraf_botao

androidlayout_width=115dp

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Graacutefico gt

ltTextView

androidid=+idinfo_text

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidgravity=center_horizontal

androidtext=Experimente click e click longo nna aacuterea do graacutefico gt

ltButton

androidid=+idoutro_botao

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_marginLeft=20dp

androidlayout_marginRight=20dp

androidtext=Outro botatildeo gt

ltLinearLayoutgt

A classe ActGraficos (extends Activity) - parte 1

package comtestegraficos

import androidappActivity

import androidosBundle

import androidviewView

import androidwidget

public class ActGraficos extends Activity

private MinhaView mView

private EditText editatipo

private Button botaooutrobotao

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

try

setContentView(Rlayoutmain)

mView = (MinhaView) findViewById(Ridminha_view) mViewsetFocusable(true) para que a View receba o foco em modo touch

editatipo = (EditText) findViewById(Ridedita_text)

grafbotao = (Button) findViewById(Ridgraf_botao)

outrobotao = (Button) findViewById(Ridoutro_botao)

catch(Exception e)

ToastmakeText(ActGraficosthis

nErron + egetMessage() + n ToastLENGTH_LONG)show()

A classe ActGraficos (extends Activity) - parte 2

grafbotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

int tipo = 1

try

tipo = IntegerparseInt(editatipogetText()toString())

catch(Exception ew1)

mViewsetTipoPaint(tipo)

mViewinvalidate()

)

outrobotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(ActGraficosthis

nLegal Evento click normal atendidon

ToastLENGTH_LONG)show()

)

A classe MinhaView (extends View) - parte 1

package comtestegraficos

import androidcontentContext

class MinhaView extends View private int tipopaint=3

public MinhaView(Context cx AttributeSet attrs)

super(cx attrs)

requestFocus()

final Context viewContext = cx

setOnClickListener(new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(viewContext

nnVamos invalidar a tela estado inicialnn ToastLENGTH_LONG)show()

tipopaint = 1

invalidate()

)

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

tipopaint = 2

invalidate()

return true

)

A classe MinhaView (extends View) - parte 2

public void setTipoPaintv02(int i)

tipopaint=i

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas

switch (tipopaint)

case 1

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFDDFF00)

Obs setBounds(int left int top int right int bottom)

fig1setBounds(003050)

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

fig2getPaint()setColor(0x44DD44FF)

Obs getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2setBounds(060getWidth()getHeight())

fig1draw(c)

fig2draw(c)

break

A classe MinhaView (extends View) - parte 3

case 2

psetColor(0xFFCCCCCC) cinza

cdrawRect(33getWidth()-6 getWidth() p)

psetColor(0xFF0000FF) azul

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()10 p)

psetColor(0xFFFF0000) vermelho

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()8 p)

psetColor(0xFF00FF00) verde

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()6 p)

psetColor(0xFFFFFF00) amarelo

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()4 p)

break case 3

break

case 4

break

case 5

break

switch

Exemplo 3

Neste terceiro exemplo mostramos um programa com dois elementos na tela um objeto de uma classe derivada de View e um TextView (texto na parte superior da tela)

Utilizaremos um arquivo mainxml para definir este layout

Neste programa quase natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onKeyDown e onTouchEvent para permitir o movimento do aviatildeo como resposta agrave accedilatildeo do usuaacuterio

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidlayout_width=fill_parent androidlayout_height=fill_parent

androidorientation=verticalgt

ltTextView

androidlayout_width=wrap_content androidlayout_height=wrap_content

androidtext=Viajando en avioacuten por el mundo

androidheight=40px

androidgravity=center gt

ltcompckaviaoAviaoView

androidid=+ididaviao

androidlayout_width=wrap_content androidlayout_height=wrap_content

gt

ltLinearLayoutgt

A classe AviaoView eacute derivada de View para trabalhar em modo graacutefico

Os arquivos utilizados neste exemplo

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 13: Android - Parte 7

A classe ActGraficos (extends Activity) - parte 1

package comtestegraficos

import androidappActivity

import androidosBundle

import androidviewView

import androidwidget

public class ActGraficos extends Activity

private MinhaView mView

private EditText editatipo

private Button botaooutrobotao

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

try

setContentView(Rlayoutmain)

mView = (MinhaView) findViewById(Ridminha_view) mViewsetFocusable(true) para que a View receba o foco em modo touch

editatipo = (EditText) findViewById(Ridedita_text)

grafbotao = (Button) findViewById(Ridgraf_botao)

outrobotao = (Button) findViewById(Ridoutro_botao)

catch(Exception e)

ToastmakeText(ActGraficosthis

nErron + egetMessage() + n ToastLENGTH_LONG)show()

A classe ActGraficos (extends Activity) - parte 2

grafbotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

int tipo = 1

try

tipo = IntegerparseInt(editatipogetText()toString())

catch(Exception ew1)

mViewsetTipoPaint(tipo)

mViewinvalidate()

)

outrobotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(ActGraficosthis

nLegal Evento click normal atendidon

ToastLENGTH_LONG)show()

)

A classe MinhaView (extends View) - parte 1

package comtestegraficos

import androidcontentContext

class MinhaView extends View private int tipopaint=3

public MinhaView(Context cx AttributeSet attrs)

super(cx attrs)

requestFocus()

final Context viewContext = cx

setOnClickListener(new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(viewContext

nnVamos invalidar a tela estado inicialnn ToastLENGTH_LONG)show()

tipopaint = 1

invalidate()

)

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

tipopaint = 2

invalidate()

return true

)

A classe MinhaView (extends View) - parte 2

public void setTipoPaintv02(int i)

tipopaint=i

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas

switch (tipopaint)

case 1

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFDDFF00)

Obs setBounds(int left int top int right int bottom)

fig1setBounds(003050)

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

fig2getPaint()setColor(0x44DD44FF)

Obs getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2setBounds(060getWidth()getHeight())

fig1draw(c)

fig2draw(c)

break

A classe MinhaView (extends View) - parte 3

case 2

psetColor(0xFFCCCCCC) cinza

cdrawRect(33getWidth()-6 getWidth() p)

psetColor(0xFF0000FF) azul

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()10 p)

psetColor(0xFFFF0000) vermelho

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()8 p)

psetColor(0xFF00FF00) verde

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()6 p)

psetColor(0xFFFFFF00) amarelo

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()4 p)

break case 3

break

case 4

break

case 5

break

switch

Exemplo 3

Neste terceiro exemplo mostramos um programa com dois elementos na tela um objeto de uma classe derivada de View e um TextView (texto na parte superior da tela)

Utilizaremos um arquivo mainxml para definir este layout

Neste programa quase natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onKeyDown e onTouchEvent para permitir o movimento do aviatildeo como resposta agrave accedilatildeo do usuaacuterio

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidlayout_width=fill_parent androidlayout_height=fill_parent

androidorientation=verticalgt

ltTextView

androidlayout_width=wrap_content androidlayout_height=wrap_content

androidtext=Viajando en avioacuten por el mundo

androidheight=40px

androidgravity=center gt

ltcompckaviaoAviaoView

androidid=+ididaviao

androidlayout_width=wrap_content androidlayout_height=wrap_content

gt

ltLinearLayoutgt

A classe AviaoView eacute derivada de View para trabalhar em modo graacutefico

Os arquivos utilizados neste exemplo

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 14: Android - Parte 7

A classe ActGraficos (extends Activity) - parte 2

grafbotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

int tipo = 1

try

tipo = IntegerparseInt(editatipogetText()toString())

catch(Exception ew1)

mViewsetTipoPaint(tipo)

mViewinvalidate()

)

outrobotaosetOnClickListener (new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(ActGraficosthis

nLegal Evento click normal atendidon

ToastLENGTH_LONG)show()

)

A classe MinhaView (extends View) - parte 1

package comtestegraficos

import androidcontentContext

class MinhaView extends View private int tipopaint=3

public MinhaView(Context cx AttributeSet attrs)

super(cx attrs)

requestFocus()

final Context viewContext = cx

setOnClickListener(new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(viewContext

nnVamos invalidar a tela estado inicialnn ToastLENGTH_LONG)show()

tipopaint = 1

invalidate()

)

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

tipopaint = 2

invalidate()

return true

)

A classe MinhaView (extends View) - parte 2

public void setTipoPaintv02(int i)

tipopaint=i

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas

switch (tipopaint)

case 1

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFDDFF00)

Obs setBounds(int left int top int right int bottom)

fig1setBounds(003050)

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

fig2getPaint()setColor(0x44DD44FF)

Obs getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2setBounds(060getWidth()getHeight())

fig1draw(c)

fig2draw(c)

break

A classe MinhaView (extends View) - parte 3

case 2

psetColor(0xFFCCCCCC) cinza

cdrawRect(33getWidth()-6 getWidth() p)

psetColor(0xFF0000FF) azul

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()10 p)

psetColor(0xFFFF0000) vermelho

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()8 p)

psetColor(0xFF00FF00) verde

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()6 p)

psetColor(0xFFFFFF00) amarelo

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()4 p)

break case 3

break

case 4

break

case 5

break

switch

Exemplo 3

Neste terceiro exemplo mostramos um programa com dois elementos na tela um objeto de uma classe derivada de View e um TextView (texto na parte superior da tela)

Utilizaremos um arquivo mainxml para definir este layout

Neste programa quase natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onKeyDown e onTouchEvent para permitir o movimento do aviatildeo como resposta agrave accedilatildeo do usuaacuterio

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidlayout_width=fill_parent androidlayout_height=fill_parent

androidorientation=verticalgt

ltTextView

androidlayout_width=wrap_content androidlayout_height=wrap_content

androidtext=Viajando en avioacuten por el mundo

androidheight=40px

androidgravity=center gt

ltcompckaviaoAviaoView

androidid=+ididaviao

androidlayout_width=wrap_content androidlayout_height=wrap_content

gt

ltLinearLayoutgt

A classe AviaoView eacute derivada de View para trabalhar em modo graacutefico

Os arquivos utilizados neste exemplo

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 15: Android - Parte 7

A classe MinhaView (extends View) - parte 1

package comtestegraficos

import androidcontentContext

class MinhaView extends View private int tipopaint=3

public MinhaView(Context cx AttributeSet attrs)

super(cx attrs)

requestFocus()

final Context viewContext = cx

setOnClickListener(new ViewOnClickListener()

public void onClick(View v)

ToastmakeText(viewContext

nnVamos invalidar a tela estado inicialnn ToastLENGTH_LONG)show()

tipopaint = 1

invalidate()

)

setOnLongClickListener (new ViewOnLongClickListener()

public boolean onLongClick(View v)

ToastmakeText(viewContext

nnVamos limpar a tela sem pintar nadann ToastLENGTH_LONG)show()

tipopaint = 2

invalidate()

return true

)

A classe MinhaView (extends View) - parte 2

public void setTipoPaintv02(int i)

tipopaint=i

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas

switch (tipopaint)

case 1

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFDDFF00)

Obs setBounds(int left int top int right int bottom)

fig1setBounds(003050)

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

fig2getPaint()setColor(0x44DD44FF)

Obs getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2setBounds(060getWidth()getHeight())

fig1draw(c)

fig2draw(c)

break

A classe MinhaView (extends View) - parte 3

case 2

psetColor(0xFFCCCCCC) cinza

cdrawRect(33getWidth()-6 getWidth() p)

psetColor(0xFF0000FF) azul

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()10 p)

psetColor(0xFFFF0000) vermelho

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()8 p)

psetColor(0xFF00FF00) verde

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()6 p)

psetColor(0xFFFFFF00) amarelo

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()4 p)

break case 3

break

case 4

break

case 5

break

switch

Exemplo 3

Neste terceiro exemplo mostramos um programa com dois elementos na tela um objeto de uma classe derivada de View e um TextView (texto na parte superior da tela)

Utilizaremos um arquivo mainxml para definir este layout

Neste programa quase natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onKeyDown e onTouchEvent para permitir o movimento do aviatildeo como resposta agrave accedilatildeo do usuaacuterio

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidlayout_width=fill_parent androidlayout_height=fill_parent

androidorientation=verticalgt

ltTextView

androidlayout_width=wrap_content androidlayout_height=wrap_content

androidtext=Viajando en avioacuten por el mundo

androidheight=40px

androidgravity=center gt

ltcompckaviaoAviaoView

androidid=+ididaviao

androidlayout_width=wrap_content androidlayout_height=wrap_content

gt

ltLinearLayoutgt

A classe AviaoView eacute derivada de View para trabalhar em modo graacutefico

Os arquivos utilizados neste exemplo

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 16: Android - Parte 7

A classe MinhaView (extends View) - parte 2

public void setTipoPaintv02(int i)

tipopaint=i

Override protected void onDraw(Canvas c)

Paint p = new Paint()

psetAntiAlias(true) para suavizar as bordas

switch (tipopaint)

case 1

ShapeDrawable fig1 = new ShapeDrawable(new RectShape())

fig1getPaint()setColor(0xFFDDFF00)

Obs setBounds(int left int top int right int bottom)

fig1setBounds(003050)

OvalShape ov

ov = new OvalShape()

ShapeDrawable fig2 = new ShapeDrawable(ov)

fig2getPaint()setColor(0x44DD44FF)

Obs getWidth() e getHeight() satildeo valores relativos agrave aacuterea da View graacutefica

fig2setBounds(060getWidth()getHeight())

fig1draw(c)

fig2draw(c)

break

A classe MinhaView (extends View) - parte 3

case 2

psetColor(0xFFCCCCCC) cinza

cdrawRect(33getWidth()-6 getWidth() p)

psetColor(0xFF0000FF) azul

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()10 p)

psetColor(0xFFFF0000) vermelho

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()8 p)

psetColor(0xFF00FF00) verde

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()6 p)

psetColor(0xFFFFFF00) amarelo

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()4 p)

break case 3

break

case 4

break

case 5

break

switch

Exemplo 3

Neste terceiro exemplo mostramos um programa com dois elementos na tela um objeto de uma classe derivada de View e um TextView (texto na parte superior da tela)

Utilizaremos um arquivo mainxml para definir este layout

Neste programa quase natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onKeyDown e onTouchEvent para permitir o movimento do aviatildeo como resposta agrave accedilatildeo do usuaacuterio

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidlayout_width=fill_parent androidlayout_height=fill_parent

androidorientation=verticalgt

ltTextView

androidlayout_width=wrap_content androidlayout_height=wrap_content

androidtext=Viajando en avioacuten por el mundo

androidheight=40px

androidgravity=center gt

ltcompckaviaoAviaoView

androidid=+ididaviao

androidlayout_width=wrap_content androidlayout_height=wrap_content

gt

ltLinearLayoutgt

A classe AviaoView eacute derivada de View para trabalhar em modo graacutefico

Os arquivos utilizados neste exemplo

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 17: Android - Parte 7

A classe MinhaView (extends View) - parte 3

case 2

psetColor(0xFFCCCCCC) cinza

cdrawRect(33getWidth()-6 getWidth() p)

psetColor(0xFF0000FF) azul

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()10 p)

psetColor(0xFFFF0000) vermelho

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()8 p)

psetColor(0xFF00FF00) verde

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()6 p)

psetColor(0xFFFFFF00) amarelo

cdrawCircle(getWidth()2 getHeight()2 getWidth()26f-getWidth()4 p)

break case 3

break

case 4

break

case 5

break

switch

Exemplo 3

Neste terceiro exemplo mostramos um programa com dois elementos na tela um objeto de uma classe derivada de View e um TextView (texto na parte superior da tela)

Utilizaremos um arquivo mainxml para definir este layout

Neste programa quase natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onKeyDown e onTouchEvent para permitir o movimento do aviatildeo como resposta agrave accedilatildeo do usuaacuterio

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidlayout_width=fill_parent androidlayout_height=fill_parent

androidorientation=verticalgt

ltTextView

androidlayout_width=wrap_content androidlayout_height=wrap_content

androidtext=Viajando en avioacuten por el mundo

androidheight=40px

androidgravity=center gt

ltcompckaviaoAviaoView

androidid=+ididaviao

androidlayout_width=wrap_content androidlayout_height=wrap_content

gt

ltLinearLayoutgt

A classe AviaoView eacute derivada de View para trabalhar em modo graacutefico

Os arquivos utilizados neste exemplo

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 18: Android - Parte 7

Exemplo 3

Neste terceiro exemplo mostramos um programa com dois elementos na tela um objeto de uma classe derivada de View e um TextView (texto na parte superior da tela)

Utilizaremos um arquivo mainxml para definir este layout

Neste programa quase natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onKeyDown e onTouchEvent para permitir o movimento do aviatildeo como resposta agrave accedilatildeo do usuaacuterio

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidlayout_width=fill_parent androidlayout_height=fill_parent

androidorientation=verticalgt

ltTextView

androidlayout_width=wrap_content androidlayout_height=wrap_content

androidtext=Viajando en avioacuten por el mundo

androidheight=40px

androidgravity=center gt

ltcompckaviaoAviaoView

androidid=+ididaviao

androidlayout_width=wrap_content androidlayout_height=wrap_content

gt

ltLinearLayoutgt

A classe AviaoView eacute derivada de View para trabalhar em modo graacutefico

Os arquivos utilizados neste exemplo

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 19: Android - Parte 7

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidlayout_width=fill_parent androidlayout_height=fill_parent

androidorientation=verticalgt

ltTextView

androidlayout_width=wrap_content androidlayout_height=wrap_content

androidtext=Viajando en avioacuten por el mundo

androidheight=40px

androidgravity=center gt

ltcompckaviaoAviaoView

androidid=+ididaviao

androidlayout_width=wrap_content androidlayout_height=wrap_content

gt

ltLinearLayoutgt

A classe AviaoView eacute derivada de View para trabalhar em modo graacutefico

Os arquivos utilizados neste exemplo

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 20: Android - Parte 7

Os arquivos utilizados neste exemplo

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 21: Android - Parte 7

A classe Aviao (extends Activity)

package compckaviao import androidappActivity import androidosBundle public class Aviao extends Activity Override public void onCreate(Bundle icicle) superonCreate(icicle) setContentView(Rlayoutmain)

Observe que esta classe soacute define o layout da tela (descrito em mainxml)

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 22: Android - Parte 7

A classe AviaoView (extends View) - Construtor

package compckaviao

+import androidcontentContext

public class AviaoView extends View

private Drawable imgAviao

private Drawable bandeira

private float x y xband yband xycentro do aviatildeo xbandyband pos da bandeira

private int passo = 20

private int larg alt largband altband largalt do aviatildeo larbandaltband da band

private boolean pressionado = false

private Context ctx

public AviaoView(Context context AttributeSet atts)

super(context atts)

ctx = context

Colocamos a imagem de fundo da view

setBackgroundResource(Rdrawablemundo)

Pegamos uma referecircncia agrave imagem do aviatildeo e de uma bandeira

imgAviao = contextgetResources()getDrawable(Rdrawableaviao)

bandeira = contextgetResources()getDrawable(Rdrawableitalia)

Recuperamos a largura e altura das imagens (aviatildeo e bandeiras)

larg = imgAviaogetIntrinsicWidth()

alt = imgAviaogetIntrinsicHeight()

largband = bandeiragetIntrinsicWidth()

altband = bandeiragetIntrinsicHeight()

x = 15 y = 120 xband = -100 yband = -100 posiccedilatildeo inicial

Permitimos que esta View receba o foco e trate eventos de teclado

setFocusable(true)

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 23: Android - Parte 7

A classe AviaoView - O meacutetodo onDraw (ver a loacutegica no proacuteximo slide)

public void onDraw(Canvas canvas)

superonDraw(canvas)

Paint p = new Paint()

canvasdrawCircle(xband yband 8 p)

psetColor(0xFF00FF00) usar psetStyle(StyleSTROKE) para apenas pintar a borda

canvasdrawCircle(xband yband 10 p) ciacuterculo verde

if(Mathabs(xbandthisgetWidth()-0366)lt=009

ampamp Mathabs(ybandthisgetHeight()-0861)lt=009) Brasil

bandeira = getResources()getDrawable(Rdrawablebrasil)

if(Mathabs(xbandthisgetWidth()-0742)lt=003

ampamp Mathabs(ybandthisgetHeight()-0414)lt=003) Itaacutelia

bandeira = getResources()getDrawable(Rdrawableitalia)

if(Mathabs(xbandthisgetWidth()-01598)lt=003

ampamp Mathabs(ybandthisgetHeight()-0506)lt=003) Cuba

bandeira = getResources()getDrawable(Rdrawablecuba)

if(Mathabs(xbandthisgetWidth()-0667)lt=003

ampamp Mathabs(ybandthisgetHeight()-0434)lt=003) Espanha

bandeira = getResources()getDrawable(Rdrawableespana)

if(Mathabs(xbandthisgetWidth()-0188)lt=009

ampamp Mathabs(ybandthisgetHeight()-0406)lt=009) USA

bandeira = getResources()getDrawable(Rdrawableusa)

colocamos a bandeira na posiccedilatildeo xbandyband e o aviatildeo na posiccedilatildeo xy

bandeirasetBounds((int)(xband + largband2)

(int)(yband-altband)(int)(xband + largband + largband2) (int)yband)

bandeiradraw(canvas)

imgAviaosetBounds((int)x (int)(y - alt) (int)(x + larg) (int)y )

imgAviaodraw(canvas)

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 24: Android - Parte 7

Identificando coordenadas (pontos) na tela independente da resoluccedilatildeo do aparelho Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight() + nnn

ToastLENGTH_LONG)show()

Por exemplo se as coordenadas divididas pela largura ou altura da tela ao clicar no centro aproximado do Brasil satildeo 0366 e 0861 (sendo 009 uma folga com relaccedilatildeo a esses pontos) entatildeo no meacutetodo onDraw if(Mathabs(xbandthisgetWidth()- 0366)lt= 009

ampamp Mathabs(ybandthisgetHeight()- 0861)lt= 009)

pintar a bandeira do Brasil

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 25: Android - Parte 7

A classe AviaoView - O meacutetodo onKeyDown

Override

public boolean onKeyDown(int codigoTecla KeyEvent evento)

Para mover o aviatildeo por teclas de cursor caso exista um teclado fiacutesico ou virtual

boolean repintar = true

switch (codigoTecla)

case KeyEventKEYCODE_DPAD_UP

y -= passo

break

case KeyEventKEYCODE_DPAD_DOWN

y += passo

break

case KeyEventKEYCODE_DPAD_LEFT

x -= passo

break

case KeyEventKEYCODE_DPAD_RIGHT

x += passo

break

default

repintar = false

if (repintar)

invalidate()

return true

return superonKeyDown(codigoTecla evento)

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 26: Android - Parte 7

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 1

Override

public boolean onTouchEvent(MotionEvent event)

Para mover o aviatildeo por operaccedilatildeo de tipo drag and drop

float x = eventgetX()

float y = eventgetY()

switch (eventgetAction())

case MotionEventACTION_DOWN

Inicia o movimento se pressionou a imagem

pressionado = imgAviaocopyBounds()contains((int) x (int) y)

Para identificar pontos no mapa saber suas posiccedilotildees relativas

independente das resoluccedilotildees e tamanhos de telas dos diferentes aparelhos

ToastmakeText(ctx xthisgetWidth() + xthisgetWidth()

+ ythisgetHeight() + ythisgetHeight()

+ nnn ToastLENGTH_LONG)show()

break

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 27: Android - Parte 7

A classe AviaoView - O meacutetodo onTouchEvent ndash Parte 2

case MotionEventACTION_MOVE

Arrastamos o aviatildeo

if (pressionado)

thisx = (int) x - (larg 2)

thisy = (int) y - (alt 4)

thisxband = (int) x - largband2

thisyband = (int) y - 2altband

break

case MotionEventACTION_UP

Terminamos o movimento

if(pressionado)

Context ctx = getContext()

AudioManager som =

(AudioManager)ctxgetSystemService(ContextAUDIO_SERVICE)

somplaySoundEffect(SoundEffectConstantsCLICK)

pressionado = false

break

invalidate() lembre que chamar este meacutetodo provocaraacute executar onDraw

return true

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 28: Android - Parte 7

Sensores em Android

Constants

int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type

int TYPE_ALL A constant describing all sensor types

int TYPE_GRAVITY A constant describing a gravity sensor type

int TYPE_GYROSCOPE A constant describing a gyroscope sensor type

int TYPE_LIGHT A constant describing an light sensor type

int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type

int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type

int TYPE_ORIENTATION This constant is deprecated use SensorManagergetOrientation() instead

int TYPE_PRESSURE A constant describing a pressure sensor type

int TYPE_PROXIMITY A constant describing an proximity sensor type

int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type

int TYPE_TEMPERATURE A constant describing a temperature sensor type

Fonte Classe Sensor (em httpdeveloperandroidcomreferenceandroidhardwareSensorhtml) httpdeveloperandroidcomreferenceandroidhardwareSensorEventhtmlvalues

Obs Consulte com o fabricante do aparelho os sensores disponiacuteveis

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 29: Android - Parte 7

Exemplo 4 Obs o simulador natildeo permite testar sensores

Neste quarto exemplo mostramos um programa com um elemento na tela um objeto da classe ImageView

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png Tambeacutem utilizaremos sons preparados em arquivos wav

Atenderemos os eventos onResume onPause e onSensorChanged para trocar a figura e tocar um som como resposta agrave inclinaccedilatildeo do aparelho

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 30: Android - Parte 7

O layout da tela no arquivo mainxml

ltxml version=10 encoding=utf-8gt

ltLinearLayout xmlnsandroid=httpschemasandroidcomapkresandroid

androidorientation=vertical androidlayout_width=fill_parent

androidlayout_height=fill_parentgt

ltImageView

androidid=+idfoto1

androidlayout_width=wrap_content

androidlayout_height=wrap_content

androidlayout_gravity=center_horizontal gt

ltLinearLayoutgt

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 31: Android - Parte 7

Os arquivos utilizados neste exemplo

Sugestatildeo Consulte os detalhes da classe MediaPlayer em httpdeveloperandroidcomreferenceandroidmediaMediaPlayerhtml e os tipos de miacutedia permitidos por Android em httpdeveloperandroidcomguideappendixmedia-formatshtml

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 32: Android - Parte 7

A classe SensoresPerro (extends Activity) - Parte 1

package compcksensoresperro

import androidappActivity

import androidhardwareSensor

import androidhardwareSensorEvent

import androidhardwareSensorEventListener

import androidhardwareSensorManager

import androidmediaMediaPlayer

import androidosBundle

import androidwidgetImageView

import androidwidgetToast

public class SensoresPerro extends Activity implements SensorEventListener private SensorManager sensorManager manipulador de sensores

private Sensor sensor1sensor2sensor3 sensores

private float magnetic_values[] = null accelerometer_values [] = null

private boolean deitado=falseempe=false

private MediaPlayer late=null dorme = null

Called when the activity is first created

Override

public void onCreate(Bundle savedInstanceState)

superonCreate(savedInstanceState)

setContentView(Rlayoutmain)

try

late = MediaPlayercreate(this Rrawlatindo)

dorme = MediaPlayercreate(this Rrawdormindo)

catch (Exception e)

ToastmakeText(SensoresPerrothis nErron + egetMessage() + n ToastLENGTH_LONG)show()

Para manipular os sensores

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE)

sensor1 = sensorManagergetDefaultSensor(SensorTYPE_ORIENTATION)

sensor2 = sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER)

sensor3 = sensorManagergetDefaultSensor(SensorTYPE_MAGNETIC_FIELD)

Dois objetos da classe MediaPlayer (late e dorme) satildeo criados utilizando os arquivos de aacuteudio latindowav e dormindowav que se encontram na pasta raw Foram preparados sensores de orientaccedilatildeo de aceleroacutemetro e de campo magneacutetico

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 33: Android - Parte 7

A classe SensoresPerro (extends Activity) - Parte 2

Ativamos a atualizaccedilatildeo dos sensores quando a Activity eacute retomada

Override

protected void onResume()

superonResume()

sensorManagerregisterListener(this sensor1 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor2 SensorManagerSENSOR_DELAY_NORMAL)

sensorManagerregisterListener(this sensor3 SensorManagerSENSOR_DELAY_NORMAL)

Paramos a atualizaccedilatildeo dos sensores quando a Activity fique em pausa

Override

protected void onPause()

superonPause()

sensorManagerunregisterListener(this sensor1)

sensorManagerunregisterListener(this sensor2)

sensorManagerunregisterListener(this sensor3)

public void onAccuracyChanged(Sensor sensor int accuracy)

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 34: Android - Parte 7

A classe SensoresPerro (extends Activity) - Parte 3

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnetic_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone() preencher vetor

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

float[] Rm = new float[9]

float[] In = new float[9]

SensorManagergetRotationMatrix(Rm In thisaccelerometer_values thismagnetic_values) gera Rm

float[] actual_orientation = new float[3]

SensorManagergetOrientation(Rm actual_orientation) gera actual_orientation actual_orientation[0] azimuth rotation around the Z axis

actual_orientation[1]

pitch rotation around the X axis posiccedilatildeo ldquoverticalrdquo

actual_orientation[2] roll rotation around the Y axis

Obs o meacutetodo getRotationMatrix necessita dos valores dos vetores do aceleroacutemetro e do sensor magneacutetico para gerar a

matriz de rotaccedilatildeo O meacutetodo getOrientation necessita a matriz de rotaccedilatildeo para poder gerar os valores do vetor de orientaccedilatildeo

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 35: Android - Parte 7

Sistema de coordenadas utilizado

Fonte httpdeveloperandroidcomreferenceandroidhardwareSensorManagerhtml

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 36: Android - Parte 7

A classe SensoresPerro (extends Activity) - Parte 4

Continuaccedilatildeo do evento onSensorChanged e do caso case SensorTYPE_ORIENTATION

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035 ||

Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

foto1setImageResource(Rdrawabledog1)

if(empe)

empe = true

deitado = false

try

latestart()

catch (Exception e)

else

foto1setImageResource(Rdrawabledog2)

if(deitado)

deitado = true

empe = false

try

dormestart()

catch (Exception e)

fim do if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

break

switch

meacutetodo onSensorChanged

classe SensoresPerro

Comparamos com π2 (157 que satildeo 90ordm) Se estiver proacuteximo do acircngulo 157 entatildeo o cachorro deveraacute ser mostrado em peacute figura dog1png Caso contraacuterio mostraremos o cachorro deitado figura dog2png

Um som especiacutefico seraacute tocado em cada caso com o meacutetodo start()

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 37: Android - Parte 7

Exemplo 5 - Rotaccedilatildeo de figuras

Neste quinto exemplo modificamos o Exemplo 4 Agora sem aacuteudio o cachorro daraacute voltas na tela com a ativaccedilatildeo dos sensores de orientaccedilatildeo

Utilizaremos um arquivo mainxml para definir este layout

Neste programa natildeo desenharemos porque utilizaremos figuras prontas em arquivos png

Atenderemos os eventos onResume onPause e onSensorChanged

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 38: Android - Parte 7

O meacutetodo onSensorChanged modificado

Override

public void onSensorChanged(SensorEvent event)

switch (eventsensorgetType())

case SensorTYPE_MAGNETIC_FIELD

thismagnitude_values = eventvaluesclone()

break

case SensorTYPE_ACCELEROMETER

thisaccelerometer_values = eventvaluesclone()

break

case SensorTYPE_ORIENTATION

if (thismagnitude_values = null ampamp thisaccelerometer_values = null)

aqui os comandos para obter a matriz de rotaccedilatildeo etc igual que no meacutetodo anterior

if( Mathabs(Mathabs(actual_orientation[1])-157)lt=035

|| Mathabs(Mathabs(actual_orientation[2])-157)lt=040 )

if(empe)

empe = true empe e deitado satildeo variaacuteveis globais

deitado = false

else

if(deitado)

deitado = true

empe = false

rodarCachorro() break fim do case SensorTYPE_ORIENTATION

switch

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 39: Android - Parte 7

O meacutetodo rodarCachorro

public void rodarCachorro () Bitmap bitmap = null

ImageView foto1 = (ImageView) findViewById(Ridfoto1)

Criamos um bitmap utilizando a figura em dog1png ou dog2png

if (empe) se o cachoro estiver em peacute

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog1)

else se o cachoro estiver durmindo

bitmap = BitmapFactorydecodeResource(getResources() Rdrawabledog2)

int largura = bitmapgetWidth()

int altura = bitmapgetHeight()

int novaLargura = 150

int novaAltura = 150

Calculamos a escala

float escalaLargura = ((float) novaLargura) largura

float escalaAltura = ((float) novaAltura) altura

Criamos uma matriz de transformaccedilatildeo para manipulaccedilatildeo da figura

com a escala e o acircngulo de rotaccedilatildeo (em graus) desejados Matrix matrix = new Matrix()

matrixpostScale(escalaLargura escalaAltura) redimensionaraacute a figura

angulo += 10 incremento de 10ordm no acircngulo do cachorro que seraacute mostrado (variaacutevel global)

matrixpostRotate(angulo) para rotar a figura

Criamos um novoBitmap usando o bitmap inicial e a matriz de transformaccedilatildeo antes preparada

Bitmap novoBitmap = BitmapcreateBitmap(bitmap 0 0 largura altura matrix true)

Finalmente criamos um bitmap desenhaacutevel que seraacute utilizado para alterar a imagem na tela

BitmapDrawable bitmapPintavel = new BitmapDrawable(novoBitmap)

foto1setImageDrawable(bitmapPintavel)

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 40: Android - Parte 7

Aplicativos para testes de sensores

Para verificar os sensores do seu aparelho vocecirc poderaacute instalar por exemplo o app Android Sensor Box Sensors ou AndroSensor todos disponiacuteveis gratuitamente na Google Play (fonte httpsplaygooglecomstoreapps)

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 41: Android - Parte 7

Mostrando um viacutedeo com a classe VideoView

A seguir um exemplo muito simples uma Activity que demonstra como utilizar a classe VideoView para mostrar um viacutedeo m3gp armazenado no cartatildeo de memoacuteria na pasta dcim

import androidwidgetMediaController import androidwidgetVideoView public class ExemploVideoView extends Activity Override public void onCreate(Bundle b) superonCreate(b) VideoView v = new VideoView(this) setContentView(v) vsetVideoPath(sdcarddcimm3gp) vsetMediaController(new MediaController(this)) vrequestFocus()

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009

Page 42: Android - Parte 7

Bibliografia sugerida

Bibliografia sugerida sobre Android

ANDROID Android Developers Disponiacutevel em httpdeveloperandroidcom LECHETA RICARDO R Google Android Aprenda a criar aplicaccedilotildees para dispositivos moacuteveis com o Android SDK Satildeo Paulo Novatec 2010 MEDNIEKS Z et al Desenvolvimento de Aplicaccedilotildees Android Satildeo Paulo Novatec 2009