JavaFX ScrollPane очень медленно работает на устройствах Android
Я тестирую 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 году?