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

Codename One - Show Next Form Only after Animation on SplashScreen is Complete

我在 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);
}

您正在寻找 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) {

              }
            });)

您有两个简单的选择,第一个我认为更好的是不使用 "next form" 属性 然后在动画完成时调用 showForm("mainFormName", null)

第二个是下一个表单的设计方式,它是为您设计的,可以在后台线程上执行后台进程,这可能需要一些时间,为了模拟这个,我们睡了几秒钟,但您应该覆盖它方法做任何你想做的事。只需在你的状态机中覆盖它并做任何你想做的事情:

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

你可以这样做:

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

因此,在您的初始表单的 postForm 方法中添加计时器.. 并在 XX 毫秒后安排它(无论您的动画持续时间是多少)

它会在提到的毫秒后执行 showForm() 方法