android - parte 7
Post on 11-Aug-2015
92 Views
Preview:
TRANSCRIPT
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
top related