我使用Gluon Mobile创建了小型移动应用,现在通过Google Play进行了Beta测试.
但我意识到,我在android设备上启动移动应用的速度非常慢(大约需要10秒钟以上).
如果我可以在加载应用程序之前添加一个SplashScreen,那就太好了,这样用户就不会总共等待10次,但是他们感觉只有一半,因为他们在看到SplashScreen时得到了应用程序的响应.
在原生android开发上,我们只建立了2个活动(一个用于SplashScreen,一个用于主要应用),如blow:
<activity
android:name=”.SplashScreen”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>
<activity
android:name=”.MainActivity”
android:label=”@string/app_name”
>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
</intent-filter>
</activity>
我的问题是,是否有任何方法可以显示基于JavaFX / GluOn构建的SplashScreen,该方法将在andorid / ios而非本地上运行.
如果我们基于javaFX而不是这种本机方法,则有任何不利之处.
由于在移动设备上使用gluon / javaFX的年龄很小,因此很难获得最佳实践的理想方法.请照亮我
gr
解决方法:
虽然启动屏幕可能是一个不错的主意,但实际上,使用Gluon插件创建的Gluon Mobile Multi-View项目允许您通过将主视图用作图像或任何其他要显示的轻量级内容的占位符来创建类似的效果,同时将所有繁重的内容加载到辅助视图中.
默认情况下,主视图是在Application.start()方法期间加载的初始视图.在用户切换到其他视图之前,不会加载其他视图.
使用以下视图,仅当用户单击浮动操作按钮时,才会开始加载重物的实际负载,但不会立即显示mobil设备上的启动视图:
public class SplashView extends View {
public SplashView(String name) {
super(name);
setCenter(new ImageView(new Image(getClass().getResourceAsStream("splash.png"))));
FloatingActionButton action = new FloatingActionButton(MaterialDesignIcon.ARROW_FORWARD.text, e ->
MobileApplication.getInstance().switchView(GluonSplash.SECONDARY_VIEW));
getLayers().add(action);
}
@Override
protected void updateAppBar(AppBar appBar) {
appBar.setVisible(false);
}
}
为了避免用户干预的需要,您可以在显示启动画面一定时间后,取消操作按钮并开始加载第二个视图.
在另一个示例中,显示初始视图后,将开始暂停过渡.一秒钟后,它将显示标签以指示将加载新视图.同时,启动加载该视图的任务.加载所有重量级视图后,将显示它.
public class SplashView extends View {
public SplashView(String name) {
super(name);
Label access = new Label("Accessing...");
access.setTranslateY(200);
access.setVisible(false);
setCenter(new StackPane(new ImageView(new Image(getClass().getResourceAsStream("splash.png"))),
access));
Task<Void> task = new Task<Void>() {
@Override
protected Void call() throws Exception {
Platform.runLater(() -> MobileApplication.getInstance().switchView(GluonSplash.SECONDARY_VIEW));
return null;
}
};
addEventHandler(LifecycleEvent.SHOWN, e -> {
PauseTransition pause = new PauseTransition(Duration.seconds(1));
pause.setOnFinished(f -> {
access.setVisible(true);
new Thread(task).start();
});
pause.play();
});
}
@Override
protected void updateAppBar(AppBar appBar) {
appBar.setVisible(false);
}
}