curso básico j2me bruno pereira (bpe@cin.ufpe.br) carlos santos (cesps@cin.ufpe.br)

Post on 22-Apr-2015

113 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Curso básico j2me

Bruno Pereira (bpe@cin.ufpe.br)

Carlos Santos (cesps@cin.ufpe.br)

Ementa

Visão geral MIDLet Tratamento de eventos Interface alto nível + Registros Interface baixo nível Boas práticas

Metodologia Sobre o curso

Slides “on demand” Referência: Core j2me

Sobre as aulas Dúvidas ... todos nós temos

Avaliação (alunos) Projeto

Avaliação (instrutores)

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

Overview

Por que J2ME? Mudanças trazidas Dispositivos alvo Restrições { memória,

processamento } Mais informações

http://java.sun.com/j2me/reference/faqs/index.html

Arquitetura

Configurações

Parte “low level” Define requisitos de hardware Especificação para JVM Geralmente divide os dispositivos

segundo memória, poder de processamento, display, conectividade

Exemplo: CLDC e CDC

Profiles

Parte “high level” Extensão da configuração Provê bibliotecas para

implementação de aplicações para um dado tipo de dispositivo

Exemplo: MIDP

Máquina Virtual KVM (Kilo Virtual Machine)

Desenvolvida pela Sun MicroSystems CLDC estabelece uma “classe” de

dispositivos nos quais uma KVM roda “Existe vida” além da KVM

Dados comparativos 40 – 80 Kb (KVM) 20 – 40 Kb (heap) 16 bits a 25 MHz

J2ME

Enfim ... MIDP Mobile Information Device Profile

MIDP – Hierarquia de classes

Ambiente de desenvolvimento

Eclipse IDE v3.0 Sun Wireless Toolkit 2.1 Plugin EclipseME 0.7.5

Ambiente de desenvolvimento Configurando o plugin

Ambiente de desenvolvimento

Ambiente de desenvolvimento

Ambiente de desenvolvimento Configurando o Toolkit

Ambiente de desenvolvimento

Pausa para reflexão

O MIDlet

Aplicativo Java para MIDP Gerenciador de Aplicativos

Software responsável por instalar, remover e executar MIDlets

Dependente de dispositivo e implementado pelo fabricante

Um ou mais MIDlets podem ser empacotados num JAR

O MIDlet JAD (Java Application Descriptor)

Arquivo plain/text usado pelo Gerenciador de Aplicativos

Fornece informações sobre o arquivo JAR

Fornece meios para se passar parâmetros para o MIDlet

Campos obrigatórios: MIDlet-Name, MIDlet-Version, MIDlet-Vendor, MIDlet-n, MIDlet-Jar-URL, MIDlet-Jar-Size

Ciclo de vida do MIDlet PAUSA

Depois da chamada do construtor e antes da inicialização pelo Gerenciador

Durante o processo de execução ATIVO

MIDlet em execução Durante o processo de execução

DESTRUÍDO Desligada pelo Gerenciador Libera todos os recursos alocados

Estrutura de um MIDletimport javax.microedition.midlet.MIDlet;

public class helloWorld extends MIDlet {

public helloWorld () { System.out.println("helloWorld()");}

// obrigatorioprotected void startApp() {

System.out.println("startApp()");}

// obrigatorioprotected void pauseApp() {

System.out.println("pauseApp()");}

// obrigatorioprotected void destroyApp(boolean arg0) {

System.out.println("destroyApp()");}

}

Ciclo de vida - fluxograma

Display

Gerenciador de tela que controla o que é mostrado no dispositivo e quando

Recupera informações sobre a tela atual (cores suportadas, resolução, etc)

Objeto único para cada MIDlet Não é instanciado

