代号一 - 仅在 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() 方法
我在 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() 方法