JavaFX 中的像素、分辨率与缩放比
JavaFX 中的像素、分辨率與縮放比
- 總結(jié)與補(bǔ)充
??JavaFX 中,一般需要對(duì)每個(gè)組件設(shè)置一個(gè)尺寸值,這個(gè)值實(shí)際上就是像素值(pixel,px)。像素值是什么呢?在 Windows 上,一般使用任意截圖軟件進(jìn)行截圖選定區(qū)域后,在左上角就會(huì)顯示該區(qū)域的寬(width)和高(height),這個(gè)寬和高的單位就是像素。
??不過(guò)要注意的問(wèn)題是,像素有相對(duì)值與絕對(duì)值之分。這個(gè)問(wèn)題有點(diǎn)復(fù)雜,這里詳細(xì)解釋一下。
-
絕對(duì)像素,指的是像素的最終實(shí)際值,也就是上面所說(shuō)的截圖軟件中顯示的值。關(guān)于這個(gè)值,在 Windows 中將使用兩個(gè)參數(shù)來(lái)控制。一個(gè)是(顯示)分辨率(resolution),另一個(gè)是縮放比例(scale)。任何 UI 在屏幕中顯示時(shí),最終使用的都是絕對(duì)像素值。
??關(guān)于分辨率和縮放比例,在 Windows 中可以自行設(shè)定,方法如下:
-
相對(duì)像素,指的是像素的計(jì)算的基準(zhǔn)值。上面所說(shuō)的 JavaFX 組件的尺寸實(shí)際上是一個(gè)相對(duì)像素值。
??絕對(duì)像素與相對(duì)像素之間有什么聯(lián)系呢?絕對(duì)像素需要通過(guò)相對(duì)像素與縮放比例來(lái)算得。而顯示器的分辨率將給出顯示器的絕對(duì)像素值,也就是顯示器右下角相對(duì)于左上角的絕對(duì)像素坐標(biāo)。以筆者上面圖片的中的為例,當(dāng)分辨率為 1920 × 1080、縮放比例為 125% 時(shí):
-
顯示器右下角的絕對(duì)像素坐標(biāo)為:
-
width:1920
-
height:1080
-
-
顯示器右下角的相對(duì)像素坐標(biāo)為:
-
width:1920 / 1.25 = 1536
-
height:1080 / 1.25 = 864
-
-
屏幕中任意一點(diǎn)的絕對(duì)像素坐標(biāo)為:
(其中,(x, y) 為該點(diǎn)的相對(duì)對(duì)像素坐標(biāo)。α 為屏幕的縮放比。)
-
width:x * α
-
height:y * α
【提示】
-
在 Java 中,有很多方式可以實(shí)現(xiàn)絕對(duì)像素與相對(duì)像素之間的轉(zhuǎn)化。例如,在 JavaFX 中,可以使用如下方法分別獲取寬和高的縮放比:
double scaleX = Screen.getPrimary().getOutputScaleX(); double scaleY = Screen.getPrimary().getOutputScaleY(); -
還可以使用虛擬機(jī)參數(shù) -Dprism.allowhidpi = XXX,來(lái)決定 JavaFX 是否采納系統(tǒng)的縮放比。如果將此處的 XXX 設(shè)為 false,這相當(dāng)于將系統(tǒng)的縮放比設(shè)為了 1。此虛擬機(jī)參數(shù)也可以在 Java 程序中指定,如下。不過(guò),必須要在初始化 UI 程序之前設(shè)置才會(huì)生效。
System.setProperty("prism.allowhidpi", "XXX"); // 其中,XXX 在實(shí)際的環(huán)境下應(yīng)改為 true 或 false不過(guò),程序不應(yīng)該過(guò)分依賴此設(shè)置。由于此設(shè)置對(duì)整個(gè) UI 界面都會(huì)起作用,所以不建議使用此設(shè)置來(lái)控制 UI 的行為。應(yīng)該使用前面的方法獲取縮放比來(lái)決定 UI 應(yīng)該如何顯示。
很多應(yīng)用都在設(shè)置提供了一種 適配系統(tǒng)縮放比例 的選項(xiàng)。這實(shí)際上就是決定系統(tǒng)的縮放比會(huì)不會(huì)生效。不生效指的是將縮放比視為 1。這個(gè)設(shè)置通常需要應(yīng)用重啟才會(huì)起作用。在 JavaFX 中,可以使用上述的方法來(lái)實(shí)現(xiàn)這個(gè)功能。
-
??絕對(duì)像素與相對(duì)像素以哪個(gè)為準(zhǔn)比較好呢?不能一概而論。有些時(shí)候應(yīng)該以絕對(duì)像素為準(zhǔn),有些時(shí)候應(yīng)該以相對(duì)像素為準(zhǔn),有些時(shí)候無(wú)關(guān)緊要。由于 UI 在屏幕中顯示時(shí),最終使用的都是絕對(duì)像素值。所以這個(gè)問(wèn)題就是考慮在編程中該以什么值來(lái)表示屏幕中的絕對(duì)像素。
??如果是以絕對(duì)像素為準(zhǔn)(在代碼、測(cè)量統(tǒng)計(jì)時(shí)的數(shù)據(jù)中直接使用絕對(duì)像素),就要求 UI 在各種環(huán)境下的界面尺寸都保持一致。有時(shí)候,光是考慮絕對(duì)像素也不能做到這一點(diǎn),還要結(jié)合設(shè)備的型號(hào)和顯示器尺寸作調(diào)節(jié)。因?yàn)轱@示屏的 DPI 可以通過(guò)調(diào)整分辨率來(lái)改變。但這會(huì)使用軟件失去屏幕適配的能力,一般不會(huì)使用這種方法,因此 JavaFX 也沒(méi)有采用。
??如果是以相對(duì)像素為準(zhǔn),就要求 UI 組件間的比例保持一致,而實(shí)際的大小無(wú)關(guān)緊要。
??如果希望 UI 組件可以自動(dòng)調(diào)整大小與間距,則使用哪個(gè)無(wú)關(guān)緊要。
總結(jié)與補(bǔ)充
-
在 JavaFX 中,傳入組件的像素值一般是相對(duì)像素,而直接從屏幕中獲取的像素是絕對(duì)像素。它們之間需要借助縮放比來(lái)進(jìn)行轉(zhuǎn)化。
-
截圖軟件上顯示的是絕對(duì)坐標(biāo)。
-
如果使用與屏幕坐標(biāo)的相關(guān) API 時(shí),發(fā)現(xiàn)傳入的坐標(biāo)與實(shí)際生效的坐標(biāo)差異很大,這說(shuō)明此 API 可能使用的是相對(duì)坐標(biāo)。請(qǐng)嘗試將此坐標(biāo)除以 屏幕縮放比 再進(jìn)行傳入。
總結(jié)
以上是生活随笔為你收集整理的JavaFX 中的像素、分辨率与缩放比的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 解决IntelliJ IDEA下Mave
- 下一篇: 如何在 JavaFX 的 TextAre