Gluon Android启动画面

3

我曾使用Gluon Mobile创建小型移动应用程序,现在通过Google Play进行测试。但是我发现我的移动应用程序在Android设备上的启动时间相当慢(需要大约10秒以上)。

如果我能在应用程序加载前添加一个SplashScreen,那将非常好,这样用户不会等待10倍,而只需要观看SplashScreen,就能感受到应用程序已响应并运行。

在原生Android开发中,我们只需构建两个活动(一个为SplashScreen,一个为主应用程序),如下所示:

<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,可以在Android / iOS上运行而不是本地应用。 如果我们使用JavaFX进行构建,是否存在任何缺点,而不是使用本地应用程序的方法? 由于Gluon / JavaFX在移动端的年轻时代,很难找到最佳实践和理想的方法。请给我提亮灯笼。 谢谢!
3个回答

2

虽然启动画面可能是一个不错的想法,但实际上使用Gluon插件创建的Gluon Mobile Multi-View项目可以通过使用Home View作为图像或任何其他轻量级内容的占位符来创建类似的效果,同时在第二视图中加载所有繁重的内容。

默认情况下,Home View是在Application.start()方法期间加载的初始视图。直到用户切换到其他视图时,其他视图才会被加载。

通过以下视图,只有当用户单击浮动操作按钮时,繁重的内容的实际加载才开始,但移动设备上的启动画面会立即显示:

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

}

实际上,我想从开头删除空白黑屏,并添加其他内容/轻图片。但是,如果这种方法只会在应用程序显示前显示几秒钟,并且大部分加载时间仍然存在空白黑屏,则需要进行测试。希望你明白我的意思。 - Wijaya
准确地说,这个想法是使用非常轻量级的Home_View,它将立即显示出来。为此,请尝试仅在需要该视图时加载与第二个视图相关的所有内容。否则,加载时间也会影响到Home/Splash视图。 - José Pereda
是的,这种方法完美地运作。唯一的问题是当用户在安卓设备上按下返回按钮时,屏幕会跳转到加载闪屏图像。我可以通过应用栏避免返回,但仍无法解决来自安卓硬件(右下角)的返回按钮问题。 有什么建议或技巧可以克服这个问题吗?提前致谢。 - Wijaya
按照 Android 标准,按下后退按钮将返回到上一个视图或退出应用程序。对于您的情况,我建议添加一个“first”布尔值,以便在第一次运行时显示启动画面,然后修改主视图以显示正确的内容。 - José Pereda

1

虽然我有点晚了,但对于未来的项目,这可能会很有用:

Github上有一个项目,它正在扩展Gluon的功能。
https://github.com/Ciruman/QuarkFX
它包括:

  • 不同的视图处理方式,可以让您开发适用于不同设备尺寸和方向的应用程序
  • 还包括启动画面(目前还不能配置,但由于它是开源的,您可以快速根据自己的需求进行更改)
  • 要了解更多功能,请查看其自述文件

它是开源的吗?@LucaZ - guru_001

0

好的,这个已经有点老了,但是它仍然会在谷歌搜索中出现,所以在这里提供一下。 使用插件的4.x版本,可以使用SplashView来隐藏默认情况下的appBar,并且可以像普通视图一样注册,只需使用名称SPLASH_VIEW即可。 FXML应该如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<?import com.gluonhq.charm.glisten.mvc.SplashView?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.BorderPane?>

<SplashView fx:id="splash" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/9" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.shara.views.SplashPresenter">
   <center>
      <ImageView fitHeight="150.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" BorderPane.alignment="CENTER">
         <image>
            <Image url="@../../../icon.png" />
         </image>
      </ImageView>
   </center>
   <bottom>
      <Label BorderPane.alignment="CENTER" />
   </bottom>
</SplashView>

那么它的控制器应该长这样:

import com.gluonhq.charm.down.Services;
import com.gluonhq.charm.down.plugins.LifecycleService;
import com.gluonhq.charm.glisten.afterburner.GluonPresenter;
import com.gluonhq.charm.glisten.animation.FadeInTransition;
import com.gluonhq.charm.glisten.application.MobileApplication;
import com.gluonhq.charm.glisten.control.Alert;
import com.gluonhq.charm.glisten.control.LifecycleEvent;
import com.gluonhq.charm.glisten.mvc.SplashView;
import com.shara.Shara;
import com.shara.Network;
import javafx.animation.PauseTransition;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.util.Duration;

/**
 *
 * @author mighty
 */
public class SplashPresenter extends GluonPresenter<Shara> {

    @FXML private SplashView splash;

    public void initialize(){
        splash.setShowTransitionFactory(FadeInTransition::new);
        splash.setOnShown((LifecycleEvent e) -> {
            PauseTransition pause = new PauseTransition(Duration.seconds(3));
            pause.setOnFinished((ActionEvent f) -> {
                splash.hideSplashView();
            });
            pause.play();
        });

    }
}

视图按照正常方式进行初始化,可以通过调用 hideSplashView() 方法来进行切换。 闪屏视图可以像普通视图一样进行样式设计,并且可以使用样式表。 视图可以在 AppViewManager 中注册:

public static final AppView SPLASH_VIEW = view("Splash", SplashPresenter.class, MaterialDesignIcon.PAGES);

在你的registerViewsAndDrawer方法中,替换掉


REGISTRY.getViews().forEach((view) -> {
            view.registerView(app);
    });

使用

REGISTRY.getViews().forEach((view) -> {
            if(view.getId() != "SPLASH_VIEW"){
                view.registerView(app);
            }
        });

为确保您的启动画面不会出现在抽屉中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接