Splash screen me deixa triste

10 respostas
N

Dei uma olhada no código do NetBeans para gerar um Splash screen para meu aplicativo J2ME. Mas o código é tão extenso e eu fiquei pensando: tudo isso só para pôr uma imagem na tela por alguns segundos?

Porque não se pode apenas carregar uma imagem e fazer o clássico:

try { Thread.sleep(xmilesimos) }
catch(InterruptedException e) {}

?

Bom, em todo caso, se alguem puder me dar uma ajuda e me mostrar que é bem mais simples fazer uma Splash screen do que eu imagino, fiqie a vontade!

Obrigado.

10 Respostas

M

Porque você não cria uma classe do jeito que tu que ? tipo essa:
http://fivedots.coe.psu.ac.th/Software.coe/J2ME/splashScreen.txt

L

No site da SUN tem um tutorial que ensina a fazer uma splash screens (tela de apresentação) usando um simples alerta

public void showSplashScreen(Display d, Displayable next){
   Image logo = null;
   try {
      // res é a pasta padrão de imagens em um projeto de um MIDlet seguido do nome da imagem
      logo = Image.createImage("/res/logo.jpg");
    }
    catch( IOException e ){}
    
    Alert a = new Alert("Time Tracker", "Texto.", logo, null); 
    a.setTimeout(Alert.FOREVER);
    display.setCurrent(a, next);
}
public class ExMIDlet extends MIDlet implements CommandListener {

   private Display display;
   private Command exitCommand = new Command("Exit", Command.EXIT, 1 );

   //construtor
   public ExMIDlet(){}

   protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
        exitMIDlet();
   }

   protected void pauseApp(){}

   protected void startApp() throws MIDletStateChangeException {
      if(display == null){
           initMIDlet();
      }
   }

   private void initMIDlet(){
       display = Display.getDisplay( this );
       new SplashScreen(display, new TrivialForm() );
   }

   public void exitMIDlet(){
       notifyDestroyed();
   }

    public void commandAction(Command c, Displayable d ){
        exitMIDlet();
    }

    // uma tela (form) trivial p/ a splsh screen
    class TrivialForm extends Form {
        TrivialForm(){
            super("ExMIDlet");
            addCommand(exitCommand);
            setCommandListener(ExMIDlet.this);
        }
    }
}

retirado de: http://java.sun.com/developer/J2METechTips/2001/tt0820.html

um carinha deu uma outra idéia

public class ExMIDlet extends MIDlet implements CommandListener {

   //construtor
   public ExMIDlet(){}

   protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
        exitMIDlet();
   }

   protected void pauseApp(){}

   protected void startApp(){
      Displayable current = Display.getDisplay(this).getCurrent();
      if (current == null){
         //current = vazio, aplicacao iniciando hora de exibir a splash scrren
         SplashScreen splashScreen = new SplashScreen(this, mainMenu);
         Display.getDisplay(this).setCurrent(splashScreen);
         splashScreen.start();
      }

      void start(){
         if (timer != null)
            timer.cancel();
      }

      timer = new Timer();
      TimerTask dismissTask = new TimerTask(){
         public void run(){
            if (timer != null)
               // Cancela o timer (timer.cancel()) e exibe a prox tela de acordo c/ o Construtor
               dismiss();
         }
      };
      // termina com o splash depois de 4 segs
      timer.schedule(dismissTask, 4000L);
L

Splash Screen com J2ME Polish -> www.joefission.com/2006/05/j2me_polish_13_.html

Essa é boa tambem, usa thread http://developer.sonyericsson.com/site/global/techsupport/tipstrickscode/java/p_java_tips_0302_java_splashscreen.jsp

L

Um exemplo melhorado:

import java.io.IOException;
import java.util.*;
import javax.microedition.lcdui.*;
 
public class SplashScreen extends Canvas {
   private Display display;
   private Displayable next;
   private Image resim = null; // imagem a ser exibida
   private Timer timer = new Timer();
 
   public SplashScreen(Display display, Displayable next){
      this.display = display;
      this.next = next;
      display.setCurrent(this);
   }
 
   protected void keyPressed( int keyCode ){
      dismiss();
   }
 
   protected void paint( Graphics g ){
      try {
         g.setColor(255,255,255);
         g.drawRect(0,0,getWidth(),getHeight());
         resim = Image.createImage("/res/logo.png");
         g.drawImage (resim, getWidth () / 2, getHeight () / 2, Graphics.HCENTER | Graphics.VCENTER);
      } 
      catch (IOException ex) {
         System.out.println("logo não localizado!"+ex.toString());
      }
   }
 
   protected void pointerPressed(int x, int y){
      dismiss();
   }
    
   // tempo do splash: 5 segs
   protected void showNotify(){
      timer.schedule(new CountDown(), 5000);
   }
    
   // cancela splash ao pressionar qualquer butão após os 5 segs
   private void dismiss(){
      timer.cancel();        
      display.setCurrent(next);        
   }
    
   private class CountDown extends TimerTask {
      public void run(){
         dismiss();
      }
   }
}

em seguida o pode chamar o menu após a splash screen

private void initMIDlet(){
   Display screen = Display.getDisplay(this);
   new SplashScreen(screen ,menu);
}

retirado de: http://today.java.net/pub/a/today/2006/04/25/writing-cool-games-for-mobile-devices.html#splash-screen

D

Opa!

Aproveitando o gancho…
Tenho uma Thread q. conecta no servidor lê um arquivo e popula o banco…
o que acontece é q. a SplashScreen termina antes…(sei q. é configurável o tempo!)…
Pergunta! Teria como passar o tempo para o SplashScreen de acordo com o tempo de duração do processo?

entenderam? Tipo…quero q. a splash dure o tempo que a thread durar…

Thx.

t+

M

Não seria mais ou menos isso que você precisa ?
MAKING HTTP CONNECTIONS USING BACKGROUND THREADS

D

já li esse artigo…é quase isso

nao preciso monitorar o tempo de conexao…preciso monitorar a ação toda:

  • conecta
  • lê o arquivo
  • alimenta o banco

thx…

t+

M
Não dá pra fazer algo do tipo...
Na thread 1
splash=true;
faz o processamento etc;
splash=false;
----------------------------
Na thread 2 - do Splash
exibe imagem
while (thread1.splash)
   sleep;
finaliza thread2
Ou algo do tipo... Não acho que dê pra saber o tempo do processamento antes dele ocorrer. Talvez fazer uma estimativa pela quantidade de dados a se trafegado, mas não tenho certeza!
D

hum…é eu já tinha pensando em algo desse tipo…vou testar!

Outra coisa, sabes como eu mantenho a aplicação aberta?

Tipo…abri minha aplicação (palm) e deixei atualizando o bd…eqto isso vou para a home do palm…e continuo trabalhando em outras coisas…
qdo eu tento retornar para aplicação (clicando no ícone)…ela abre novamente!

Será q. tem alguma propriedade ou coisa do tipo, onde eu informe para verificar se existe uma instancia…e caso exista…não abrir novamente…

obrigada,

t+

M

Switching a MIDlet to the Background

A short ‘hot’ key press is used for switching between running apps.
Upon a short ‘hot’ key press the foreground MIDlet will be
placed in the background and the main device menu will be
displayed on the screen.

Upon a long ‘Hot’ key press the foreground MIDlet will be
placed in the background and the ‘Application manager’ will
be displayed on the screen. The user can see the list of running apps and can switch to another app.

Upon calling setCurrent(null) the MIDlet will be placed in the
background and the ‘idle’ screen of the device will be
displayed. This enables MIDlets to place themselves in the background.

Se funciona ? Não faço idéia.

Criado 3 de janeiro de 2007
Ultima resposta 15 de jun. de 2007
Respostas 10
Participantes 4