- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经开始尝试获取有关此问题的一些信息(请参阅 here ),但这一次,我创建了一个示例应用程序来展示我的问题(希望以比上次更好的方式)。
在我开始之前,这里是应用程序存储库的链接: https://github.com/bgmf/example
那么让我们从代码开始吧。这是我的 Gradle 文件
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'org.javafxports:jfxmobile-plugin:1.2.0'
}
}
apply plugin: 'org.javafxports.jfxmobile'
repositories {
jcenter()
maven {
url 'http://nexus.gluonhq.com/nexus/content/repositories/releases'
}
}
mainClassName = 'eu.dzim.example.Main'
dependencies {
compile 'com.gluonhq:charm:4.2.0'
compile 'org.controlsfx:controlsfx:8.40.12'
compile 'de.jensd:fontawesomefx-commons:8.13'
compile 'de.jensd:fontawesomefx-fontawesome:4.7.0'
compile 'de.jensd:fontawesomefx-materialdesignfont:1.7.22'
compile 'com.fasterxml.jackson.core:jackson-databind:2.8.4'
compileNoRetrolambda 'com.airhacks:afterburner.mfx:1.6.2'
}
jfxmobile {
downConfig {
version = '3.1.0'
plugins 'display', 'lifecycle', 'statusbar', 'storage', 'settings'
}
android {
manifest = 'src/android/AndroidManifest.xml'
compileSdkVersion = 22
minSdkVersion = 19
targetSdkVersion = 22
dexOptions {
javaMaxHeapSize '2g'
}
packagingOptions {
pickFirst 'META-INF/LICENSE'
pickFirst 'META-INF/NOTICE'
pickFirst 'license/LICENSE.txt'
}
}
}
我使用 Gluon 插件方法创建了一个具有单一 View 的应用程序。但由于非常...特殊...设计要求,我需要放弃 Material Design 启发的 UI,Gluon 提供。很遗憾。所以我需要一个简单的 javafx.application.Application
类并设置图标、CSS 和大小。
有一个应用程序模型的小型单例实例。为什么?不幸的是,我需要提供一种技术来更改整个应用程序中的文本大小。该模型保存对当前大小的引用,并使用 Utils 类为指定的节点更改它(这或多或少准确,或多或少慢)。
最关键的部分是,有一个组件可以浏览页面,每个页面都是按需从资源或文件系统(任何可用的)加载的。滑动就像一个魅力,但加载和渲染需要相对较长的时间(取决于设备!)3 到 7 秒(约 2 秒从系统加载文件并通过FXMLLoader
;其余时间 UI 卡住(查看进度指示器)直到显示)!即使是演示应用程序也需要那么多时间。 IM 没有做任何花哨的事情,所以这里是演示应用程序的加载机制:
package eu.dzim.example.ui;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;
import eu.dzim.example.model.ApplicationModel;
import eu.dzim.example.util.DualAcceptor;
import eu.dzim.example.util.Utils;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
public class RootController {
private static final Logger LOG = Logger.getLogger(RootController.class.getName());
@FXML private StackPane content;
@FXML private ScrollPane scrollContent;
@FXML private VBox contentBox;
@FXML private ProgressIndicator progress;
@FXML private Button showContent;
@FXML private Button showTextSize;
private boolean contentLoaded = false;;
private List<CollapsibleItemPane> panes = new ArrayList<>();
private List<Node> resizableNodes = new ArrayList<>();
private ChangeListener<Number> onContentTextSizeChange = this::handleContentTextSizeChanged;
private DualAcceptor<CollapsibleItemButton, Boolean> collapsibleItemAction = this::handleCollapsibleItemAction;
private ExecutorService executor = Executors.newSingleThreadExecutor();
@FXML
public void initialize() {
ApplicationModel.getInstance().textSizeProperty().addListener(onContentTextSizeChange);
progress.managedProperty().bind(progress.visibleProperty());
showContent.setOnAction(e -> showContent());
showTextSize.setOnAction(e -> switchThroughTextSize());
}
private void showContent() {
if (contentLoaded)
return;
progress.setVisible(true);
Task<Pane> task = new Task<Pane>() {
@Override
protected Pane call() throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/ObjectRestauration.fxml"));
return loader.load();
}
};
task.setOnSucceeded(value -> {
Pane result = (Pane) value.getSource().getValue();
if (result == null)
return;
for (CollapsibleItemPane pane : panes) {
pane.setOnActionAcceptor(null);
}
contentBox.getChildren().add(result);
panes = getCollapsibleItemPanesFromContent();
for (CollapsibleItemPane pane : panes) {
pane.setOnActionAcceptor(collapsibleItemAction);
}
resizableNodes.clear();
resizableNodes.addAll(Utils.getAllResizableNodes(contentBox));
handleContentTextSizeChanged(ApplicationModel.getInstance().textSizeProperty(), null, ApplicationModel.getInstance().getTextSize());
progress.setVisible(false);
contentLoaded = true;
executor.shutdownNow();
});
task.setOnFailed(value -> {
Throwable t = value.getSource().getException();
LOG.log(Level.SEVERE, t.getMessage(), t);
progress.setVisible(false);
});
executor.submit(task);
}
private void switchThroughTextSize() {
switch (ApplicationModel.getInstance().getTextSize()) {
case Utils.TEXT_SIZE_SMALL:
ApplicationModel.getInstance().setTextSize(Utils.TEXT_SIZE_DEFAULT);
case Utils.TEXT_SIZE_DEFAULT:
ApplicationModel.getInstance().setTextSize(Utils.TEXT_SIZE_LARGE);
case Utils.TEXT_SIZE_LARGE:
ApplicationModel.getInstance().setTextSize(Utils.TEXT_SIZE_SMALL);
default:
ApplicationModel.getInstance().setTextSize(Utils.TEXT_SIZE_DEFAULT);
}
}
private List<CollapsibleItemPane> getCollapsibleItemPanesFromContent() {
List<CollapsibleItemPane> panes = new ArrayList<>();
// only collect first OR second tier panes
for (Node node : content.getChildren()) {
if (node instanceof CollapsibleItemPane)
panes.add((CollapsibleItemPane) node);
else if (node instanceof Pane) {
for (Node child : ((Pane) node).getChildren()) {
if (child instanceof CollapsibleItemPane)
panes.add((CollapsibleItemPane) child);
}
}
}
return panes;
}
private void handleContentTextSizeChanged(ObservableValue<? extends Number> obs, Number o, Number n) {
new Thread(() -> {
Utils.handleTextSizeChange(ApplicationModel.getInstance().getTextSize(), null, resizableNodes.toArray(new Node[0]));
}).start();
}
private void handleCollapsibleItemAction(CollapsibleItemButton source, Boolean visible) {
if (!visible)
return;
Node parent = source.getParent();
for (CollapsibleItemPane pane : panes) {
if (parent == pane)
continue;
pane.getCollapsibleButton().hideContent();
}
}
}
有问题的 FXML 如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!--
Do not edit this file it is generated by e(fx)clipse from ../src/main/resources/fxml/ObjectRestauration.fxgraph
-->
<?import java.lang.*?>
<?import eu.dzim.example.ui.CollapsibleItemPane?>
<?import eu.dzim.example.ui.LineBreakText?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Text?>
<?import javafx.scene.text.TextFlow?>
<?scenebuilder-stylesheet /style.css?>
<VBox xmlns:fx="http://javafx.com/fxml">
<CollapsibleItemPane titleText="Damit sie im alten Glanz erstrahlt" titleUserData="content-text-default">
<titleStyleClass>
<String fx:value="content-text-default" />
</titleStyleClass>
<content>
<VBox fx:id="content" managed="false" visible="false" spacing="3">
<TextFlow lineSpacing="3">
<Text userData="content-text-small" text="Die Restaurierung der Klosterkirche St. Martin ist dringend notwendig: Nur so können wir das Kulturgut nationaler Bedeutung und seinen hohen kunsthistorischen Wert erhalten.">
<styleClass>
<String fx:value="content-text-italic" />
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<ImageView preserveRatio="true" fitHeight="300">
<image>
<Image url="@img/kloster_werbung.jpg"/>
</image>
</ImageView>
<LineBreakText/>
<Text userData="content-text-small" text="Die Südfassade musste eingerüstet werden, um Besucher und Mönche vor den Folgen von Frostschäden und Fassadenrissen zu schützen.">
<styleClass>
<String fx:value="content-text-italic" />
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="1400 Jahre Kloster Disentis: Kulturgut von nationaler Bedeutung.">
<styleClass>
<String fx:value="content-text-bold" />
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Das wohl älteste, noch lebendige Benediktinerkloster nördlich der Alpen weist eine wechselvolle Geschichte auf. Die grosszügige Barockanlage des Benediktinerklosters beherrscht mit der Klosterkirche und ihren beiden Kuppeltürmen majestätisch die Tal-Ebene von Disentis.">
<styleClass>
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Die Klosterkirche St. Martin ist von hohem kunsthistorischen Wert und ein Kulturgut nationaler Bedeutung. Laut Schweizerischem Kunstführer GSK stellt sie einen der frühen Wandpfeiler-Emporen-Räume in der süddeutschen barocken Kulturregion dar und ist eine einmalige Architekturleistung Vorarlberger-Schule.">
<styleClass>
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Um dieses einmalige Kulturgut in seiner Pracht zu erhalten, bedarf die Klosterkirche St. Martin dringend einer umfangreichen Restaurierung. In der langen Geschichte der Abtei musste die Kirche etliche Male wieder aufgebaut und erneuert werden. Jedes Mal war es ein Kraftakt. Beachtliche finanzielle Mittel sind auch heute notwendig, um diese grosse Aufgabe der Restaurierung zu leisten.">
<styleClass>
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Letzte Gesamtsanierung der Klosterkirche vor knapp 100 Jahren.">
<styleClass>
<String fx:value="content-text-bold" />
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Die Südfassade mit den beiden Kirchtürmen wurde letztmals im Jahr 1954 renoviert. Zwar bemühte sich die Klostergemeinschaft stets, die Klosteranlage und vor allem die Klosterkirche zu pflegen; der Konvent war für deren aufwändigen Unterhalt dauernd in hohem Masse besorgt. ">
<styleClass>
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Ihre Unterstützung, ein bedeutendes Bauwerk für die Zukunft zu retten!">
<styleClass>
<String fx:value="content-text-bold" />
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Die geschätzte Gesamtsumme für die Vorhaben an der Klosterkirche St. Martin samt Umgebung beträgt nach heutigem Kostenvoranschlag rund CHF 15 Mio. Der Klostergemeinschaft ist es nicht möglich, die zusätzlichen Mittel für die Restaurierung der Klosterkirche aus eigener Kraft aufzubringen. Um die Finanzierung der notwendigen Restaurierung zu gewährleisten, startete das Kloster im Jubiläumsjahr 2014 eine breite Sammel-Aktion.">
<styleClass>
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Zurzeit laufen breit angelegte Fundraising-Aktivitäten. Falls deren Ziele erreicht werden, wird mit der Detailplanung und Vorarbeiten im Jahr 2016 begonnen. Während der Jahre 2017 und 2018 ist die Aussen-Restaurierung vorgesehen, überlappend bzw. anschliessend erfolgt während der Jahre 2018 und 2019 die Innen-Restaurierung.">
<styleClass>
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Ihre Spende hilft, die Restaurierung so schnell als möglich zu starten.">
<styleClass>
<String fx:value="content-text-small" />
</styleClass>
</Text>
</TextFlow>
</VBox>
</content>
</CollapsibleItemPane>
<CollapsibleItemPane titleText="Kunsthistorische Werte erhalten">
<content>
<VBox fx:id="content" managed="false" visible="false" spacing="3">
<TextFlow lineSpacing="3">
<Text userData="content-text-small" text="Imposante barocke « Kirchenburg »">
<styleClass>
<String fx:value="content-text-bold" />
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Vom mittelalterlichen Passkloster und seinen drei Kirchen sind die heute sichtbaren Ausgrabungen im Innenhof, der Chor der Marienkirche sowie ausgestellte Funde im Klostermuseum erhalten.">
<styleClass>
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Mit dem Klosterneubau im 17. und 18. Jahrhundert wurde die mittelalterliche Gebäudelandschaft durch eine «imposante barocke Kirchenburg» ersetzt.">
<styleClass>
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<ImageView preserveRatio="true" fitHeight="300">
<image>
<Image url="@img/dsc03801.jpg"/>
</image>
</ImageView>
<LineBreakText/>
<Text userData="content-text-small" text="Blick auf die Klosteranlage mit Internats-Gymnasium">
<styleClass>
<String fx:value="content-text-italic" />
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Hoher kunsthistorischer Wert der Klosteranlage und Klosterkirche">
<styleClass>
<String fx:value="content-text-bold" />
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Die Klosterkirche ist im Schweizerischen Kunstführer GSK («Die Benediktinerabtei Disentis») ausführlich dokumentiert:">
<styleClass>
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="«Raum, Kirchenfassade und Kloster bilden inmitten der Bündner Hochgebirgslandschaft einen Stil, den man alpinen Barock nennen möchte» (Oscar Sandner). Die Klosterkirche St. Martin bildet den Ostflügel des eindrücklichen Klosterkomplexes. Sie stellt einen der frühen Wandpfeiler-Emporen-Räume in der süddeutschen barocken Kulturregion dar. Ihre kompakte Ausführung mit der Bildung einer Lichtrahmenschicht an den Längsfassaden ist zudem eine einmalige Architekturleistung der Vorarlberger-Schule.">
<styleClass>
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Die Altarausstattung stammt zum grossen Teil aus der Erbauungszeit und umfasst auch zwei bedeutsame Renaissancealtäre der Vorgängerkirche St. Martin III.">
<styleClass>
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<ImageView preserveRatio="true" fitHeight="300">
<image>
<Image url="@img/stiftung_006.png"/>
</image>
</ImageView>
<LineBreakText/>
<Text userData="content-text-small" text="Blick in die Klosterkirche">
<styleClass>
<String fx:value="content-text-italic" />
<String fx:value="content-text-small" />
</styleClass>
</Text>
</TextFlow>
</VBox>
</content>
</CollapsibleItemPane>
<CollapsibleItemPane titleText="Restaurierungs-Bedarf">
<content>
<VBox fx:id="content" managed="false" visible="false" spacing="3">
<TextFlow lineSpacing="3">
<Text userData="content-text-small" text="Der Blick trügt – die Restaurierung der Klosterkirche ist dringend notwendig">
<styleClass>
<String fx:value="content-text-bold" />
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Zwar bemühte sich die Klostergemeinschaft stets, die Klosteranlage und vor allem die Klosterkirche zu pflegen, der Konvent war für deren aufwändigen Unterhalt dauernd in hohem Masse besorgt.">
<styleClass>
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Inzwischen sind die Risse an den Fassaden und im Inneren des Bauwerks sowie weitere Bauschäden unübersehbar. Eine Gesamt-Instandstellung der Klosterkirche St. Martin erscheint deshalb dem Konvent, den Besuchern und allen beteiligten Experten als dringend notwendig.">
<styleClass>
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<ImageView preserveRatio="true" fitHeight="300">
<image>
<Image url="@img/patronatskommitee_v5_print-7.jpg"/>
</image>
</ImageView>
<LineBreakText/>
<Text userData="content-text-small" text="Deckenfresken von Schimmelpilz befallen">
<styleClass>
<String fx:value="content-text-italic" />
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<ImageView preserveRatio="true" fitHeight="300">
<image>
<Image url="@img/patronatskommitee_v5_print-8.jpg"/>
</image>
</ImageView>
<LineBreakText/>
<Text userData="content-text-small" text="Holzwurmschäden an den Altären">
<styleClass>
<String fx:value="content-text-italic" />
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<ImageView preserveRatio="true" fitHeight="300">
<image>
<Image url="@img/patronatskommitee_v5_print-10.jpg"/>
</image>
</ImageView>
<LineBreakText/>
<Text userData="content-text-small" text="Staub- und Schmutzschichten, Risse im Gemäuer">
<styleClass>
<String fx:value="content-text-italic" />
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<ImageView preserveRatio="true" fitHeight="300">
<image>
<Image url="@img/patronatskommitee_v5_print-12.jpg"/>
</image>
</ImageView>
<LineBreakText/>
<Text userData="content-text-small" text="Frostschäden an der Südfassade">
<styleClass>
<String fx:value="content-text-italic" />
<String fx:value="content-text-small" />
</styleClass>
</Text>
</TextFlow>
</VBox>
</content>
</CollapsibleItemPane>
<CollapsibleItemPane titleText="Vorhaben 2016-2019">
<content>
<VBox fx:id="content" managed="false" visible="false" spacing="3">
<TextFlow lineSpacing="3">
<Text userData="content-text-small" text="Umfangreiche Vorarbeiten für die Restaurierung sind abgeschlossen">
<styleClass>
<String fx:value="content-text-bold" />
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Als Vorbereitung hierzu sind unter der Leitung des spezialisierten Architekturbüros Schmid Krieger AG aus Luzern, während der Jahre 2006 / 07 und 2013 / 14, umfassende Untersuchungen durchgeführt und Vorzustands-Dokumentationen erstellt worden.">
<styleClass>
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Diese Arbeiten erfolgten in enger Zusammenarbeit mit der Denkmalpflege des Kantons Graubünden.">
<styleClass>
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="In und um das Kirchengebäude erstellten die Experten mit neuesten Techniken eine detaillierte Situationsanalyse. Zudem befassten sie sich intensiv mit den Fachbereichen Baustatik, Bauphysik, Elektroplanung, Lüftung, Heizung, Akustik, Beleuchtung, Gebäudeautomation sowie mit der Konservierung von Fenstern, von Natursteinböden, ebenso mit den Orgeln des rund 300 Jahre alten Baudenkmals.">
<styleClass>
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Realisation Vorhaben 2016 bis 2019">
<styleClass>
<String fx:value="content-text-bold" />
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Dank erfreulicher Fortschritte der Fundraising-Aktivitäten ermunterte der Kanton Graubünden das Kloster, die Restaurierung der havarierten Südfassade der Klosterkirche zeitlich vorzuziehen, d.h. bereits 2016 zu realisieren. Das vorgezogene Projekt beläuft sich auf CHF 2.3 Mio. Daran beteiligen sich der Kanton (Denkmalpflege) sowie der Bund (Bundesamt für Kultur / Denkmalpflege) mit CHF 0.8 Mio. Der Restbetrag ist durch Fundraising-Zusagen abgesichert.">
<styleClass>
<String fx:value="content-text-small" />
</styleClass>
</Text>
<LineBreakText/>
<Text userData="content-text-small" text="Weitere Fundraising-Anstrengungen sind notwendig um in den Jahren 2017 die Ostfassade der Klosterkirche sowie in den Jahren 2018/2019 die Innensanierung durchführen zu können. ">
<styleClass>
<String fx:value="content-text-small" />
</styleClass>
</Text>
</TextFlow>
</VBox>
</content>
</CollapsibleItemPane>
<CollapsibleItemPane titleText="Fundraising">
<content>
<VBox fx:id="content" managed="false" visible="false" spacing="3">
<TextFlow lineSpacing="3">
<Text userData="content-text-small" text="...">
<styleClass>
<String fx:value="content-text-small" />
</styleClass>
</Text>
</TextFlow>
</VBox>
</content>
</CollapsibleItemPane>
</VBox>
请注意,控件 CollapsibleItemPane 和 LineBreakText 是使用动态 FXML 的简单自定义组件(请参阅这些控件的存储库)。
不幸的是,没有简单的方法来描述这个问题,GitHub 存储库是我所知道的唯一方法,其他人可能会查看它。有人希望对这些问题有更多的了解,我...
提前致谢,丹尼尔
编辑 1:因为根据其他 channel 的一些建议,我更改了文本大小调整代码,但这对加载/渲染性能没有影响。从大 FXML 文件中删除样式类也没有效果。
编辑 2(在我的日常驱动程序 Nexus 6 上测试):在 LogCat 上我看到了这些警告
01-13 14:05:23.509: W/art(23324): Class com.sun.javafx.css.StyleManager failed lock verification and will run slower.
01-13 14:05:23.753: W/art(23324): Class javafx.scene.image.Image failed lock verification and will run slower.
01-13 14:05:23.764: W/art(23324): Class com.sun.javafx.iio.ImageStorage failed lock verification and will run slower.
01-13 14:05:23.921: W/linker(23324): /data/app/eu.dzim.example-1/lib/arm/libjavafx_font.so: is missing DT_SONAME will use basename as a replacement: "libjavafx_font.so"
01-13 14:05:23.922: W/System.err(23324): Loading FontFactory com.sun.javafx.font.freetype.FTFactory
01-13 14:05:23.922: W/System.err(23324): Subpixel: enabled
01-13 14:05:23.928: W/linker(23324): /data/app/eu.dzim.example-1/lib/arm/libjavafx_font_freetype.so: is missing DT_SONAME will use basename as a replacement: "libjavafx_font_freetype.so"
01-13 14:05:23.932: W/System.err(23324): Freetype2 Loaded (version 2.5.0)
01-13 14:05:23.932: W/System.err(23324): LCD support Enabled
01-13 14:05:23.934: W/System.err(23324): Temp file created: /data/user/0/eu.dzim.example/cache/+JXF1587292252.tmp
01-13 14:05:23.949: W/art(23324): Class com.sun.javafx.font.PrismFontFile failed lock verification and will run slower.
01-13 14:05:23.994: W/art(23324): Class com.sun.javafx.text.PrismTextLayoutFactory failed lock verification and will run slower.
01-13 14:05:24.006: W/art(23324): Class com.sun.javafx.text.PrismTextLayout failed lock verification and will run slower.
01-13 14:05:24.007: W/System.err(23324): File not found: /system/etc/system_fonts.xml
[... there are more in other log-blocks ...]
也许他们与此有关?
当我按下加载按钮时,出现以下日志
01-13 14:05:35.864: I/System.out(23324): don't add points, primary = -1
01-13 14:05:36.137: W/linker(23324): /data/app/eu.dzim.example-1/lib/arm/libjavafx_iio.so: is missing DT_SONAME will use basename as a replacement: "libjavafx_iio.so"
01-13 14:05:36.273: I/art(23324): Do full code cache collection, code=95KB, data=125KB
01-13 14:05:36.275: I/art(23324): After code cache collection, code=65KB, data=65KB
01-13 14:05:37.055: I/art(23324): Do partial code cache collection, code=96KB, data=124KB
01-13 14:05:37.056: I/art(23324): After code cache collection, code=95KB, data=124KB
01-13 14:05:37.056: I/art(23324): Increasing code cache capacity to 512KB
01-13 14:05:41.627: I/System.out(23324): ES2ResourceFactory: Prism - createStockShader: Texture_Color.frag
您可以看到手机显示 UI 所花费的时间(6 秒)。
最佳答案
我能够在我的 Nexus 6 上重现您的发现。
虽然我没有适合您的神奇解决方案,而且这可能不是一个正确的答案,但我会尝试添加一些可能对您有值(value)的信息。
首先,运行您的应用程序需要 6 秒来加载 fxml 文件。
所以我运行了 Android Device Monitor 应用程序 (Android sdk/tools/monitor),因为它可以帮助您在应用程序上运行方法分析(运行监视器,打开您的应用程序,在“设备”选项卡下选择进程,然后单击Start Method Profiling 按钮
,几秒钟后,再次单击停止。
然后打开 DDMS 透视图并查看分析结果:
从图中可以看出,大部分时间都用在了JavaFX应用线程内的文本布局(com.sun.javafx.text.PrismTextLayout.layout
)
为了衡量 TextFlow
节点的影响,我创建了一个新项目并添加了 ObjectRestauration.fxml 中的所有
文件到 View 的 ScrollPane 内的 VBox。TextFlow
节点
<View fx:id="secondary" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.gluonhq.textflow.views.SecondaryPresenter">
<center>
<ScrollPane BorderPane.alignment="CENTER">
<content>
<VBox prefWidth="350">
<TextFlow lineSpacing="3">
<Text text="Die Restaurierung der Klosterkirche St. Martin ist dringend notwendig: Nur so können wir das Kulturgut nationaler Bedeutung und seinen hohen kunsthistorischen Wert erhalten.">
<font>
<Font size="12"/>
</font>
<userData>
<Integer fx:value="12"/>
</userData>
</Text>
<Text text=" "/>
<ImageView preserveRatio="true" fitHeight="300">
<image>
<Image url="@img/kloster_werbung.jpg"/>
</image>
</ImageView>
...
运行此项目,加载包含所有内容的 View 需要 2-3 秒,我看到 com.sun.javafx.font.freetype.OSFreetype
或 消耗的时间com.sun.javafx.iio.jpeg.JPEGImageLoader
.
这是不可避免的,因为您无论如何都需要加载您的内容。但是您可以看到您的自定义组件需要花费大量时间来加载和管理该内容:内容需要 3 秒,自定义组件需要 3 秒。
我建议将 FXML 内容拆分为更多较小的内容,因为您希望在不同的可折叠 Pane 中显示它们,使用后台线程、缓存技术以及其他解决方案。
此外,删除对每个文本节点的字体和用户数据分配可能会有所帮助。
这个question也有好的地方关于使用 FXML 和反射。因此,您可能还可以找到一种以不同方式加载内容的方法,或者也可以尝试使用 FXML 编译器选项,例如 one .
关于android - JavaFXPorts:Android 上文本节点的渲染性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41632671/
在我的 OpenGL 程序中,我按顺序执行以下操作: // Drawing filled polyhedrons // Drawing points using GL_POINTS // Displa
我想传递一个包含原始页面的局部变量,这个变量只包含一个带有值的符号。 当我使用此代码时,它运行良好,可以在部分中访问 origin 变量: render :partial => "products",
为什么这个 HTML/脚本(来自“JavaScript Ninja 的 secret ”)不渲染? http://jsfiddle.net/BCL54/
我想在阅读完 View 后返回到特定的网页位置(跳转到页内 anchor )。换句话说,在 views.py 中,我想做类似的事情: context={'form':my_form} return r
我有一个包含单条折线的 PathGeometry,并以固定的间隔向该线添加一个新点(以绘制波形)。使用 Perforator 工具时,我可以看到每次向直线添加一个点时,WPF 都会将整个 PathGe
尝试了解如何消除或最小化网站上不同 JavaScript 库的渲染延迟。 例如,如果我想加载来自许多社交网络的“即时”关注按钮,它们似乎会相互阻止渲染,并且您会收到令人不快的弹出窗口。 (func
我有以 xyz 点格式表示 3D 表面(即地震断层平面)的数据。我想创建这些表面的 3D 表示。我使用 rgl 和 akima 取得了一些成功,但是它无法真正处理可能会自行折叠或在同一 x,y 点具有
我正在用 Libgdx 编写一个小游戏。 我有一个 Render[OpenGL] 线程,它不断对所有对象调用 render() 和一个更新线程不断对所有对象调用 update(double delta
我有一个 .Rmd 文件包含: ```{r, echo=FALSE, message=FALSE, results='asis'} library(xtable) print(xtable(group
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
请不要评判我,我只是在学习 Swift。 最近我安装了 MetalPetal 框架,并按照说明操作: https://github.com/MetalPetal/MetalPetal#example-
如果您尝试渲染 Canvas 宽度和高度之外的图像,计算机是否仍会尝试渲染它并使用资源来尝试渲染它?我只是想找出在尝试渲染图像之前检查图像是否在 Canvas 内是否更好。 最佳答案 我相信它仍然在无
我在 safari 中渲染时遇到问题。 在 firefox、chrome 和 IE 上。如下图所示: input.searchbox{-webkit-border-radius:10px;-moz-b
我正在尝试通过远程桌面在 Windows7 下运行我在 RHEL7 服务器中制作的 java 程序。 服务器中的所有java程序都无法通过远程桌面呈现。如果我在服务器位置访问服务器本身,它们看起来没问
我正处于一个新项目的设计阶段,该项目将采用数据集并将其加载到文档中,然后围绕模板呈现文档。呈现的文件可以是 CSV 数据集、PDF 营销信函、电子邮件……很多东西。数据不会是数学方程式,我只是在寻找一
有没有办法在不同的 div 下渲染 React 组件的子组件? ... ... ... ... ...
使用以下代码: import numpy as np from plotly.offline import iplot, init_notebook_mode import plotly.graph_
截至最近, meteor 的所有文档都指出 onRendered是一种在模板完成渲染时获取回调的新方法。和 rendered只是为了向后兼容。 但是,这似乎对我不起作用。 onRendered永远不会
所以在我的基本模板中,我有:{% render "EcsCrmBundle:Module:checkClock" %} 然后我创建了 ModuleController.php ... getDoctr
我正在使用 vue-mathjax 来编译我的 vue 项目中的数学方程。它正在编译第一个括号 () 之间的文本。我想防止编译括号内的字符串。在文档中我发现,对于$符号,如果我们想逃避编译,我们需要使
我是一名优秀的程序员,十分优秀!