我在带有动画文本序列的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);
}
答案 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;
}