Codename One - 仅在SplashScreen上的动画完成后显示下一个表单

时间:2015-01-20 16:32:39

标签: java android java-me codenameone

我在带有动画文本序列的Codename One上有一个启动画面实现。我不想在我的Splash Form上使用nextForm属性,因为我希望在导航之前完成序列。因此,我使用了showForm。它在模拟器上工作正常,但是当我在真实设备上测试时,我以编程方式加载的下一个表单需要时间加载,转换很慢,有时会崩溃。我似乎无法弄清楚为什么......

我在下面列出了示例代码:

@Override
protected void beforeSplash(Form f) {
// If the resource file changes the names of components this call will break notifying you that you should fix the code
    super.beforeSplash(f);
    final String text = "Sample text to be animated here for testing purpose!";
    final SpanLabel l = findSloganLabel(f);

    Animation anim = new Animation() {
        private long lastTime = System.currentTimeMillis();

        public boolean animate() {
            long t = System.currentTimeMillis();
            int i = l.getText().length();
            if (t - lastTime >= 450) {
                if (i == text.length()) {
                    showForm("Register", null);
                    return false;
                } else {
                    System.out.println("Animating Label...");
                    if (i == text.length() - 1) {
                        l.setText(text);
                        l.revalidate();
                    } else {
                        l.setText(text.substring(0, i) + "_");
                        l.revalidate();
                    }
                }
                lastTime = t;
            }

            return false;
        }

        public void paint(Graphics g) {
        }
    };

    f.registerAnimated(anim);
}

3 个答案:

答案 0 :(得分:1)

您可以这样做:

    @Override
    protected void postSplash(Form f) {
        UITimer timer = new UITimer(new Runnable() {
            public void run() {
                showForm("MainForm", null);
            }
        });
        timer.schedule(XX-MiliSec, false, f);
    }

所以在你的splash表单的postForm方法中添加计时器.. 并在XX毫秒后安排它(无论你的动画持续时间是多少)

在提到Milli-seconds

后执行showForm()方法

答案 1 :(得分:0)

您正在寻找AnimationListener

anim.setAnimationListener(new Animation.AnimationListener() {
              @Override public void onAnimationStart(Animation animation) {

              }

              @Override public void onAnimationEnd(Animation animation) {
                showForm();
              }

              @Override public void onAnimationRepeat(Animation animation) {

              }
            });)

答案 2 :(得分:0)

你有两个简单的选择,第一个我认为最好不要使用"下一个表格"属性,然后在动画完成时调用showForm("mainFormName", null)

第二个是下一个表单是如何设计工作的,它是专为你在后台线程上做一个可能需要时间的后台进程而设计的,为了模拟这个我们睡了几秒但是你应该重写那个方法做你想做的。只需在状态机中覆盖它并执行任何操作:

protected boolean processBackground(Form f) {
    try {
        Thread.sleep(3000);
    } catch (InterruptedException ex) {
        ex.printStackTrace();
    }
    return true;
}