1. 程式人生 > >android 常見解析度(mdpi、hdpi 、xhdpi、xxhdpi )

android 常見解析度(mdpi、hdpi 、xhdpi、xxhdpi )

查詢到執行的system service後,就可以在dumpsys後面加上service的名字,檢視指定的service資訊。

adb shell dumpsys activity

adb shell dumpsys cpuinfo

adb shell dumpsys battery

adb shell dumpsys window(最後部分可以看到解析度的資訊)=====

-------------------------------------------------

 Android Developers關於dp的文件我看過N次,那個px和dp的轉換公式我記得很清楚: px = dp * (dpi / 160)

,原來這裡的dpi是歸一化後的dpi,可能值只有120(low)、160(medium)、240(high)、 320(xhigh)四種,而我之前理解的竟然是實際裝置真實的dpi!

-------------------------------------------------------------------------------------------

1 Android手機目前常見的解析度

4:3
VGA     640*480 (Video Graphics Array)
QVGA  320*240 (Quarter VGA)
HVGA  480*320 (Half-size VGA)
SVGA  800*600 (Super VGA)

5:3
WVGA  800*480 (Wide VGA)
16:9
FWVGA 854*480 (Full Wide VGA)
HD        1920*1080 High Definition
QHD     960*540
720p    1280*720  標清
1080p  1920*1080 高清

1.2 解析度對應DPI
"HVGA    mdpi"
"WVGA   hdpi "
"FWVGA hdpi "
"QHD      hdpi "
"720P     xhdpi"
"1080P   xxhdpi "      =======》看清

2 螢幕適配的注意事項
2.1.1 AndroidManifest.xml設定
在中Menifest中新增子元素

android:anyDensity="true"時,應用程式安裝在不同密度的終端上時,程式會分別載入xxhdpi、xhdpi、hdpi、mdpi、ldpi資料夾中的資源。相反,如果設為false,即使在資料夾下擁有相同資源,應用不會自動地去相應資料夾下尋找資源:
1) 如果drawable-hdpi、drawable-mdpi、drawable-ldpi三個資料夾中有同一張圖片資源的不同密度表示,那麼系統會去載入drawable_mdpi資料夾中的資源;
2) 如果drawable-hpdi中有高密度圖片,其它兩個資料夾中沒有對應圖片資源,那麼系統會去載入drawable-hdpi中的資源,其他同理;
3) 如果drawable-hdpi,drawable-mdpi中有圖片資源,drawable-ldpi中沒有,系統會載入drawable-mdpi中的資源,其他同理,使用最接近的密度級別。
2.1.2 橫屏豎屏目錄區分
1) drawable
a) drawable-hdpi該圖片即適用於橫屏,也適用於豎屏;
b) drawable-land-hdpi,當螢幕為橫屏,且為高密度時,載入此資料夾的資源;
c) drawable-port-hdpi,當螢幕為豎屏,且為高密度時,載入此資料夾中的資源。其他同理。
2) layout
在res目錄下建立layout-port和layout-land兩個目錄,裡面分別放置豎屏和橫屏兩種佈局檔案,以適應對橫屏豎屏自動切換。
2.2 多螢幕適配的4條黃金原則
1) 在layout檔案中設定控制元件尺寸時應採用fill_parent、wrap_content、match_parent和dp;
具體來說,設定view的屬性android:layout_width和android:layout_height的值時,wrap_content,match_parent或dp比px更好,文字大小應該使用sp來定義。
2) 在程式的程式碼中不要出現具體的畫素值,在dimens.xml中定義;
為了使程式碼簡單,android內部使用pix為單位表示控制元件的尺寸,但這是基於當前螢幕基礎上的。為了適應多種螢幕,android建議開發者不要使用具體的畫素來表示控制元件尺寸。
3) 不使用AbsoluteLayout(android1.5已廢棄) ,可以使用RelativeLayout替代;
4) 對不同的螢幕提供合適大小的圖片。
不同大小螢幕用不同大小的圖片,low:medium:high:extra-high圖片大小的比例為3:4:6:8;舉例來說,對於中等密度(medium)的螢幕你的圖片畫素大小為48×48,那麼低密度(low)螢幕的圖片大小應為36×36,高(high)的為72×72,extra-high為96×96。
2.3 使用9-patch PNG圖片
使用圖片資源時,如果出現拉伸,因為圖片處理的原因,會變形,導致介面走形。9-patch PNG圖片也是一種標準的PGN圖片,在原生PNG圖片四周空出一個畫素間隔,用來標識PNG圖片中哪些部分可以拉伸、哪些不可以拉伸、背景上的邊框位置等。
“上、左”定義可拉伸區域
“右、下”定義顯示區域,如果用到完整填充的背景圖,建議不要通過android:padding來設定邊距,而是通過9-patch方式來定義。
Android SDK中提供了編輯9-Patch圖片的工具,在tools目錄下draw9patch.bat,能夠立刻看到編輯後的拉伸效果,也可以直接用其他圖片編輯工具編輯,但是看不到效果。
2.4 不同的layout
Android手機螢幕大小不一,有480x320, 640x360, 800x480……
怎樣才能讓Application自動適應不同的螢幕呢?

