JavaFX 8高分辨率显示支持

25

我刚刚在Arch Linux的4k屏幕上尝试了JavaFX Hello World示例,但不幸的是GUI没有进行缩放。

文档称:

Hi-DPI支持。JavaFX 8现在支持Hi-DPI显示器。

那么我该如何使我的应用程序适配dpi?


除了你的应用程序,你的操作系统的任何部分都能够正确支持“高分辨率”模式吗?根据Arch Wiki的说法,高分辨率支持最多只是零星的。 - Ideasthete
我使用支持HiDPI缩放因子的GNOME。 - tryzor
2个回答

36

各种设备的Hi-DPI支持

对于具有视网膜显示屏的OS X Mac,JavaFX会自动适配Hi-DPI Mac,并相应地调整UI的比例。如果您将VBox中的间距设置为8,则这是一种设备无关的单位;在非视网膜显示屏Mac上,它将占用8个像素,在具有双倍分辨率的视网膜显示屏上,间距将占用16个像素。因为视网膜显示屏的DPI是非视网膜显示屏的两倍,同时分辨率也是两倍,所以无论设备如何,空间的物理屏幕测量值都将保持不变。

对于Windows和Linux设备,由于JavaFX 8u20目前默认不支持此类设备上的任意DPI分辨率并适当缩放,因此您可能会得到不太满意的结果。您可以使用em单位的css(基于场景根默认字体的点大小)进行大部分测量,并且对于fxml同样如此,然后根据查询屏幕的DPI分辨率确定场景根默认字体的点大小。有关进一步信息和示例代码,请参见此答案中的讨论:javafx automatic resizing and button padding

Gnome特定

Gnome 3具有缩放因子设置,可通过此命令进行控制:

gsettings set org.gnome.desktop.interface scaling-factor 2

通过读取用户的gnome配置文件来查询此缩放因子,并结合查询屏幕 DPI ,以确定一个适当的缩放因子,然后使用上面描述的技术应用缩放。

个人经历 - 当我几天前在 Hi-DPI 显示器上尝试使用 Gnome 3 缩放(CentOS 7 和一个最近的 Fedora 发布版)时,我发现 Linux 下应用程序对 Hi-DPI 的整体支持还是很不完善的。当然,相比 CentOS 6 ,它的支持有了很大改进,但仍然需要努力实现跨窗口系统工具包、标准应用和第三方应用程序的高质量 Hi-DPI 支持。因此,我认为运行 HiDPI Gnome 桌面仍然是一件非常先进的事情,绝对不适合每个人 - 我相信这种情况会随着时间的推移而改变。

位图图像

从 JavaFX 团队领导的Hi-DPI 博客文章中:

在苹果的应用程序中(从 iPhone 和 iPad 开始,它们有视网膜显示器),问题的解决方案是让应用程序开发人员为每个图像资源提供两个图像而不是一个。例如,闪屏将提供两个图像,一个是正常分辨率的,另一个是 2x 分辨率的。这些文件的名称相同,但是按照某种约定命名了 2x 版本,以便在运行时平台在视网膜后台查找 2x 版本。通过这样的方式,您的应用程序会说“fooImage.png”,但是在具有视网膜显示器的计算机上实际查找“fooImage@2x.png”。

我不知道 Java 8u20 中是否已经有了针对 Hi-DPI 显示器的位图图像选择功能 - 您可能需要通过使用 screen.getDpi() 查询屏幕,然后加载适当的位图来自己实现它。

4K 设备

4K 是要推送的大量像素。当可用时,JavaFX 默认使用硬件加速的图形管道。某些图形硬件可能没有完全针对 4K 显示进行优化(例如,视频 RAM 不足),这可能导致应用程序无法工作或性能不佳。我也不认为目前已经花了很多精力去调查在各种 4K 设备上运行 JavaFX 的性能 - 它可能“只是工作”,但也可能不是。您需要在目标硬件上测试应用程序,以确定 JavaFX 在该硬件上运行时的当前功能。您还可能需要根据上面的一些建议调整应用程序。

一位用户报告了在尝试使用 JavaFX 显示 4K 视频时遇到的问题。

背景

在Mac OS X下支持Hi-DPI可能比Windows/Linux设备要简单,因为目标设备分别是视网膜和非视网膜显示器,其中一个是另一个的精确2倍缩放,并且可以利用来自OS X系统的直接支持来实现视网膜缩放。 对于Windows / Linux,可能需要能够以除2倍之外的因子进行缩放,而这由(当前未解决但已计划的)功能请求RT-32521支持基于DPI的默认全局坐标缩放来覆盖。 通常,按整数倍缩放可得到最佳可见结果。

其他资源

  • Kynosarges讨论JavaFX DPI缩放
  • JavaFX团队写了一篇有关在视网膜Mac上使用JavaFX的博客文章(这篇文章现在有点过时,因为JavaFX现在支持视网膜Mac)。
  • Randahl对JavaFX:设计多分辨率的看法。
  • 苹果公司有一些关于面向高分辨率设备优化应用程序的好建议,这不是针对JavaFX的,其中一些建议不适用于JavaFX,但仍然有一些有用的普遍原则和技术。

完整的面向Hi-DPI设备的编码指南超出了此特定答案的范围 - 您可以搜索各种网络资源以获取更多信息。

如果您对JavaFX的Hi-DPI支持有进一步问题,请在openjfx-dev JavaFX开发者邮件列表上提问。

维基答案

本答案可能存在一些可能的不一致性或错误,并且可能会随时间而过时。 我已经使答案成为社区Wiki。 如果您知道特定的纠正,设备和操作系统限制或对JavaFX的Hi-DPI支持模型支持,请随时编辑此答案或将其移到OpenJFX wiki(它可能实际属于那里)。


感谢您提供这么全面的答案。我会尝试在不同平台上测试哪种方法最有效。 - tryzor

1

我遇到了同样的问题。我在我的Surface Pro 3上构建了JavaFX应用程序,但它无法缩放,而fxml应用程序可以。然后我安装了jre8u221,而不是替换它建议的更新版本。这解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接