JavaFX 8 HiDPI支持

我刚刚在Arch Linux上的4k屏幕上试用了JavaFX Hello World示例 ,但遗憾的是GUI无法扩展。

文件说

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

那么如何让我的应用程序dpi识别?

Hi-DPI支持各种设备

对于具有视网膜显示器的OS X Mac,它应该“正常工作” – JavaFX知道Hi-DPI Mac并且将适当地扩展UI。 如果将VBox中的间距设置为8,那么这是一个独立于设备的单元; 在非视网膜显示器上,它将占用8个像素,在具有两倍分辨率的视网膜显示器上,间距将占用16个像素。 因为视网膜显示器还具有DPI的两倍以及非视网膜显示器的两倍的分辨率,所以无论设备如何,空间的物理屏幕测量都是相同的。

对于Windows和Linux设备,您的结果可能不太令人满意,因为JavaFX 8u20目前默认情况下不会在这些设备上找出任意DPI分辨率并适当缩放。 您可以做的是在css中执行大部分测量为em单位 (基于场景根的默认字体的点大小)和类似于fxml ,然后根据场景根的默认字体设置点大小。您通过查询屏幕的DPI分辨率确定了什么。 有关详细信息和示例代码,请参阅本答案中的讨论: javafx自动resize和按钮填充 。

具体到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台式机仍然是一个非常流行的东西,绝对不适合所有人 – 我相信这种情况会随着时间的推移而改变。

位图图像

来自Hi-DPI的JavaFX团队主管博客条目 :

在Apple的应用程序中(从带有视网膜显示屏的iPhone和iPad开始),问题的解决方案是应用程序开发人员为每个图像资产提供两个图像而不是一个图像。 例如,启动画面将提供两个图像,一个是正常分辨率,另一个是分辨率的2倍。 这些文件的名称相同,但是2x是根据某些约定命名的,因此在运行时平台将在幕后查看视网膜上的2x版本。 通过这种方式,您的应用程序会显示“fooImage.png”,但在具有视网膜显示的计算机上会查找“fooImage@2x.png”。

我不知道Hi-DPI显示器的这个位图图像选择function当前是否在Java 8u20中 – 您可能必须通过使用screen.getDpi()查询屏幕,然后加载相应的位图来自己实现它。

4K设备

4K推动了很多像素。 当这样的图形管道可用时,JavaFX将默认使用硬件加速图形管道。 某些图形硬件可能无法完全针对4K显示进行优化(例如,video内存不足),这可能会导致应用程序无法正常工作或性能不佳。 我也不相信目前在各种4K设备上调查JavaFX性能已经付出了很多努力 – 它可能“只是工作”,但它可能也没有。 您需要在目标硬件上测试应用程序,以确定在该硬件上运行时JavaFX应用程序的当前function。 您可能还需要根据上面的一些建议调整应用程序。

尝试使用JavaFX显示4Kvideo时,用户报告了JavaFX 8u20的问题:

  • JavaFX超高清(4K)video

背景

在OS X下支持Hi-DPI(可能)比Windows / Linux设备简单,因为目标设备是视网膜或非视网膜显示器,其中一个是另一个的精确2倍,可以利用OS X系统的直接支持帮助实现视网膜缩放。 对于Windows / Linux,可能需要的是能够以非2 倍的因子进行缩放,并且(当前未完成和已调度的)要素RT-32521支持全局坐标缩放与基于DPI的默认值 。 按整数换算通常可以获得最佳的可见结果。

其他资源

  • Kynosarges讨论JavaFX DPI Scaling 。
  • JavaFX团队负载在视网膜Mac上写了一篇关于JavaFX的博客 (现在有点过时,因为JavaFX现在支持视网膜Mac)。
  • Randahl对JavaFX的看法:设计多个解决方案 。
  • Apple在优化高分辨率设备的应用程序方面有一些很好的建议,它不是特定于JavaFX的,而且一些建议不适用于JavaFX,但仍有一些有用的一般原理和技术。

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

如果您对Hi-DPI对JavaFX的支持有任何疑问,我建议您在openjfx-dev JavaFX开发人员邮件列表中询问他们。

维基百科

这个答案可能有一些可能的不一致或错误,可能会随着时间的推移而出现。 我已经做了答案社区维基。 如果您了解JavaFX上的Hi-DPI的特定更正,设备和操作系统限制或支持模型支持,请随时编辑此答案或将其移至OpenJFX wiki (无论如何它可能属于)。