其實很簡單,只需要在res目錄下建立不同的layout資料夾,比如:layout-640x360、layout-800x480……所有的layout檔案在編譯之後都會寫入R.java裡,而系統會根據螢幕的大小自己選擇合適的layout進行使用。

總結:最好在mainifest裡面新增

<!--對於很高的解析度,除採用相應的圖片外,還需要加上如下配置,來更好的適配螢幕 -->
    <supports-screens
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:anyDensity="true" />

in
表示英寸,是螢幕的物理尺寸。每英寸等於2.54釐米。例如我們經常說的手機螢幕大小有,5(英)寸、4(英)寸就是指這個單位。這些尺寸是螢幕的對角線長度。如果手機的螢幕是4英寸,表示手機的螢幕(可視區域)對角線長度是4 X 2.54 = 10.16釐米
dpi
dpi是Dots Per Inch的縮寫, 每英寸點數,即每英寸包含畫素個數。比如320X480解析度的手機,寬2英寸,高3英寸, 每英寸包含的畫素點的數量為320/2=160dpi(橫向)或480/3=160dpi(縱向),160就是這部手機的dpi,橫向和縱向的這個值都是相同的,原因是大部分手機螢幕使用正方形的畫素點。
density
螢幕密度,density和dpi的關係為 density = dpi/160
dp
也即dip,裝置獨立畫素,device independent pixels的縮寫,Android特有的單位,在螢幕密度dpi = 160螢幕上,1dp = 1px。
sp
和dp很類似,一般用來設定字型大小,和dp的區別是它可以根據使用者的字型大小偏好來縮放。
Android Drawable
我們新建一個Android專案後應該可以看到很多drawable資料夾,分別對應不同的dpi
drawable-ldpi (dpi=120, density=0.75)
drawable-mdpi (dpi=160, density=1)
drawable-hdpi (dpi=240, density=1.5)
drawable-xhdpi (dpi=320, density=2)
drawable-xxhdpi (dpi=480, density=3)

市面上的一些Android教程大多都是教的是為每種dpi都出一套圖片資源,這個固然是一種解決辦法,但同時也是一種非常笨的方法,為美工或者設計增加了不少的工作量不說,同時也會讓你的apk包變的很大。那麼有沒有什麼好的方法既能保證螢幕適配,又可以最小佔用設計資源,同時最好又只使用一套dpi的圖片資源呢?
首先必須清楚一個自動渲染的概念,Android SDK會自動螢幕尺寸選擇對應的資原始檔進行渲染,如SDK檢測到你手機dpi是160的話會優先到drawable-mdpi資料夾下找對應的圖片資源,注意只是優先,假設你手機dpi是160,但是你只在xhpdi資料夾下有對應的圖片資原始檔,程式一樣可以正常執行。所以理論上來說只需要提供一種規格的圖片資源就ok了,如果只提供ldpi規格的圖片,對於大解析度的手機如果把圖片放大就會不清晰,所以需要提供一套你需要支援的最大dpi的圖片,這樣即使使用者的手機解析度很小,這樣圖片縮小依然很清晰。
xhdpi成為首選
上面說了只需要提供一套大的dpi的圖片就ok了,現在市面手機解析度最大可達到1080X1920的解析度,如Nexus5,dpi屬於xxhdpi,但是畢竟還沒普及,目前市面上最普遍的高階機的解析度還多集中在720X1080範圍,也就是多集中在xhdpi,所以目前來看xhpdi規格的圖片成為了首選。當然隨著技術規格的提高以後發展,以後可能市場上xxdpi的手機會越來越普遍,但這是後話。  設計資源緊張怎麼辦?
在現在的App開發中,基本都會有iOS和Android版本,有些公司為了保持App不同版本的體驗互動一致,還有些公司的設計資源可能比較緊張,這些情況下iOS和Android版本基本是一個設計師主導,而大多數情況下設計師可能更會以iPhone手機為基礎進行設計,包括後期的切圖之類的。這個時候身為Android開發人員你是否還要求設計師單獨為Android端切一套圖片資源呢?這會讓你們的設計師崩潰的,下面就來告訴一個專案中總結的更棒的方法。
相信設計師們一般都會用最新的iPhone5(5s和5的尺寸以及解析度都一樣)來做原型設計,而iPhone5的螢幕解析度為640X1164, 螢幕尺寸為4英寸,根據勾股定理(a^2 + b^2 = c^2)640^2+1164^2=1764496, 然後再對其開根號可求出螢幕對角線的解析度為:1328,除以4可得出iphone5的dpi:1328/4≈332 可以看出iPhone5的螢幕的dpi約等於320, 剛好屬於xhdpi,所以你可以很自豪的像你們的設計師說不用專門為Android端切圖,直接把iPhone的那一套切好的圖片資源放入drawable-xhdpi資料夾裡就ok了。