2011-02-16 194 views
0

下面的飞溅屏幕显示不正确。当我只推动splashscreen时,它的工作正常,但当我推动splashscreen,然后再推另一个屏幕时,它没有问题。欢迎屏幕是闪屏。飞溅屏幕不能正常工作

所以此工程 -

pushScreen(new WelcomeScreen()); 

而不是现在这样 -

pushScreen(new WelcomeScreen()); 
pushScreen(new MenuScreen()); 

在显示menuscreen马上而不是溅射屏幕的第二个场景。

这是闪屏代码 - 两个类。

package screens; 

import com.src.driver.Driver; 

import net.rim.device.api.system.Bitmap; 
import net.rim.device.api.ui.component.LabelField; 

public class WelcomeScreen extends SplashScreen { 

    public WelcomeScreen() { 
     super(Bitmap.getBitmapResource("icon.png"), 5); 
     //normal mainscreen items: 
     //setTitle("SplashScreen Test"); 
     //add(new LabelField("HelloWorld!")); 
    } 
} 

package screens; 

import java.util.Timer; 
import java.util.TimerTask; 

import com.src.driver.Driver; 

import net.rim.device.api.system.Bitmap; 
import net.rim.device.api.system.Display; 
import net.rim.device.api.ui.Graphics; 
import net.rim.device.api.ui.container.MainScreen; 

public class SplashScreen extends MainScreen { 

    Bitmap popup; 
    SplashScreen screen = this; 
    private Timer splashTimer = new Timer(); 
    private TimerTask splashTask; 
    int count = 0; 
    int screenWidth = Display.getWidth(); 
    int screenHeight = Display.getHeight(); 
    int yCoord; 
    int xCoord; 
    boolean showSplash = true; 
    boolean splashDisplayed = false; 

    public SplashScreen(Bitmap popup, final int seconds) { 
     this.popup = popup; 
     xCoord = (screenWidth - popup.getWidth())/2; 
     yCoord = (screenHeight - popup.getHeight())/2; 

     splashTask = new TimerTask() { 

      public void run() { 
       if (showSplash && !splashDisplayed) { 
        count++; 
        if (count == seconds * 10) { 
         showSplash = false; 
         splashDisplayed = true; 
         splashTimer.cancel(); 
         invalidate(); 
        } 
       } 
      } 
     }; 

     splashTimer.scheduleAtFixedRate(splashTask, 100, 100); 

    } 

    protected void paint(Graphics graphics) { 
     super.paint(graphics); 
     if (showSplash && !splashDisplayed) { 
      graphics.drawBitmap(xCoord, yCoord, popup.getWidth(), popup.getHeight(), popup, 0, 0); 
      //draw border, delete if not needed: 
      //graphics.setColor(0xcccccc); 
      //graphics.drawRect(xCoord, yCoord, popup.getWidth(), popup.getHeight()); 
     } 
    } 

    protected void onUiEngineAttached(boolean attached) { 
     showSplash = true; 
     invalidate(); 
     super.onUiEngineAttached(attached); 
    } 

    //allow user to dismiss splash screen: 
    protected boolean navigationMovement(int dx, int dy, int status, int time) { 
     return DismissSplash(); 

    } 

    protected boolean navigationClick(int status, int time) { 
     return DismissSplash(); 
    } 

    protected boolean keyChar(char c, int status, int time) { 
     return DismissSplash(); 
    } 

    private boolean DismissSplash() { 
     if (showSplash) { 
      showSplash = false; 
      splashDisplayed = true; 
      invalidate(); 
      return true; 
     }else{ 
      return false; 
     } 
    } 
} 

谢谢

回答

1

它看起来像问题是,MenuScreen是WelcomeScreen后推。在推送菜单屏幕之前,您需要放入某种机制来等待WelcomeScreen“完成”。

也许创建一个传入WelcomeScreen的Listener对象。然后,当欢迎屏幕“完成”时,它会调用监听程序(例如myListener.splashScreenFinished())。然后,监听器的实现将创建并推送MenuScreen。

这可能是这个样子:

interface MyListener { 
    public void splashScreenFinished(); 
} 

 

class MyApp implements MyListener { 
    ... 
    public void splashScreenFinished() { 
     UiApplication.getUiApplication().invokeLater(new Runnable() { 
      public void run() { 
       pushScreen(new MenuScreen()); 
      } 
     }); 
    } 

    public void startupApp() { 
     pushScreen(new WelcomeScreen(this)); 
    } 
    ... 
} 

 

class WelcomeScreen { 
    private MyListener l; 

    public WelcomeScreen(MyListener listener) { 
     l = listener; 
     ... 
    } 

    protected onSplashTimerDone() { 
     if (l != null) 
      l.splashScreenFinished(); 
    } 
} 
+0

你可以添加伪代码来实现这一PLZ? – 2011-02-16 21:55:53