Desenvolva aplicações mobile para Android e iOS usando a plataforma de desenvolvimento TotalCross. Você cria o seu código em JAVA e entrega para os principais sistemas mobile e mais, também para desktops. Baixe gratuitamente pelo site www.totalcross.com
2. 2
Curso TotalCrossCurso TotalCross
Capítulo 1 – Introdução ao TotalCross
Capítulo 2 - Visão Geral da API
Capítulo 3 - Noções de Interface do Usuário
Capítulo 4 - Sincronização
3. 3
Capítulo 1 - Introdução aoCapítulo 1 - Introdução ao
TotalCrossTotalCross
Resumo
1.1 Introdução
1.2 Explorando o SDK
1.3 Configurando o Eclipse
1.4 Criando um Programa Mínimo
1.5 Executando como Aplicação
1.6 Fazendo o deploy
4. 4
1.1 Introdução1.1 Introdução
• Inteiramente desenvolvido no Brasil
– Início em 2001
• Máquina virtual baseada em registradores
– Requer um conversor de bytecodes para os tccodes
– Não suporta o tipo float, apenas double
• “Write Once Run Everywhere” real
• Plataformas suportadas
– Modernas: Android, iOS, Windows Phone 8.x
– Legado: Windows Mobile 5 e 6
– Desktop: Windows XP - 8, JDK, Linux
– Descontinuadas: Blackberry, Palm OS
5. 5
1.2 Explorando o SDK1.2 Explorando o SDK
• TotalCross3
– dist
• samples
• vm
– docs
• TotalCross Companion.pdf
• html
– etc
• Programas usados pelo deployer
– src
• fontes java
6. 6
1.3 Configurando o Eclipse1.3 Configurando o Eclipse
• Criando um projeto TotalCross
– Menu File / New / Java Project
• Project name: AloMundo
• Project layout: Create separate folders for sources
and class files
– Botão Next
• Certificar que Default output folder é AloMundo/bin
– Aba Libraries
• Add external jar
– TotalCross3/dist/tc.jar
• Expandir o tc.jar (clique sinal +)
– Source attachment / Edit / External Folder
» TotalCross3/src
– Finish
7. 7
1.4 Criando um Programa Mínimo1.4 Criando um Programa Mínimo
• A seguir, temos um programa que simplesmente
mostra um botão, exibindo uma mensagem de
saudação ao ser pressionado
• Clicar com botão direito na pasta src
– New / Class
• Name: AloMundo
• Superclass: totalcross.ui.MainWindow
8. 8
Classe
AloMundo
1 import totalcross.ui.*; import totalcross.ui.dialog.*;
2 import totalcross.ui.event.*;
3 public class AloMundo extends MainWindow
4 {
5 private Button btn;
6
7 public AloMundo()
8 {
9 super("Curso TotalCross", TAB_ONLY_BORDER);
10 setUIStyle(totalcross.sys.Settings.Android);
11 }
12
13 public void initUI()
14 {
15 add(btn = new Button("Olá!"), CENTER,CENTER);
16 }
17
18 public void onEvent(Event e)
19 {
10 if (e.type == ControlEvent.PRESSED && e.target == btn)
11 new MessageBox("Olá!",
12 "Bem vindo ao mundo da computação móvel!").popup();
13 }
14 }
1.4 Criando um Programa Mínimo1.4 Criando um Programa Mínimo
9. 9
1.5 Executando como Aplicação1.5 Executando como Aplicação
• Menu Run / Run configurations ( )
• Clicar Java aplication / Botão direito / New
• Aba Main
– Name: AloMundo
– Main class: totalcross.Launcher
• Aba Arguments
– Nome da classe principal (aquela que estende
totalcross.ui.MainWindow)
– Outros parâmetros para launcher.
– Testar:
• AloMundo
• /scr android AloMundo
• /scr 480x640x32 /fontsize 20 AloMundo
10. 10
1.6 Fazendo o deploy1.6 Fazendo o deploy
• Para executar a aplicação nos dispositivos, é
preciso empacotá-las
– Usa-se tc.Deploy, contido no tc.jar
• Passa-se apenas o nome da classe principal
– Informações são obtidas a partir do código fonte
– As classes e mídias referenciadas são
adicionadas automaticamente
– O pacote correto é detectado automaticamente
– Imagens bmp e gif são convertidas para PNG
– Todos os arquivos são comprimidos
• O empacotamento já chama o conversor e gera o
arquivo de saída TCZ
– TCZ = TotalCross Zip
• Diretórios de instalação são gerados
11. 11
1.6 Fazendo o deploy1.6 Fazendo o deploy
• Tudo fica simples com um build.xml de ANT
• Copiar o que está na pasta
– TotalCross3/docs/build.xml
… para a pasta do projeto
– Clicar F5 para atualizar
– Dar um clique-duplo no build.xml
– Editar propriedades:
• app.name = AloMundo
• target.dir = bin
– Salvar
• Clicar botão direito em build.xml
– Run as / Ant build
12. 12
1.6 Fazendo o deploy1.6 Fazendo o deploy
• Pastas criadas:
– install
• android: instalar apk usando adb.exe
• iOS: instalar com iTunes
• wp8: arquivo xap
• win32: clique no .exe
• wince: clicar no bat
• applet: rodar um dos html no browser
• linux: clique no executável
15. 15
2.2 Pacote totalcross.db/sql2.2 Pacote totalcross.db/sql
• Pacote DB possui a implementação Java do SQLite
– sqlite-jdbc
• Banco de dados portável mais usado no mundo
• Permite usar comandos SQL para manipular
arquivos de dados
• Poderoso, leve, baixo consumo de memória.
• Pacote totalcross.sql posssui uma implementação
parcial do JDBC para uso com o SQLite
– SQLiteUtil
util = new SQLiteUtil(Settings.appPath,"fb.db");
Statement st = util.con().createStatement();
st.execute("create table if not exists users
(name varchar, photo blob, active int)");
16. 16
2.3 Pacote totalcross.io2.3 Pacote totalcross.io
• Classes usadas em entrada e saída
– ByteArrayStream
– DataStream
– File
• BufferedStream
– LineReader
– device.bluetooth
– device.gps
– device.printer
– device.scanner
• Windows CE
• Android (ZXing)
18. 18
2.5 Pacote totalcross.lang2.5 Pacote totalcross.lang
• Compatível até Java 7
– Possui suporte a reflection e generics
– Não possui suporte a annotation
• Subconjunto do java.lang
– TotalCross: 49 classes
– Java 7: 103 classes
• Não se importa o totalcross.lang
– É usado apenas no conversor
19. 19
2.6 Pacote totalcross.map2.6 Pacote totalcross.map
• Suporte ao GoogleMaps
– iOS, android e windows phone
• No android permite desenhar
• Suporta também o Waze (iOS e android)
26. 26
Capítulo 3Capítulo 3
Noções de Interface do UsuárioNoções de Interface do Usuário
Resumo
3.1 Introdução
3.2 Estilos de Interface
3.3 totalcross.ui.Control
3.4 totalcross.ui.Container
3.5 totalcross.ui.Window
3.6 totalcross.ui.MainWindow
3.7 Window x Container
3.8 Adicionando Controles
3.9 Tratando Eventos
27. 27
3.1 Introdução3.1 Introdução
• Controles totalmente feitos em Java
– Facilidade de customização
• Biblioteca rica em controles de interface com o
usuário
• Diversas características embutidas – controles
multifuncionais
• Suporte automático para rotação de tela
• Leves
– Funcionam bem em CPUs de baixo poder de
processamento
30. 30
3.2 Estilos de Interface3.2 Estilos de Interface
• Todos os controles da biblioteca implementam
quatro tipos de interface
– Flat, Vista, Android, Holo
– Depreciados: PalmOS, WinCE
• Vista é o padrão. Para mudar o estilo, faça no
construtor da aplicação
setUIStyle(totalcross.sys.estilo);
33. 33
3.5 totalcross.ui.Window3.5 totalcross.ui.Window
• Estende totalcross.ui.Container
• Funciona como uma janela popup modal
• A janela pode ser arrastada pela tela
• Pode possuir um título e/ou uma borda
• Construtores: Window(), Window(título, tipoBorda)
• Eventos gerados
– ControlEvent.WINDOW_CLOSED
35. 35
3.7 Window x Container3.7 Window x Container
• Window: deve ser usado quando apenas uma parte
da tela for ocupada.
• Container: deve ser usado quando toda a tela deve
ser ocupada por controles.
– initUI: inicializa a interface com o usuário
• Nunca faça isso no construtor da classe!
– Uma aplicação típica possui dezenas de classes
que estendem Container.
– Container exibido é ativado usando o método
swapToTopmostWindow.
• Jamais addicione uma Window a um Container
– RuntimeException é disparada
– Use popup para exibi-la
36. 36
3.8 Adicionando Controles3.8 Adicionando Controles
• Posicionamento relativo
– Chave para gerar telas de interface com o
usuário, portável entre plataformas e resoluções
diferentes. Resoluções usuais:
• Windows Phone: 768x1280, 1080x1920
• iOS: 640x1136, 1536x2048
• Android: 480x800, 1600x2560
– Cada controle sabe o seu tamanho ideal
• Calculado com base em características (como
bordas), estilo da interface do usuário, e na
fonte escolhida para o controle
– Permite um ajuste fino em pixels, caso
necessário
• Opcionalmente, ajuste pela altura da fonte
37. 37
3.8 Adicionando Controles3.8 Adicionando Controles
• Posicionamento relativo
– Utiliza-se constantes para especificar a posição em relação
• Ao último controle adicionado
• A um controle qualquer especificado
• Container parente (primeiro controle adicionado)
– Constantes definidas na classe Control
• X: BEFORE, CENTER, AFTER, LEFT, RIGHT, SAME,
CENTER_OF, RIGHT_OF, KEEP, PARENTSIZE
• Y: BEFORE, CENTER, AFTER, TOP, BOTTOM, SAME,
CENTER_OF, BOTTOM_OF, KEEP, PARENTSIZE
• Largura e Altura: PREFERRED, SAME, FILL, FIT, KEEP,
WILL_RESIZE, SCREENSIZE, SCREENSIZEMIN,
SCREENSIZEMAX, PARENTSIZE, PARENTSIZEMIN,
PARENTSIZEMAX
– Para efetuar um ajuste fino, some ou subtraia um valor da
constante acima
42. 42
3.8 Adicionando Controles3.8 Adicionando Controles
• Métodos para adicionar e especificar o tamanho
– Classe totalcross.ui.Control
• setRect(x, y, largura, altura)
• setRect(x, y, largura, altura, relativoA)
– Classe totalcross.ui.Container
• add(controle)
• add(controle, x, y) – largura e altura =
PREFERRED
• add(controle, x, y, relativoA) – idem
• add(controle, x, y, largura, altura)
• add(controle, x, y, largura, altura, relativoA)
– Características do controle, se não forem as
padrões, devem ser modificadas antes de
chamar os métodos acima.
43. 43
3.9 Tratando Eventos3.9 Tratando Eventos
• TotalCross possui dois modelos de tratamento:
– JDK 1.02 (todos os eventos são enviados para um
único método)
• O método onEvent de cada controle é acionado,
propagando-se para cima na hierarquia até a
Window
• Pode-se evitar que o evento continue a ser
propagado marcando o flag consumed.
– JDK 1.1+ (dispatch/listener)
• implements XListener
• addXListener
45. 45
4.1 Sincronização online - Preâmbulo
• PessoaDB.getDadosSincronização
public static String[][] getDadosSincronizacao() {
RowIterator it = driver.getRowIterator("pessoa");
String[][] temp = new String[driver.getRowCount("pessoa")][];
String attrs[] = {"S","N","U","D"}; // synced,new,updated,deleted
int j =0;
while (it.nextNotSynced()) {
String[] line = new String[8];
line[0] = attrs[it.attr];
line[1] = it.getString(1);
line[2] = it.getDate(2).toString();
line[3] = Convert.toString(it.getDouble(3));
line[4] = it.getString(4);
line[5] = Convert.toString(it.getShort(5));
line[6] = Convert.toString(it.getShort(6));
line[7] = Convert.toString(it.getInt(7));
temp[j++] = line;
it.setSynced();
}
String[][] ret = new String[j][]; Vm.arrayCopy(temp, 0, ret, 0, j);
return ret;
}
46. 46
4.1 HttpStream
• Exemplo para sincronizar com um ASP usando POST
HttpStream.Options options = new HttpStream.Options();
options.doPost = true;
// prepara os dados
options.postData = dados;
// conecta no servidor
HttpStream hs = new HttpStream(new
URI("http://www.totalcross.com/curso_sync.asp"),
options);
// pega a resposta
for (String s; (s = hs.readLine()) != null; )
log(s,false);
• curso_sync.asp
<% Response.write("okn"); %>
47. 47
4.24.2 Webservices
• Utiliza-se a classe SOAP
– Faz compressão automática dos dados (até 90%)
– Funciona com servidores .Net e Java, dentre outros
– Suporta o envio de tipos primitivos e objetos simples
• Construtor:
– SOAP(method, uri)
• Principais métodos:
– execute, getAnswer
– setParam(param), setParam(param, nome)
• param pode ser um destes tipos: boolean,
boolean[], byte[], double, double[], int, int[],
String, String[]
• Atributos importantes: openTimeout, readTimeout,
writeTimeout, debug
48. 48
4.24.2 Webservices
• Exemplo
// prepara os dados
SOAP s = new SOAP("sincroniza",
"http://www.superwaba.net:8080/curso_sync/services/Web
App");
String[] linhas = ...;
s.setParam(linhas, "linhas");
s.execute();
// pega a resposta
String ans = (String)s.getAnswer();
if (ans != null)
log("Linhas processadas: "+ans);