Usando o Displaypublic class Test_Display extends MIDlet {private Display display;

// construtorpublic Test_Display() {display = Display.getDisplay(this);...}...}

Display – métodos principais

static Display getDisplay(MIDlet m) Retorna o objeto display deste MIDlet

Displayable getCurrent() Retorna o objeto displayable corrente

void setCurrent(Displayable d) Mostra um objeto displayable ()

Display – métodos principais int numColors()

Retorna o número de cores disponíveis boolean vibrate(int duration)

Ordena ou não a vibração do aparelho(midp 2.0)

boolean flashBackLight(int duration) Ordena ou não que a luz do aparelho

acenda(midp 2.0)

Displayable

Objeto que pode ser visto num dispositivo Screen

Objetos Displayable para Interface alto nível

Canvas Objetos Displayable para Interface baixo

nível

Displayable Screen

TextBox List Alert Form (ChoiceGroup, DateField,

TextField, Gauge, ImageItem, StringItem)

OBS: ticker – variável que pode ter ou não em um Displayable; texto que corre continuamente na tela.

Displayable

Ver se vai entrar com os Command... metodos...

Enfim um Hello Worldpublic class tratamentoEventos extends MIDlet{

private Display display;private TextBox tb;

// Construtorpublic tratamentoEventos() {

display = Display.getDisplay(this);tb = new TextBox("","Hello World",11,0);

}// O inicio da aplicacaoprotected void startApp() {

this.display.setCurrent(tb);}

}

Pausa para reflexão

Tratamento de eventos

Interface de alto nível

Overview

Quadro geral Objetos Command Objetos Item Command e CommandListener Item e ItemStateListener

Quadro geral

Eventos são essenciais para MIDlets, pois são chave para interatividade

Para gerenciarmos um evento: O Hardware reconhece o evento físico O software é notificado do evento O evento é tratado pelo programador

Objetos Command Contém informações sobre um evento Podem ser considerados como “botões”

Soft keys Teclas

O processo de eventos1. Criação do Objeto Command2. Adicionar o comando a um displayable3. Adicionar um receptor (listener) ao

displayable

Objetos Command Command cmdExit = new Command(“exit”,

Command.EXIT, 1) Argumentos

Nome para o comando Constante (OK, EXIT, HELP, BACK, etc) Prioridade

Constante Mapeia o posicionamento dos comandos na tela Depende da implementação do fabricante

Prioridade Útil para a organização dos comandos em Menus e de

botões de software na tela

CommandListener

É o “receptor” de um comando Método a ser sobrescrito:

commandAction (Command c, Displayable d )

Em commandAction é definido como o aplicativo deve se comportar quando um evento é disparado

Exemplo (façam rodar =D)private Form fmMain; private Command cmExit;fmMain = new Form(“Curso CITi"); ...cmExit = new Command("Exit", Command.EXIT, 1); // 1º passo...fmMain.addCommand(cmExit); //2º passofmMain.setCommandListener(this); // 3º passo...public void commandAction(Command c, Displayable s) {

if (c == cmExit) {destroyApp(true);notifyDestroyed();}

}

Exercitando ... Crie um MIDlet que contenha um Form

e controle três botões: Form fmMain = new Form(“Tela Principal”); Lembre-se que Form é um objeto

Displayable “exit”, usado para sair do MIDlet “hello” imprime “Hello World” “back” volta para a tela principal, após

o usuário ter visualizado a mensagem

Item

Qualquer componente que possa ser adicionado a um objeto Form (ver diagrama de classes)

Item é uma classe abstrata Métodos

String getLabel () Void setLabel (String label)

ItemStateListener

O receptor de eventos relacionados a objetos Item

Método a ser sobrescrito void itemStateChanged () Este método é chamado quando o

“item” tiver sofrido alteração que gere evento

Exemplo// cria o objeto Item

df = new DateField("Data :", DateField.DATE);

df.setDate(new java.util.Date());

// adiciona o objeto a um displayable

formMain.append(df);

// seta o receptor

formMain.setItemStateListener(this);

Exercitando ...

Crie um MIDlet com um DateField e que imprime “Item State Changed ...” quando seu estado é alterado

Para esta implementação pode ser usado System.out.println()

Pausa para reflexão

Interface de alto nível

Parte 1

Overview Screen Form Item StringItem DateField Gauge TextField Choice e ChoiceGroup Image e ImageItem

