Android不同螢幕尺寸多解析度適配

2021-09-10 08:13:00 字數 3787 閱讀 1779

displaymetrics, isvalid=true}

首先看以上兩條資訊的內容,以第一條為例解釋下每個元素的意義:

displayinfo{

「real 1280 x 720」:是指真實的螢幕解析度;

「50.0 fps」:幀頻,即螢幕每秒重新整理次數;

「rotation 0」:轉屏,0代表沒有旋轉;

「density 160(160.0 x 160.0)dpi」: density表示每英吋有多少個dp,它的單位是dpi:dot per inch ;

displaymetrics{

「density」:真實dpi(對角線列印點(dp)/對角線的英吋)與基準dpi(160)的比值;

" width":是指當下可用的寬度;

「height」:是指當下可用的高度;

「scaleddensity」:字型縮放值;

「xdpi」:x軸方向上,每英吋的畫素數;

「ydpi」:y軸方向上,每英吋的畫素數;

其次,有乙個density 和scaleddensity,並且值相同,但測試時會發現有時候density 和scaleddensity的值並不相同,眾所周知假如在xml裡定義1dp=1dp時,如果density=2.0,那麼最終得到的值會是2dp.那麼看一下getdimensio方法,確認一下是不是(1dp)x(density)得到的2dp:

getdimension方法的核心:

publicstaticdisplaymetrics metrics)

switch(unit) {

casecomplex_unit_px :

returnvalue;

casecomplex_unit_dip :

returnvalue * metrics.density ;

casecomplex_unit_sp :

returnvalue * metrics.scaleddensity ;

casecomplex_unit_pt :

returnvalue * metrics.xdpi * (1.0f/72);

casecomplex_unit_in :

returnvalue * metrics.xdpi ;

casecomplex_unit_mm :

returnvalue * metrics.xdpi * (1.0f/25.4f);

return0;

由此方法可看出,dp的縮放值是density,而sp的縮放值是scaleddensity。

density我們知道是真實dpi與基準dpi的比值得來,那麼scaleddensity是如何得來的呢?

系統中對字型有如下配置,預設是normal ,而且大部分機型並不支援使用者修改字型,那麼可以猜測scaleddensity 跟系統字型大小配置有關:

small:0.9  

normal:1.0  

large:1.1  

extra large:1.15  

其中一般預設是1.0,那麼scaleddensity=(字型大小)x(density).猜測是這樣,並沒有做驗證測試。

了解完dp,sp,px的含義之後,再來看一下解析度適配。

假定以base為基準解析度:

base:{

dpi=160;

尺寸=8x4.5;

解析度=1280x720

此時 8 inch(英吋)=160dp*8

8 inch(英吋)=160px*8

參照1:{

dpi=320;

尺寸=8x4.5;

解析度=1280x720

此時 8 英吋=320dp*8

8 英吋=160px*8

也就是說,滿屏的時候px值相同,dp值系統會自動縮放

參照2:{

dpi=160;

尺寸=16x9;

解析度=1280x720

此時 16 英吋=160dp*16

16 英吋=80px*16

也就是說,滿屏的時候px值相同,dp值手動放大2倍

參照3:{

dpi=320;

尺寸=16x9;

解析度=1280x720

此時 16 英吋=320dp*16

16 英吋=80px*16

也就是說,滿屏的時候px值相同,dp值系統放大2倍後再手動放大2倍

參照4:{

dpi=160;

尺寸=8x4.5;

解析度=1920x1080

此時 8 英吋=160dp*8

8 英吋=240px*8

也就是說,滿屏的時候px值放大1.5倍,dp值不變

參照5:{

dpi=320;

尺寸=8x4.5;

解析度=1920x1080

此時 8 英吋=320dp*8

8 英吋=240px*8

也就是說,滿屏的時候px值放大1.5倍,dp值系統自動縮放

參照6:{

dpi=160;

尺寸=16x9;

解析度=1920x1080

此時 16 英吋=160dp*16

16 英吋=120px*16

也就是說,滿屏的時候px值放大1.5倍,dp值手動放大2倍

參照7:{

dpi=320;

尺寸=16x9;

解析度=1920x1080

此時 16 英吋=320dp*16

16 英吋=120px*16

也就是說,滿屏的時候px值放大1.5倍,dp值系統縮放後再手動放大2倍

從以上可以看出,當解析度不變的時候,無論dpi與螢幕尺寸如何變化,px值不變,當解析度變化時,目標px值=基準px*scale

。而以dp為單位的話,螢幕尺寸以及dpi的變化都會引起dp的變化。即影響px的因素只有解析度,而影響dp的因素有dpi和螢幕尺寸。

因此,做多解析度適配時,最簡單精準的方法是以px為單位。

當解析度不同,但長寬比相同的時候,那麼scalew(目標寬/基準寬) 與scaleh(目標高/基準高)的值是相同的,那麼scale很容易得出,即(目標寬/基準寬)。而當解析度不同時,如果寬我們按照scalew縮放,高按照scaleh縮放,那麼會變形,文字也會在大小上產生偏差,如果我們按照基準長寬比縮放,那麼和文字會保持不變,但是在乙個2:1的的矩形螢幕上展示1:1的正方形ui,效果可能會有意想不到的變化。

一般電視機上長寬比是4:3和16:9,假定基準長寬是16:9,目標長寬是16:12,那麼scalew=1,scaleh=1.33.如果我們採取等比例縮放,假如乙個控制項長度為16,高為9,用scalew縮放後長度為16<=16,高為9<=12,用scaleh縮放後長度為21.28>16,高為11.97<=12,也就是說用scaleh會導致控制項長度超出螢幕,因此等比例縮放時,scale取值為scalew和scaleh中較小的乙個。

華數tv3.0+版本中,只適配1280x720和1920x1080兩種解析度,而且長寬比均為16:9,因此只需要兩個在這兩個包下

寫兩個dimens檔案即可,字型與控制項的單位均為px.

呼叫方法:

xml中:

**中:

android 開發適應不同螢幕尺寸應用

1.px pixels 畫素 螢幕上的點 與密度相關。密度大了,單位面積上的px會比較多。2.dip或dp 與密度無關的畫素 這個和裝置硬體有關,為了支援wvga hvga和qvga 5進製空間 推薦使用這個。一種基於螢幕密度的抽象單位。設定一些view的寬高可以用這個,一般情況下,在不同解析度,都...

Android各種螢幕尺寸

下文 qvga即 quarter vga 顧名思義即vga的四分之一尺寸,亦即在液晶螢幕 lcd 上輸出的解析度是240 320畫素。qvga支援螢幕旋轉,可以開發出相應的程 序,以顯示旋轉90 180 270 螢幕位置。由handera公司發布。多用於手持 移動裝置。需要說明的是有些 把qvga螢...

Android各種螢幕尺寸

下文 qvga即 quarter vga 顧名思義即vga的四分之一尺寸,亦即在液晶螢幕 lcd 上輸出的解析度是240 320畫素。qvga支援螢幕旋轉,可以開發出相應的程 序,以顯示旋轉90 180 270 螢幕位置。由handera公司發布。多用於手持 移動裝置。需要說明的是有些 把qvga螢...