JavaFX ScrollPane на Android — слишком медленно

Я только что закодировал простой пример использования панели прокрутки в JavaFX. Всего одна ScrollPane размещена в сцене, и ScrollPane содержит компонент Label с большим текстом. Используя gradle, я загрузил приложение на Android-устройство Nexus 4. Как видно из видео, которое я загрузил, прокрутка идет слишком медленно. Я уверен, что другие испытали это. Любое предложение о том, как это можно изменить на собственную скорость прокрутки, очень ценится.

Исходный код приложения можно скачать отсюда.

AndroidFX.java

public class AndroidFX extends Application{

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent mySearchListFXML = getFXMLPane("/fxml/ScrollPaneWithLabel.fxml");
        primaryStage.setScene(new Scene(mySearchListFXML));
        primaryStage.setWidth(Screen.getPrimary().getVisualBounds().getWidth()); primaryStage.setHeight(Screen.getPrimary().getVisualBounds().getHeight());     
        primaryStage.show();
    }

    public static Parent getFXMLPane(String url) throws IOException {
        URL location = AndroidFX.class.getResource(url);
        FXMLLoader fxmlLoader = new FXMLLoader();
        fxmlLoader.setLocation(location);
        Parent pane = fxmlLoader.load();
        return pane;
    }
}

ScrollPaneWithLabel.fxml

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

<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>

<ScrollPane fx:id="scrollPane" fitToWidth="true" hbarPolicy="NEVER" pannable="true" style="-fx-background: white;" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   <content>
      <Label text="<VERY LARGE TEXT HERE>" wrapText="true" />
   </content>
</ScrollPane>

person javasuns    schedule 07.05.2015    source источник


Ответы (1)


Столкнулся с подобными проблемами. Проблема усугубляется на устройствах hidpi, отключение параметра hipdpi в файле свойств помогает, но вам придется самостоятельно масштабировать экраны hidpi.

Еще одна вещь, которая может помочь, — это кэширование шрифтов. Я считаю, что конечный результат портированного приложения javafx больше похож на большое изображение с горячими точками. Прокрутка, я думаю, просто говорит приложению каждый раз перерисовывать все изображение. Только теория на самом деле. Кэширование помогает, но может сделать ваш текст нечетким. Хотя у меня был некоторый успех в масштабировании шрифта, установка кеша в true, а затем уменьшение масштаба, обычно x2 и .5 дают довольно хорошие результаты. Использование em для шрифтов также помогает нечеткому тексту.

Если вам нужно отобразить огромное количество текста, и его необходимо прокручивать, вы, вероятно, получите гораздо лучшие результаты, отображая его через веб-просмотр. Честно говоря, я никогда не использовал его, но я полагаю, что при портировании он заменяется родным окном браузера, поэтому я думаю, что производительность должна быть довольно хорошей. Я думаю, возможно, они написали html-рендеринг в javafx, и тогда вы столкнетесь с теми же ловушками.

http://www.gluonhq.com предлагает так называемый пакет очарования, сброса и подключения, который должен имитировать нативные приложения. Звучит многообещающе, и в настоящее время я пытаюсь получить больше информации, чтобы узнать, есть ли у них решения для подобных проблем. Я добавлю в пост, если получу дополнительную информацию о очаровании.

person Frank    schedule 08.05.2015
comment
Я хотел бы прокомментировать, что я не верю, что эти проблемы связаны с плагином javafxports. Я считаю, что некоторые из этих проблем связаны с OpenJdk или самим ядром javafx и просто не заметны на мощных настольных компьютерах. Сообщалось об аналогичных проблемах в Max OSX с экранами Retina. - person Frank; 08.05.2015
comment
Есть ли какие-либо глобальные настройки для кэширования шрифтов? И какой параметр для high dpi. Я хотел бы попробовать записать разницу - person javasuns; 08.05.2015
comment
Я думаю, что было бы возможно использовать функцию поиска, может быть, что-то вроде (Label)scene.lookup(Label), затем прокручивать их и устанавливать кеш - person Frank; 08.05.2015
comment
А что такое история? Еще раз, не могли бы вы привести пример того, как отключить больницу? - person javasuns; 08.05.2015
comment
файловый контейнер, свойство javafx.platform, оно будет где-то в папке проекта, убедитесь, что свойство установлено следующим образом: android.prism.allowhidpi=true - person Frank; 08.05.2015
comment
Хорошо, я попробую и вернусь с результатами - person javasuns; 08.05.2015