首页 文章

胶子android飞溅屏幕

提问于
浏览
3

我使用Gluon Mobile创建了小型移动应用程序,现在通过Google Play进行beta测试 . 但我意识到Android设备上我的移动应用程序的启动时间非常慢(大约需要10秒钟) .

如果我可以在加载应用程序之前添加SplashScreen,这将是很好的,因此用户不会总共等待10次,但他们感觉只有一半,因为他们在看到SplashScreen时得到了应用程序的响应 .

在本机android开发中,我们只需构建2个活动(一个用于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,它将在andorid / ios上运行,而不是在本机上运行 . 如果我们 Build 在javaFX而不是这种原生方法上,是否有任何缺点 .

自从年轻的胶子/ javaFX在移动设备上,不容易获得最佳实践的理想方法 . 请点亮我

rgrds

3 回答

  • 1

    虽然Splash屏幕可能是一个不错的主意,但实际上使用Gluon Plugin创建的Gluon Mobile Multi-View项目可以通过使用Home 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);
        }
    
    }
    
  • 1

    我有点迟了但是对于未来的项目,这可能有用:

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

    • 视图处理的不同方法可让您针对不同的设备尺寸和方向进行开发

    • 还有一个 Splash Screen (它尚未配置,但由于它是开源的,您可以根据需要快速更改它)

    • 了解更多功能,请查看其自述文件

  • 0

    好吧这已经过时了,但这仍然会出现在Google搜索上,所以现在就是这样 . 使用插件的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);
                }
            });
    

    要确保您的闪屏不会出现在您的抽屉中 .

相关问题