在介紹優麒麟操作系統高分屏解決方案之前,我們有必要瞭解幾個概念:
- 分辨率:指給定的距離(或面積)內"點"或"像素"的數量。有時被稱為"解析度"。常用的描述分辨率的單位有:DPI(點每英寸)和 PPI(像素每英寸)。
- DPI (Dots Per Inch):常用於描述打印圖像上每英寸的墨點數量,可以理解為 dpi 是打印機通過墨粉成滴將圖像呈現在紙張上的一種表達方式;每英寸上 dots 數會影響打印的細節和整體質量;當我們設計的圖像要進行物理打印時,打印機將使用 DPI,不同型號和樣式的打印機都會根據其設置產生自己的唯一 DPI。
DPI圖片
- PPI (Pixels Per Inch):通常用於描述數字圖像的分辨率,表示屏幕可以顯示的固定像素數和數字圖像中像素的密度;PPI 計算公式 =√(x^2+y^2)/z,x為長度像素數,y為寬度像素數,z為屏幕尺寸;由於歷史原因我們現在平時所說的軟件像素應該是 PPI,中文意思是每英寸像素數,在系統中修改的 DPI 其實就是這個 PPI。
對於電腦而言,PPI 有三個層次:
1)顯示器 PPI,這是硬件,其 PPI 是出廠固定的,不可以更改的;
2)操作系統 PPI,操作系統可以將顯示器設置成自己的分辨率,作為用戶,對我們視覺有影響的是這個分辨率;
PPI圖片
接下來開始進入主題。隨著顯示器質量的提高,高分屏逐漸增多,很多用戶平時使用的機器都是2k屏甚至是4k屏,顯示器分辨率變大後,同樣的物理尺寸下可以表示更多的點。
優麒麟高分屏下自研應用的顯示效果
優麒麟高分屏下第三方應用的顯示效果
優麒麟系統上分別對於 Qt 與 GTK 這兩平臺上所寫應用進行瞭適配工作。
Qt 平臺
Qt 提供瞭以下方式來在應用程序中處理高DPI的支持:
- QT_AUTO_SCREEN_SCALE_FACTOR 根據顯示器的像素密度啟用自動縮放。這不會更改磅號字體的大小,多個屏幕可能會獲得不同的比例因子。
- QT_SCALE_FACTOR 定義整個應用程序的全局比例因子,包括字體的大小。
- QT_SCREEN_SCALE_FACTORS 指定每個屏幕的比例因子,這不會更改字體的大小。
- 從 Qt 5.6 開始引入瞭 Qt::AA_EnableHighDpiScaling 屬性,使得應用程序自動檢測顯示器的像素密度來實現自動縮放;而 Qt::AA_DisableHighDpiScaling 屬性用於關閉應用程序的縮放,不管上述三個變量的值為如何。
- 從 Qt 5.14 引入瞭環境變量 QT_ENABLE_HIGHDPI_SCALING 替換舊有的 QT_AUTO_SCREEN_SCALE_FACTOR,可以用來檢測顯示器的像素密度來實現自動縮放 。
一個關於高DPI術語表:
術語 | 定義 |
Device Independent Pixels | 應用程序使用像素,取決於操作系統獲取Qt的縮放比例 |
Device Pixels | 顯示器的像素 |
Device Pixel Ratio | 適用於操作系統或者Qt的比例系數 |
Logical DPI | 將字體大小轉換為以像素為單位的字體大小的分辨率,標準值為96,128,192... |
Physical DPI | 即顯示器的物理分辨率 |
GTK 平臺
對於 GTK 的程序,有以下兩種環境變量用於生效:
- GDK_SCALE:以整數倍來縮放UI元素。
- GDK_DPI_SCALE:用於補償通過GDK_SCALE進行縮放後應用程序的字體分辨率。
Xresources
最後還需要介紹一些關於 Xresources 的知識,在 ~/.Xresources 文件中設置 xft.dpi 幾乎可以縮放所有 Xorg 應用程序的字體,例如:xft.dpi: 192,這將會把字體放大兩倍,系統中默認 dpi 為 96。
介紹以上三種縮放方式,每一種方式都有自己的作用(縮放UI或文本),因此我們需要將他們適當的結合起來,整理成如下的一個表格:
應用程序 | Xresources | GTK環境變量 | QT環境變量 |
Firefox&&Chrome | UI&&文本 | UI&&文本 | |
GTK Apps | 文本 | UI&&文本 | |
常規 Xorg Apps | 文本 | ||
QT Apps | 文本 | UI&&文本 |
在優麒麟系統中結合以上三種方式的特點,將縮放接口統一整合到瞭 ukui-settings-daemon 之中,從而實現在高分屏下的縮放效果,縮放接口為:
gsettings set org.ukui.SettingsDaemon.plugins.xsettings scaling-factor 縮放倍數
以上就是對優麒麟高清屏支持縮放技術的介紹,後續將為大傢帶來更多優麒麟操作系統的開發經驗分享。
請先 登入 以發表留言。