-----------------------------------------------------------
1 Android手機(jī)目前常見(jiàn)的分辨率
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? 標(biāo)清
1080p? 1920*1080 高清
1.2 分辨率對(duì)應(yīng)DPI
"HVGA? ? mdpi"
"WVGA? hdpi "
"FWVGA hdpi "
"QHD? ? ? hdpi "
"720P? ? xhdpi"
"1080P? xxhdpi "? ? ? =======》看清
2 屏幕適配的注意事項(xiàng)
2.1.1 AndroidManifest.xml設(shè)置
在中Menifest中添加子元素
android:anyDensity="true"時(shí),應(yīng)用程序安裝在不同密度的終端上時(shí),程序會(huì)分別加載xxhdpi、xhdpi、hdpi、mdpi、ldpi文件夾中的資源。相反,如果設(shè)為false,即使在文件夾下?lián)碛邢嗤Y源,應(yīng)用不會(huì)自動(dòng)地去相應(yīng)文件夾下尋找資源:
1) 如果drawable-hdpi、drawable-mdpi、drawable-ldpi三個(gè)文件夾中有同一張圖片資源的不同密度表示,那么系統(tǒng)會(huì)去加載drawable_mdpi文件夾中的資源;
2) 如果drawable-hpdi中有高密度圖片,其它兩個(gè)文件夾中沒(méi)有對(duì)應(yīng)圖片資源,那么系統(tǒng)會(huì)去加載drawable-hdpi中的資源,其他同理;
3) 如果drawable-hdpi,drawable-mdpi中有圖片資源,drawable-ldpi中沒(méi)有,系統(tǒng)會(huì)加載drawable-mdpi中的資源,其他同理,使用最接近的密度級(jí)別。
2.1.2 橫屏豎屏目錄區(qū)分
1) drawable
a) drawable-hdpi該圖片即適用于橫屏,也適用于豎屏;
b) drawable-land-hdpi,當(dāng)屏幕為橫屏,且為高密度時(shí),加載此文件夾的資源;
c) drawable-port-hdpi,當(dāng)屏幕為豎屏,且為高密度時(shí),加載此文件夾中的資源。其他同理。
2) layout
在res目錄下建立layout-port和layout-land兩個(gè)目錄,里面分別放置豎屏和橫屏兩種布局文件,以適應(yīng)對(duì)橫屏豎屏自動(dòng)切換。
2.2 多屏幕適配的4條黃金原則
1) 在layout文件中設(shè)置控件尺寸時(shí)應(yīng)采用fill_parent、wrap_content、match_parent和dp;
具體來(lái)說(shuō),設(shè)置view的屬性android:layout_width和android:layout_height的值時(shí),wrap_content,match_parent或dp比px更好,文字大小應(yīng)該使用sp來(lái)定義。
2) 在程序的代碼中不要出現(xiàn)具體的像素值,在dimens.xml中定義;
為了使代碼簡(jiǎn)單,android內(nèi)部使用pix為單位表示控件的尺寸,但這是基于當(dāng)前屏幕基礎(chǔ)上的。為了適應(yīng)多種屏幕,android建議開(kāi)發(fā)者不要使用具體的像素來(lái)表示控件尺寸。
3) 不使用AbsoluteLayout(android1.5已廢棄) ,可以使用RelativeLayout替代;
4) 對(duì)不同的屏幕提供合適大小的圖片。
不同大小屏幕用不同大小的圖片,low:medium:high:extra-high圖片大小的比例為3:4:6:8;舉例來(lái)說(shuō),對(duì)于中等密度(medium)的屏幕你的圖片像素大小為48×48,那么低密度(low)屏幕的圖片大小應(yīng)為36×36,高(high)的為72×72,extra-high為96×96。
2.3 使用9-patch PNG圖片
使用圖片資源時(shí),如果出現(xiàn)拉伸,因?yàn)閳D片處理的原因,會(huì)變形,導(dǎo)致界面走形。9-patch PNG圖片也是一種標(biāo)準(zhǔn)的PGN圖片,在原生PNG圖片四周空出一個(gè)像素間隔,用來(lái)標(biāo)識(shí)PNG圖片中哪些部分可以拉伸、哪些不可以拉伸、背景上的邊框位置等。
“上、左”定義可拉伸區(qū)域
“右、下”定義顯示區(qū)域,如果用到完整填充的背景圖,建議不要通過(guò)android:padding來(lái)設(shè)置邊距,而是通過(guò)9-patch方式來(lái)定義。
Android SDK中提供了編輯9-Patch圖片的工具,在tools目錄下draw9patch.bat,能夠立刻看到編輯后的拉伸效果,也可以直接用其他圖片編輯工具編輯,但是看不到效果。
2.4 不同的layout
Android手機(jī)屏幕大小不一,有480x320, 640x360, 800x480……
怎樣才能讓Application自動(dòng)適應(yīng)不同的屏幕呢?
其實(shí)很簡(jiǎn)單,只需要在res目錄下創(chuàng)建不同的layout文件夾,比如:layout-640x360、layout-800x480……所有的layout文件在編譯之后都會(huì)寫(xiě)入R.java里,而系統(tǒng)會(huì)根據(jù)屏幕的大小自己選擇合適的layout進(jìn)行使用。
總結(jié):最好在mainifest里面添加
<!--對(duì)于很高的分辨率,除采用相應(yīng)的圖片外,還需要加上如下配置,來(lái)更好的適配屏幕 -->
? ? <supports-screens
? ? ? ? android:smallScreens="true"
? ? ? ? android:normalScreens="true"
? ? ? ? android:largeScreens="true"
? ? ? ? android:anyDensity="true" />
in
表示英寸,是屏幕的物理尺寸。每英寸等于2.54厘米。例如我們經(jīng)常說(shuō)的手機(jī)屏幕大小有,5(英)寸、4(英)寸就是指這個(gè)單位。這些尺寸是屏幕的對(duì)角線長(zhǎng)度。如果手機(jī)的屏幕是4英寸,表示手機(jī)的屏幕(可視區(qū)域)對(duì)角線長(zhǎng)度是4 X 2.54 = 10.16厘米
dpi
dpi是Dots Per Inch的縮寫(xiě), 每英寸點(diǎn)數(shù),即每英寸包含像素個(gè)數(shù)。比如320X480分辨率的手機(jī),寬2英寸,高3英寸, 每英寸包含的像素點(diǎn)的數(shù)量為320/2=160dpi(橫向)或480/3=160dpi(縱向),160就是這部手機(jī)的dpi,橫向和縱向的這個(gè)值都是相同的,原因是大部分手機(jī)屏幕使用正方形的像素點(diǎn)。
density
屏幕密度,density和dpi的關(guān)系為 density = dpi/160
dp
也即dip,設(shè)備獨(dú)立像素,device independent pixels的縮寫(xiě),Android特有的單位,在屏幕密度dpi = 160屏幕上,1dp = 1px。
sp
和dp很類(lèi)似,一般用來(lái)設(shè)置字體大小,和dp的區(qū)別是它可以根據(jù)用戶的字體大小偏好來(lái)縮放。
Android Drawable
我們新建一個(gè)Android項(xiàng)目后應(yīng)該可以看到很多drawable文件夾,分別對(duì)應(yīng)不同的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都出一套圖片資源,這個(gè)固然是一種解決辦法,但同時(shí)也是一種非常笨的方法,為美工或者設(shè)計(jì)增加了不少的工作量不說(shuō),同時(shí)也會(huì)讓你的apk包變的很大。那么有沒(méi)有什么好的方法既能保證屏幕適配,又可以最小占用設(shè)計(jì)資源,同時(shí)最好又只使用一套dpi的圖片資源呢?
首先必須清楚一個(gè)自動(dòng)渲染的概念,Android SDK會(huì)自動(dòng)屏幕尺寸選擇對(duì)應(yīng)的資源文件進(jìn)行渲染,如SDK檢測(cè)到你手機(jī)dpi是160的話會(huì)優(yōu)先到drawable-mdpi文件夾下找對(duì)應(yīng)的圖片資源,注意只是優(yōu)先,假設(shè)你手機(jī)dpi是160,但是你只在xhpdi文件夾下有對(duì)應(yīng)的圖片資源文件,程序一樣可以正常運(yùn)行。所以理論上來(lái)說(shuō)只需要提供一種規(guī)格的圖片資源就ok了,如果只提供ldpi規(guī)格的圖片,對(duì)于大分辨率的手機(jī)如果把圖片放大就會(huì)不清晰,所以需要提供一套你需要支持的最大dpi的圖片,這樣即使用戶的手機(jī)分辨率很小,這樣圖片縮小依然很清晰。
xhdpi成為首選
上面說(shuō)了只需要提供一套大的dpi的圖片就ok了,現(xiàn)在市面手機(jī)分辨率最大可達(dá)到1080X1920的分辨率,如Nexus5,dpi屬于xxhdpi,但是畢竟還沒(méi)普及,目前市面上最普遍的高端機(jī)的分辨率還多集中在720X1080范圍,也就是多集中在xhdpi,所以目前來(lái)看xhpdi規(guī)格的圖片成為了首選。當(dāng)然隨著技術(shù)規(guī)格的提高以后發(fā)展,以后可能市場(chǎng)上x(chóng)xdpi的手機(jī)會(huì)越來(lái)越普遍,但這是后話。? 設(shè)計(jì)資源緊張?jiān)趺崔k?
在現(xiàn)在的App開(kāi)發(fā)中,基本都會(huì)有iOS和Android版本,有些公司為了保持App不同版本的體驗(yàn)交互一致,還有些公司的設(shè)計(jì)資源可能比較緊張,這些情況下iOS和Android版本基本是一個(gè)設(shè)計(jì)師主導(dǎo),而大多數(shù)情況下設(shè)計(jì)師可能更會(huì)以iPhone手機(jī)為基礎(chǔ)進(jìn)行設(shè)計(jì),包括后期的切圖之類(lèi)的。這個(gè)時(shí)候身為Android開(kāi)發(fā)人員你是否還要求設(shè)計(jì)師單獨(dú)為Android端切一套圖片資源呢?這會(huì)讓你們的設(shè)計(jì)師崩潰的,下面就來(lái)告訴一個(gè)項(xiàng)目中總結(jié)的更棒的方法。
相信設(shè)計(jì)師們一般都會(huì)用最新的iPhone5(5s和5的尺寸以及分辨率都一樣)來(lái)做原型設(shè)計(jì),而iPhone5的屏幕分辨率為640X1164, 屏幕尺寸為4英寸,根據(jù)勾股定理(a^2 + b^2 = c^2)640^2+1164^2=1764496, 然后再對(duì)其開(kāi)根號(hào)可求出屏幕對(duì)角線的分辨率為:1328,除以4可得出iphone5的dpi:1328/4≈332 可以看出iPhone5的屏幕的dpi約等于320, 剛好屬于xhdpi,所以你可以很自豪的像你們的設(shè)計(jì)師說(shuō)不用專(zhuān)門(mén)為Android端切圖,直接把iPhone的那一套切好的圖片資源放入drawable-xhdpi文件夾里就ok了。
android從2.1版本開(kāi)始drawble分為drawable-mdpi、drawable-ldpi、drawable-hdpi三個(gè),這三個(gè)主要是為了支持多分辨率。
drawable- hdpi、drawable- mdpi、drawable-ldpi的區(qū)別:
(1)drawable-hdpi里面存放高分辨率的圖片,如WVGA (480x800),FWVGA (480x854)
(2)drawable-mdpi里面存放中等分辨率的圖片,如HVGA (320x480)
(3)drawable-ldpi里面存放低分辨率的圖片,如QVGA (240x320)
系統(tǒng)會(huì)根據(jù)機(jī)器的分辨率來(lái)分別到這幾個(gè)文件夾里面去找對(duì)應(yīng)的圖片。
在開(kāi)發(fā)程序時(shí)為了兼容不同平臺(tái)不同屏幕,建議各自文件夾根據(jù)需求均存放不同版本圖片。
Aphone一般到drawable-hdpi去取圖片,drawable-hdpi沒(méi)有圖片再到drawable-mdpi去取圖片,而后再到drawable-ldpi取圖片
Apad一般到drawable-mdpi去取圖片,drawable-hdpi沒(méi)有圖片再到drawable-ldpi去取圖片
橫屏含有drawable-land- hdpi、drawable-land- mdpi、drawable-land-ldpi的區(qū)別:
Aphone一般到drawable-land-hdpi去取圖片,drawable-land-hdpi沒(méi)有圖片再到drawable-land-mdpi去取圖片,而后再到drawable-land-ldpi取圖片,而后才會(huì)到drawable-hdpi去取圖片,drawable-hdpi沒(méi)有圖片再到drawable-mdpi去取圖片,而后再到drawable-ldpi取圖片
Apad一般到drawable-land-mdpi去取圖片,drawable-land-hdpi沒(méi)有圖片再到drawable-land-ldpi去取圖片,而后才會(huì)到drawable-mdpi去取圖片,drawable-hdpi沒(méi)有圖片再到drawable-ldpi去取圖片