280 likes | 380 Views
Jornada de Cursos – J2ME. Aula 4 – Interface de alto e baixo nível. Pausa para reflexão. "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan Tokuda , Mestre Zen. Agenda. Interface gráfica de baixo nível Overview Tratamento de eventos Timer e TimerTask.
E N D
Jornada de Cursos – J2ME Aula 4 – Interface de alto e baixo nível
Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan Tokuda, Mestre Zen
Agenda • Interface gráfica de baixo nível • Overview • Tratamento de eventos • Timer e TimerTask
Interface de baixo nível “Às vezes, a ignorância é uma bênção”
Overview • Graphics • Canvas • Tratamento de eventos
Graphics • Classe que provê métodos simples de renderização 2D em Canvas • Arcos, imagens, linhas, retângulos e texto podem ser desenhados • Não é instanciada diretamente
Graphics • Métodos principais • drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) • drawImage(Image img, int x, int y, int anchor) • drawLine(int x1, int y1, int x2, int y2) • drawString(String str, int x, int y, int anchor) • fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) • fillRect(int x, int y, int width, int height)
Graphics • Métodos principais - continuação • setClip(int x, int y, int width, int height) • setColor(int red, int green, int blue • setFont(Font font) • translate(int x, int y)
Canvas • Classe que herda de Displayable • Representa uma Área na tela que pode ser livremente desenhada e apagada • Fornece métodos para tratamento de eventos de teclas, “game actions” e “pointer actions” • Usa Graphics para desenho no Canvas • O programador cria uma subclasse de Canvas
Canvas • Métodos principais • int getGameAction (int keyCode) • int getKeyCode(int gameAction) • String getKeyName(int keyCode) • keyPressed(int keyCode) • keyReleased(int keyCode) • keyRepeated(int keyCode) • paint(Graphics g) • repaint()
Canvas - Exemplo import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class MyCanvas extends Canvas { private MIDlet midlet; public MyCanvas( MIDlet midlet ){ this.midlet = midlet; } protected void paint( Graphics g ){ g.setColor( 255, 255, 255 ); g.fillRect( 0, 0, getWidth(), getHeight() ); g.setColor( 0, 0, 0 ); g.drawString( "Hello there!", getWidth()/2, 0, g.TOP | g.HCENTER ); } }
Canvas – Exemplo (Cont.) public class MyMIDlet extends MIDlet { private Display display; private MyCanvas canvas; public MyMIDlet(){ display = Display.getDisplay( this ); canvas = new MyCanvas( this ); } ... protected void startApp(){ display.setCurrent( canvas ); } ... public void exit(){ destroyApp( true ); notifyDestroyed(); } }
Tratamento de eventos • Não é necessário criar um listener • public void keyPressed(int keyCode ) • public void keyRepeated(int keyCode ) • public voidkeyReleased(int keyCode ) • public void pointerPressed(int x, int y ) • public void pointerDragged(int x, int y ) • public void pointerReleased(int x, int y )
Game Actions • Aplicações portáveis que necessitem de teclas direcionais e eventos relacionados a jogos devem preferencialmente utilizar game actions a keyCodes • Game actions • UP, DOWN, LEFT, RIGHT, FIRE, GAME_A, GAME_B, GAME_C, GAME_D
Tratamento de eventos • int getGameAction(int keyCode) • Retorna a gameAction da tecla especificada • int getKeyCode(int gameAction) • Retorna o keyCode de uma gameAction • String getKeyName(int keyCode) • Retorna o nome da tecla especificada
Exemplo Public void keyPressed(int keyCode) { switch (keyCode) { case Canvas.KEY_NUM5: // tratamento da tecla 5 break; case Canvas.KEY_NUM9: // tratamento da tecla 9 break; } }
Exercício • Escreva uma aplicação que dado um evento de pressionamento de uma tecla imprime na tela o nome da tecla pressionada • Lembrando que eventos de tecla pressionada são tratados pelo método keyPressed() de Canvas
Manipulando imagens • Só pra relembrar • Imagens Estáticas • 1. Aloque a imagem Image im = Image.createImage(“/imageTest.png”); • 2. Mostre a imagem protected void paint(Graphics g) { ... g.drawImage(im, 10, 10, Graphics.LEFT | Graphics.TOP); ... • Imagens Dinâmicas • 1. Aloque a imagem Image im = Image.createImage(80, 20); • 2. Crie o conteúdo da imagem (usando arcs, rectangles, lines e text) // pegue o Graphics do objeto Graphics graphics = im.getGraphics(); // desenhe um retangulo preenchido graphics.fillRoundRect(0, 0, 50, 50, 20, 20); ... • 3. Mostre a imagem protected void paint(Graphics g) { ... g.drawImage(im, 10, 10, Graphics.LEFT | Graphics.TOP); ... }
Exercício • Escreva um MIDlet que reconhe Game Actions e desenha uma Imagem indicando qual tecla foi pressionada • Lembrando que as imagens devem ser preferencialmente em formato PNG • As teclas a serem reconhecidas são UP, DOWN, LEFT, RIGHT e FIRE (5)
Timer e TimerTask • Facilitam a execução de tarefas em segundo plano • Baseado no conceito de agendamento de tarefas, onde um cronômetro dispara uma tarefa a ser executada, uma única vez ou periodicamente • Timer: O agendador de tarefas • TimerTask: Executa uma tarefa
Timer • Fornece seis métodos para agendamento de tarefas • Dois deles para tarefas de execução única • schedule(TimerTask task, long delay) • schedule(TimerTask task, Date time)
Timer – Tarefas Repetitivas • void schedule(TimerTask task, long delay, long period) • void schedule(TimerTask task, Date firstTime, long period) • void scheduleAtFixedRate(TimerTask task, long delay, long period) • void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
TimerTask • Classe que representa uma Task • Possui três métodos • abstract void run() • public boolean cancel() • public long scheduledExecutionTime()
Utilizando Timer e TimerTask • Crie um Timer • Crie uma classe que estende de TimerTask • Escreva o método run dessa nova classe • Agende o timer passando a nova classe como parâmetro
Exemplo // Cria o Timer Timer tm = new Timer(); // Cria uma Task TodoTask tt = new TodoTask(); // Agenda o Timer para executar a task em 1000ms tm.schedule(tt, 1000); ... private class TodoTask extends TimerTask { public final void run() { // Faz alguma coisa } }
Código exemplo • http://www.cin.ufpe.br/~ela/jornada/Exemplos/TimerTaskMIDlet.java
Referências • Core J2ME • Site da Sun • Wireless Programming with J2ME: Cracking the code, ISBN: 0-7645-4885-9