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