Splashscreen无法正常工作

时间:2011-02-16 20:41:11

标签: blackberry

以下启动画面无法正确显示。当我只按下闪屏时它工作正常,但是当我按下闪屏然后再按下另一个屏幕时它没有。欢迎屏幕是闪屏。

所以这很有用 -

pushScreen(new WelcomeScreen());

但不是这个 -

pushScreen(new WelcomeScreen());
pushScreen(new 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 个答案:

答案 0 :(得分:1)

看起来问题是在WelcomeScreen之后立即推送MenuScreen。在推送MenuScreen之前,您需要设置某种等待WelcomeScreen“完成”的机制。

也许创建一个传递给WelcomeScreen的Listener对象。然后,当WelcomeScreen“完成”时,它将调用监听器(例如myListener.splashScreenFinished())。然后,Listener的实现将创建并推送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();
    }
}