((

Screen

Classe progenitora Descendente direta de Displayable Métodos principais:

String getTitle () void setTitle(String title) Ticker getTicker () void setTicker (Ticker t)

Form Container que armazena vários

componentes que podem ser exibidos na tela

Métodos principais: int append (Item item) int append (String texto) void delete(int itemNum) Item get (int itemNum) int size ()

Form - Exemplo

Form fm = new Form(“Formulario”);...fm.append(item) // adiciona um item

...size = fm.size() // retorna o tamanho

...// seta o receptor para um evento com Item

fm.setItemStateListener (ItemStateListener)

Item

Componente que pode ser adicionado a um objeto Form

Subclasses ChoiceGroup, DateField , Gauge,

ImageItem, StringItem, TextField ItemStateListener

Interface a ser implementada para gerenciar eventos relacionados a Item

Item - Exemploprivate Form fmMain; // formularioprivate DateField dfToday; // o objeto DateField...fmMain = new Form("Core J2ME"); // instancia de FormdfToday = new DateField("Today:", DateField.DATE); // DateField...fmMain.append(dfToday); // adiciona Item (DateField) ao FormfmMain.setItemStateListener(this); // Gerencia os eventos de

Form...public void itemStateChanged(Item item) {if (item == dfToday)...}

StringItem Rótulo estático e mensagem de texto Não é editável Não reconhece eventos Métodos principais:

StringItem(String label, String text) String getText() – Obtém o valor atual do

texto Void setText(String text) – Configura o novo

valor do texto String getLabel() – Obtém o valor do rótulo

StringItem - Exemploprivate Form fmMain; // formularioPrivate StringItem siLogin; // o objeto StringItem...fmMain = new Form(“Jornada CITi"); // instancia

de FormsiLogin = newStringItem(“Login: ", “cesps”); //

StringItem...fmMain.append(siLogin); // adiciona Item

(StringItem) ao Form...

Alternativa ao StringItem

...private Form fmMain;int i = fmMain.append(“Login: cesps”);...StringItem tmp = (StringItem)

fmMain.get(i);...

Exercitando ... Construa um MIDlet simples que possui

dois botões (next e exit). Na primeira tela é exibido um StringItem com o label “Dados 1/2” e o texto “Nome: José”

Next: passa para uma outra tela, onde o label é “Dados 2/2” e texto “Fone: 555-5555”

Exit: sai da aplicação em qualquer das “duas” telas

Exercitando ...

Insira um texto (label) em um Form usando as duas maneiras aprendidas, em seguida recupere ambos na forma de StringItem e para cada um imprima no console o label e o texto.

O que você conclui?

DateField

Objeto Item que manipula de forma simples tipos Date (java.util)

Métodos principais: DateField (String label, int modo) Date getDate () void setDate(Date data)

DateField - Exemplo// criação do objeto DateField

DateField df = new DateField(“Data:”, DateField.DATE);

...java.util.Date dataAtual = new java.util.Date ();df.setDate(dataAtual); // seta a data do DateField

…df.getDate (); // recupera a data atual

DateField

Gauge São basicamente indicadores de

progresso de uma ação Existem dois modos de atualização

Interativo Não-interativo

Exemplos Controle de volume Progresso de download

Gauge – Continuação Métodos Principais

Gauge(String label, boolean interactive, int maxValue, int initialValue) - Construtor

int getValue() – Obtém o valor atual do medidor

void setValue(int value) – Configura o novo valor do medidor

Void setMaxValue(int maxValue) – Configura o novo valor máximo

Gauge - Exemplo// Gauge interativo

Gauge gInt = new Gauge(“Volume”, true, 20,2)Gauge nInt = new Gauge(“Volume”,false, 20,2)...// Seta um valor qualquer

gInt.setValue(10)nInt.setVaule(20)// Retorna o valor atual

gInt.getValue()nInt.getValue()

Gauge

TextField Caixa de texto para formulários Suporta múltiplas linhas Opção de filtrar a entrada de dados

CONSTRAINT_MASK ANY EMAILADDR NUMERIC PASSWORD PHONENUMBER URL

TextField - Continuação Métodos principais

TextField (String label, String text, int max, int constraints)

void delete(int offset, int length) int getChars(char[] data) void insert(String src, int position) String getString() int getConstraints() * int size()

* Usado com CONSTRAINT_MASK

TextField - Exemplo// cria um novo TextField com máscara para número de telefonetfPhone = new TextField("Phone:", "", 10,

TextField.PHONENUMBER);

…// recupera o textotf.getChars(arrayDestino);…// seta um Stringtf.setString(“Curso J2ME”);…

TextField

Choice e ChoiceGroup

Choice: Interface que define os métodos para se manipular vários tipos de seleções predefinidas

ChoiceGroup Implementa Choice Pode ser usado como CheckBox ou

RadioButton

ChoiceGroup - Continuação Tipos

EXCLUSIVE MULTIPLE

Métodos principais: ChoiceGroup(String label, int choiceType) int append(String stringPart, Image

imagePart) void insert(int elementNum, String

stringElement, Image imageElement) getSelectedIndex() boolean isSelected(int elementNum)

ChoiceGroup

Image Representa uma imagem a ser

exibida no display do dispositivo Tipos

Imutável: pode ser usada diretamente no Form, nas opções de um Choice ou em um Alert.

Mutável: mais flexível. Simplesmente um espaço de memória reservado em que poderá ser pintada a imagem

ImageItem Possibilita a exibição de uma imagem em

um objeto Form A exibição depende da implementação do

fabricante do dispositivo Métodos principais

ImageItem(String label, Image img, int layout, String altText)

ImageItem(String label, Image img, int layout, String altText)

void setImage(Image img) void setLayout(int layout)

ImageItem – Exemplo...try {

Image img = Image.createImage(“/citi.png”); Image img2 = Image.createImage(“/bird.png”);} catch (IOException ioe) { ... }...ImageItem imCiti = new ImageItem(null, img,

ImageItem.LAYOUT_DEFAULT);...fmMain.append(imCiti);...fmMain.append(Img2);

Interface de alto nível

Parte 2

Overview

Quadro Geral List TextBox Alert e AlertType Ticker

Quadro Geral

List

Semelhante a ChoiceGroup, entretanto não gera eventos de Item

Possui mais um tipo que é IMPLICIT, não implementado por ChoiceGroup

Não herda de Item, ao contrário de ChoiceGroup

List - Continuação

Métodos principais List(String title, int listType) int append(String stringPart, Image

imagePart) void delete(int elementNum) int getSelectedIndex() boolean isSelected(int elementNum) int size()

List - Exemplo

www/~cesps/ListDemo.java

List

TextBox

Caixa de texto que permite filtragem para certos tipos de caracteres

Semelhante a TextField Não herda de Item, ao contrário de

TextField

TextBox

Métodos principais: TextBox (String title, String text, int

maxSize, int constraints) void delete(int offset, int length) void insert(String src, int position) int getChars(char[] data) void setConstraints(int constraints) int size()

TextBox - Exemplo

textBox tb;...// instância de TextBox

tb = new TextBox(“TextBox”,””,20,TextField.ANY);...// seta o display

display.setCurrent(tb);…// recupera o texto

tb.getChars(arrayDestino);

TextBox

Exercitando ... Escreva um MIDlet que copia um

texto de um TextBox para outro. O texto deverá ser selecionado pela posição do cursor

Possui os seguintes comandos: EXIT: termina a aplicação COPY: copia o texto para outro TextBox BACK: volta para o TextBox da tela

inicial

Alert Caixa de diálogo simples que possui

uma imagem e um texto, ambos opcionais

Objetos Command (“botões”) não podem ser adicionados ao objeto Alert

A interatividade com o Alert fica a cargo do fabricante do dispositivo

Tipos Modal Timed

Alert - Continuação Pode ser usado diretamente por Display

ou usado em conjunto com um Displayable

Métodos principais: Alert(String title, String alertText, Image

alertImage, AlertType at) String getString() void setString(String str) int getTimeout() void setTimeout(int time)

Alert

AlertType

Classe especialmente útil Encapsula informações sobre o

Alert e possibilita o suporte a som Duas maneiras de se utilizar som

O objeto Alert possuindo um AlertType

Usando um método estático de AlertType chamando playSound

AlertType

Tipos ALARM: usado para uma notificação CONFIRMATION: confirmação de um

evento ou ação ERROR: indica que um erro foi

encontrado INFO: indica em geral uma informação

não-critíca ao usuário WARNING: indica problemas potenciais

Alert - ExemploForm fmMain;Alert alerta;...// instancia os objetos

fmMain = new Form(“Tela principal”);alerta = new Alert(“INFO”, “CURSO J2ME”, null,

AlertType.INFO);...// seta o alerta para ficar visível

display.setCurrent(alerta, fmMain);

Exercitando ...

Acrescente ao exercício de TextField um Alert ao abrir a aplicação antes da tela inicial e um Alert caso o par login e senha não seja igual a “adm” e “123” respectivamente.

Ticker

Representa um texto que rola na tela

É atributo de Screen Possui somente três métodos

principais Ticker (String texto) getString () setString (String texto)

Ticker - Exemplo// o Ticker e o objeto Screen

Form fmMain;Ticker testTicker;...// instância do Ticker

testTicker = new Ticker(“Teste Ticker”);…// seta o Ticker do Form

fmMain.setTicker(testTicker);…

Pausa para reflexão

Record Management System Gereciamento de registros

persistentes Registro

Identificador ligado a um array de bytes Equivalente a armazenamento em

arquivo de J2SE Classes para armazenar, recuperar,

enumerar, comparar e filtrar dados não-voláteis

RMS

Armazém de registros (RecordStore)

Nomenclatura Até 32 caracteres UNICODE (16 bits)

ID de registro Dado1 Array de bytes

2 Array de bytes

... ..

RMS

Compartilhamento de Registros

CONJUNTO 1

CONJUNTO 2

RMS

Informações adicionais Número da versão: um valor inteiro

que é incrementado a cada modificação do conteúdo do armazém

Indicação de data/hora: última modificação do armazém

A existência dos registros está limitada à do MIDlet que os criou

RMS - Métodos static RecordStore openRecordStore(String nome, boolean

criarSeNecessario);

void closeRecordStore();

void delete recordStore(String nome);

int addRecord(byte[] dados, int offset, int numBytes);

void setRecord(int recordId, byte[] novosDados, int offset, int numBytes);

byte[] getRecord(int recordId);

int getRecord(int recordId, byte[] buffer, int offset);

RMS – Métodos (Cont.) Int getNumRecords();

Long getLastModified();

String getName();

addRecordListener(RecordListener listener);

removeRecordListener(RecordListener listener);

RMS - Exemplo...RecordStore rs = null; String nome = “Carlos”;...try { rs = RecordStore.openRecordStore( “meusdados", true ); byte[] recData = nome.getBytes(); rs.addRecord(recData, 0, rec.length); //Grava dados ... //Recupera dados String retorno = new String( rs.getRecord(1) );

} catch( Exception e ) { // tratamento de excessão}

RecordEnumeration Interface que fornece métodos de

movimentação para frente e para trás em registros

Semelhante ao Iterator em J2SE Pode levar em conta filtros (para

pesquisa) e/ou comparadores (para ordenação)

Ex: classificar registros em ordem alfabética

RecordEnumeration

Métodos Principais RecordEnumerator enumerateRecords(RecordFilter filter,

RecordComparator comparator,

boolean keepUpdated); * byte nextRecord(); byte previousRecord(); Boolean hasNextElement(); Boolean hasPreviousElement(); Void keepUpdated(boolean keep);

* Método da classe RecordStore

Exemplo.....RecordEnumeration enum =

re.enumerateRecords(null, null, false);

while ( re.hasNextElement() ) {//armazena o próximo registro em um StringString str = new String(re.nextRecord());… processa algo…

}…

RecordComparator Interface para comparação entre

registros

Método a ser implementado Int compare(byte[] rec1, byte[] rec2);

Tipos de RecordComparator EQUIVALENT – rec1 é equivalente a rec2 FOLLOWS – rec1 vem depois de rec2 PRECEDES – rec1 vem antes de rec2

Exemplo...public class Comparador implements RecordComparator {

public int compare(byte rec1, byte rec2) {String str1 = new String(rec1);String str2 = new String(rec2);

int resultado = str1.compareTo(str2);if (resultado == 0)

return RecordComparator.EQUIVALENT;else if (result < 0)

return RecordComparator.PRECEDES;else

return RecordComparator.FOLLOWS;}

}

Exemplo (Cont.)...//Cria um novo comparador para ordenarComparador comp = new Comparador();

//Referencia o comparador ao criar a enumeraçãoRecordEnumeration re = rs.enumerateRecords(null, comp, false);

//Faz a iteração nos registros, que já estarão ordenadosWhile ( re.hasPreviousElement ) {

... String s = new String(re.previousRecord());...

}…

RecordFilter

Interface para filtro de registros Apenas os resultados que

correspondem ao critério do filtro, farão parte do conjunto enumerador

Método a ser implementado Boolean matches(byte[] candidate)

Exemplo...class Filtro implements RecordFilter {

private String textoBuscado = null;

public Filtro(String textoBuscado) {//este é o texto a ser pesquisadothis.textoBuscado = textoBuscado.toLowerCase();

}

public boolean matches(byte[] candidato) {String str = new String(candidato).toLowerCase();//procura uma correspondênciaif ( textoBuscado != null && str.indexOf(textoBuscado) != -1 ) {

return true;} else {

return false;}

}}

Exemplo (Cont.)...//Cria um novo filtro de buscaFiltro busca = new Filtro(“Texto a ser buscado”);

//Referencia o filtro ao criar o enumeradorRecordEnumeration re = rs.enumerateRecords(busca, null, false);

/*Se houver pelo menos um registro no conjunto de resultados, uma correspondência foi encontrada*/

if (re.getNumRecords() > 0) {//Manipula os resultados

}…

RecordListener Notificação de que um registro foi

adicionado, removido ou atualizado Ex: Salvar preferências de um usuário

Opera como os outros Receptores de eventos já vistos em aula

Métodos a serem implementados void recordAdded(RecordStore rs, int recordId); void recordChanged(RecordStore rs, int recordId); void recordDeleted(RecordStore rs, int recordId);

RecordListener - Exemplo

Interface de baixo nível

“a ignorância é uma bênção”

Overview

Graphics Canvas Tratamento de eventos Boas práticas

Quadro Geral

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 – Sistema de Coordenadas

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 - Exemploimport 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

Key Codes

Exercitando ...

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

Tratamento de Eventos

Game Actions

Exercitando ... 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)

Manipulando imagens Imagens Estáticas

1. Aloque a imagemImage im = Image.createImage(“/imageTest.png”);

2. Mostre a imagemprotected 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 preenchidographics.fillRoundRect(0, 0, 50, 50, 20, 20);...

3. Mostre a imagemprotected void paint(Graphics g) {...g.drawImage(im, 10, 10, Graphics.LEFT | Graphics.TOP);...}

Pausa para reflexão

Boas práticas Representam práticas que previnem

contra uma série de erros básicos que podem ocorrer, além de evitar outros inconvenientes

Recomendadas, principalmente em se tratando de dispositivos limitados em termos de memória e processamento

“Nenhum homem é uma ilha”

Boas práticas para o projeto

Legibilidade de código Manter padrão de tabulação Comentários de classe, de métodos e

quando preciso de blocos de código Nomes de variáveis intuitivos Métodos semelhantes agrupados

Boas práticas para o projeto

Plataforma (Nokia S40) Display: 4096 cores, 128 x 128 pixels Tamanho Max. Jar: 64 KB

Exato! Incluindo código e imagens Limitações de som (não toca MIDI ou

MP3) Problemas com alocação de memória

Boas práticas para o projeto Desenvolvimento

Usar Simulador proprietário disponível em http://www.forum.nokia.com (Nokia 3300)

Criação de objetos somente se for necessário (sob demanda)

Evitar sobrecarregar a aplicação com muitos Threads e TimerTasks

Observar bem os métodos startApp() e paint(), geralmente são gargalos

Boas práticas para o projeto

Desenvolvimento – continuação Marcar referências certamente não mais

utilizadas para NULL Otimizar imagens, usando o formato PNG Separar ao máximo a lógica da aplicação

da parte que representa a GUI Evitar uso de Vectors e outras estruturas

dinâmicas, quando possível

Boas práticas para o projeto

Gerais Anote erros conhecidos Consulte sempre a API Não tente reinventar a roda Adquira um pé de coelho, você vai

precisar de um ...

Lembrem-se ...

"Sem esforço não há progresso, mas com esforço também não há progresso”

Ryotan Tokuda, Mestre Zen

Alguém enfim descobriu o que isto quer dizer ???

top related