JavaFX ScrollPane очень медленно работает на устройствах Android - PullRequest
0 голосов
/ 29 августа 2018

Я тестирую JavaFX на Android с помощью jfxmobile-plugin. Я сталкиваюсь с проблемами производительности при попытке запустить его на моих устройствах Android. Я видел похожие вопросы, и в 2018 году они по-прежнему остаются нерешенными. Кто-то опубликовал этот вопрос , и спустя 3 года он по-прежнему не решен.

Вот что я использую для создания своего проекта:

  • jfxmobile-plugin: 1.3.13 (также пробовал с jfxmobile-plugin: 2.0.28)
  • dalvik-sdk (пробовал версии 8.60.7, 8.60.8 и 8.60.9. Версии 8.60.10 и 8.60.11 приводят к падению приложения при запуске.)

GluonApplication.Java

package com.gluonapplication;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Rectangle2D;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class GluonApplication extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("/Dashboard.fxml"));
        Parent root = loader.load();
        Rectangle2D r = javafx.stage.Screen.getPrimary().getVisualBounds();
        Scene s = new Scene(root,r.getWidth(),r.getHeight());
        primaryStage.setScene(s);
        primaryStage.show();
    }
}

Dashboard.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.chart.BarChart?>
<?import javafx.scene.chart.CategoryAxis?>
<?import javafx.scene.chart.NumberAxis?>
<?import javafx.scene.chart.PieChart?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ProgressIndicator?>
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="900.0" prefWidth="866.0" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.gluonapplication.DashboardController">
   <children>
      <ScrollPane fitToWidth="true" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <content>
            <VBox>
               <children>
                  <TitledPane text="Alocação">
                    <content>
                      <AnchorPane>
                           <children>
                              <PieChart fx:id="c_alocacao" layoutX="14.0" layoutY="14.0" prefHeight="400.0" prefWidth="400.0" />
                              <Label layoutX="431.0" layoutY="14.0" text="Total de Ativos:">
                                 <font>
                                    <Font size="18.0" />
                                 </font>
                              </Label>
                              <TableView fx:id="t_ativos" layoutX="447.0" layoutY="71.0" prefHeight="330.0" prefWidth="319.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="415.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="35.0">
                                <columns>
                                  <TableColumn prefWidth="75.0" text="C1" />
                                  <TableColumn prefWidth="75.0" text="C2" />
                                </columns>
                              </TableView>
                           </children>
                        </AnchorPane>
                    </content>
                  </TitledPane>
                  <TitledPane text="Movimentação">
                    <content>
                      <AnchorPane>
                           <children>
                              <ScrollPane fx:id="sp_aportes" layoutX="10.399999618530273" layoutY="10.399999618530273" prefHeight="320" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
                                 <content>
                                    <BarChart fx:id="c_aportes" minHeight="0.0" prefHeight="300.0" prefWidth="862.0">
                                      <xAxis>
                                        <CategoryAxis minHeight="0.0" side="BOTTOM" />
                                      </xAxis>
                                      <yAxis>
                                        <NumberAxis minHeight="0.0" side="LEFT" />
                                      </yAxis>
                                    </BarChart>
                                 </content>
                              </ScrollPane>
                           </children>
                        </AnchorPane>
                    </content>
                  </TitledPane>
                  <StackPane>
                     <children>
                      <TitledPane text="Proventos">
                          <content>
                            <AnchorPane>
                                 <children>
                                    <ScrollPane fx:id="sp_proventos" layoutX="10.399999618530273" layoutY="10.399999618530273" prefHeight="320" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
                                       <content>
                                          <BarChart fx:id="c_proventos" prefHeight="300">
                                            <xAxis>
                                              <CategoryAxis side="BOTTOM" />
                                            </xAxis>
                                            <yAxis>
                                              <NumberAxis side="LEFT" />
                                            </yAxis>
                                          </BarChart>
                                       </content>
                                    </ScrollPane>
                                 </children>
                              </AnchorPane>
                          </content>
                        </TitledPane>
                        <ProgressIndicator fx:id="p_proventos" progress="0.0" />
                     </children>
                  </StackPane>
                  <StackPane>
                     <children>                  
                        <TitledPane text="Fatos Relevantes">
                          <content>
                            <AnchorPane>
                                 <children>
                                    <TableView fx:id="t_fatos" layoutX="14.0" layoutY="14.0" prefHeight="650.0" prefWidth="861.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />                              
                                 </children>
                              </AnchorPane>
                          </content>
                        </TitledPane>
                        <ProgressIndicator fx:id="p_fatos" progress="0.0" />
                     </children>
                  </StackPane>
               </children>
            </VBox>
         </content>
      </ScrollPane>
   </children>
</AnchorPane>

build.gradle

buildscript {
    repositories {
        jcenter()
        google()
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        //classpath 'org.javafxports:jfxmobile-plugin:1.3.13'
        classpath 'org.javafxports:jfxmobile-plugin:2.0.29'
    }
}

apply plugin: 'org.javafxports.jfxmobile'

repositories {
    jcenter()
    maven {
        url 'http://nexus.gluonhq.com/nexus/content/repositories/releases'
    }
}

mainClassName = 'com.gluonapplication.GluonApplication'

jfxmobile.android.androidSdk = '/home/helder/Android/Sdk'

dependencies {
    //compileNoRetro 'com.gluonhq:charm:5.0.0'
}

jfxmobile {
    downConfig {
        version = '3.8.0'
        // Do not edit the line below. Use Gluon Mobile Settings in your project context menu instead
        plugins 'display', 'lifecycle', 'statusbar', 'storage'
    }
    android {
        manifest = 'src/android/AndroidManifest.xml'
    }
}

Когда я касаюсь экрана, я вижу много текста, поступающего в logcat, и думаю, что это может еще больше замедлить работу приложения. Поэтому я попытался удалить вызовы отладки с помощью proguard (proguardFile на build.gradle), но мне не удалось выполнить эту задачу, он не изменил окончательный вариант apk.

Я пытался запустить приложение на Android 4.4, а также на Android 6 и Android 8. Все они были очень медленными при прокрутке. У кого-то есть идея улучшить это и сделать JavaFX пригодным для использования на устройствах Android в 2018 году?

...