在閱讀本文之前,讀者可以先了解一下我之前發(fā)布的一篇有關(guān)像素密度計算的文章《Qt for Android屏幕DPI計算方法》姚糊。
在前面的文章中描述了計算手機(jī)DPI的方法饿自,這里需要提醒大家的是,即使通過設(shè)備的像素密度值踪栋,選取了正確的圖片資源文件夾敛腌,在QML移動開發(fā)中卧土,也還是需要對圖片大小做一個換算處理。請看下面代碼片段:
import QtQuick 2.12
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.12
import QtQuick.Controls.Styles 1.4
import QtQuick.Window 2.2
...
Image {
id: backgoundImage
anchors.fill: parent
width: sourceSize.width/Screen.devicePixelRatio
height: sourceSize.height/Screen.devicePixelRatio
source: "qrc:/img-res/"+appEngine.resourceFolder()+"/signin_bg.png"
}
...
- sourceSize.width得到的是圖片的像素寬度像樊,用它除以設(shè)備像素比值(請看我前面發(fā)表的文章)尤莺,得到設(shè)備無關(guān)像素值。為什么需要這樣做呢生棍?在QML for Android開發(fā)中颤霎,對象的寬度和高度的單位不是像素,而是設(shè)備無關(guān)像素值(強(qiáng)調(diào):這里指移動開發(fā)涂滴,而不是桌面開發(fā))友酱。可以這樣證明:在1080x1920像素分辨率的手機(jī)上柔纵,如果讀者在QML代碼中創(chuàng)建一個矩形或者圖片對象缔杉,并把它的寬高分別設(shè)置為1080和1920,可以發(fā)現(xiàn)這個矩形或者圖片的右邊和下邊搁料,遠(yuǎn)遠(yuǎn)的顯示到了屏幕的外面或详,而通過下面代碼得到的寬高进苍,才是真正剛好鋪滿屏幕的寬高,這個寬高是與設(shè)備無關(guān)的:
QRect screenRect = QGuiApplication::primaryScreen()->geometry();
int screenW = screenRect.width();
int screenH = screenRect.height();
- appEngine.resourceFolder()
這是從C++代碼中獲取的圖片資源文件夾名稱鸭叙,把它拼接在QML代碼中的圖片資源路徑中,它是通過DPI而決定的拣宏,請看下面代碼:
void Engine::uiInit()
{
int dpi = this->getScreenDPI();
qDebug()<<__LINE__<<__FUNCTION__<<"this->getScreenDPI() = "<<dpi;
if(80 <= dpi && dpi < 120)
m_resourceFolder = "ldpi";
else if(120 <= dpi && dpi < 160)
m_resourceFolder = "mdpi";
else if(160 <= dpi && dpi < 240)
m_resourceFolder = "hdpi";
else if(240 <= dpi && dpi < 320)
m_resourceFolder = "xhdpi";
else if(320 <= dpi && dpi < 480)
m_resourceFolder = "xxhdpi";
else if(480 <= dpi && dpi < 640)
m_resourceFolder = "xxxhdpi";
qDebug()<<__LINE__<<__FUNCTION__<<"m_resourceFolder = "<<m_resourceFolder;
}
QString Engine::resourceFolder()
{
return m_resourceFolder;
}
-
不同DPI設(shè)備的圖片資源保存方法