importjava.io.File;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.PrintWriter;publicclassMakeXml{// E:\javaAppprivatefinalstaticString rootPath ="E:\\javaApp\\values-{0}x{1}\\";privatefinalstaticfloatdw =320f;privatefinalstaticfloatdh =480f;privatefinalstaticString WTemplate ="{1}px\n";privatefinalstaticString HTemplate ="{1}px\n";publicstaticvoidmain(String[] args){ makeString(240,320); makeString(320,480); makeString(480,800); makeString(480,854); makeString(540,960); makeString(600,1024); makeString(720,1184); makeString(720,1196); makeString(720,1280); makeString(768,1024); makeString(800,1280); makeString(1080,1812); makeString(1080,1920); makeString(1440,2560); }publicstaticvoidmakeString(intw,inth){ StringBuffer sb =newStringBuffer(); sb.append("\n"); sb.append("");floatcellw = w / dw;for(inti =1; i <320; i++) { sb.append(WTemplate.replace("{0}", i +"").replace("{1}", change(cellw * i) +"")); } sb.append(WTemplate.replace("{0}","320").replace("{1}", w +"")); sb.append(""); StringBuffer sb2 =newStringBuffer(); sb2.append("\n"); sb2.append("");floatcellh = h / dh;for(inti =1; i <480; i++) { sb2.append(HTemplate.replace("{0}", i +"").replace("{1}", change(cellh * i) +"")); } sb2.append(HTemplate.replace("{0}","480").replace("{1}", h +"")); sb2.append(""); String path = rootPath.replace("{0}", h +"").replace("{1}", w +""); File rootFile =newFile(path);if(!rootFile.exists()) { rootFile.mkdirs(); } File layxFile =newFile(path +"lay_x.xml"); File layyFile =newFile(path +"lay_y.xml");try{ PrintWriter pw =newPrintWriter(newFileOutputStream(layxFile)); pw.print(sb.toString()); pw.close(); pw =newPrintWriter(newFileOutputStream(layyFile)); pw.print(sb2.toString()); pw.close(); }catch(FileNotFoundException e) { e.printStackTrace(); } }publicstaticfloatchange(floata){inttemp = (int) (a *100);returntemp /100f; } }
找到生成的文件復(fù)制到Android項(xiàng)目里的res目錄然后用android:layout_width="@dimen/x184"來指定大小
1.1 手機(jī)常見分辨率:
4:3
VGA? ? 640480 (Video Graphics Array)
QVGA? 320
240 (Quarter VGA)
HVGA? 480320 (Half-size VGA)
SVGA? 800
600 (Super VGA)
5:3
WVGA? 800480 (Wide VGA)
16:9
FWVGA 854
480 (Full Wide VGA)
HD? ? ? ? 19201080 High Definition
QHD? ? 960
540
720p? ? 1280720? 標(biāo)清
1080p? 1920
1080 高清
手機(jī):
iphone 4/4s? ? 960640 (3:2)
iphone5? ? ? ? 1136
640
小米1? ? ? ? ? ? 854480(FWVGA)
小米2? ? ? ? ? ? 1280
720
1.2 分辨率對(duì)應(yīng)DPI
"HVGA? ? mdpi"
"WVGA? hdpi "
"FWVGA hdpi "
"QHD? ? ? hdpi "
"720P? ? xhdpi"
"1080P? xxhdpi "
2 屏幕適配的注意事項(xiàng)
2.1 基本設(shè)置
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)文件夾下尋找資源:
如果drawable-hdpi、drawable-mdpi、drawable-ldpi三個(gè)文件夾中有同一張圖片資源的不同密度表示,那么系統(tǒng)會(huì)去加載drawable_mdpi文件夾中的資源;
如果drawable-hpdi中有高密度圖片,其它兩個(gè)文件夾中沒有對(duì)應(yīng)圖片資源,那么系統(tǒng)會(huì)去加載drawable-hdpi中的資源,其他同理;
如果drawable-hdpi,drawable-mdpi中有圖片資源,drawable-ldpi中沒有,系統(tǒng)會(huì)加載drawable-mdpi中的資源,其他同理,使用最接近的密度級(jí)別。
2.1.2 橫屏豎屏目錄區(qū)分
drawable
a) drawable-hdpi該圖片即適用于橫屏,也適用于豎屏;
b) drawable-land-hdpi,當(dāng)屏幕為橫屏,且為高密度時(shí),加載此文件夾的資源;
c) drawable-port-hdpi,當(dāng)屏幕為豎屏,且為高密度時(shí),加載此文件夾中的資源。其他同理。
layout
在res目錄下建立layout-port和layout-land兩個(gè)目錄,里面分別放置豎屏和橫屏兩種布局文件,以適應(yīng)對(duì)橫屏豎屏自動(dòng)切換。
2.2 多屏幕適配的4條黃金原則
在layout文件中設(shè)置控件尺寸時(shí)應(yīng)采用fill_parent、wrap_content、match_parent和dp;
具體來說,設(shè)置view的屬性android:layout_width和android:layout_height的值時(shí),wrap_content,match_parent或dp比px更好,文字大小應(yīng)該使用sp來定義。
在程序的代碼中不要出現(xiàn)具體的像素值,在dimens.xml中定義;
為了使代碼簡(jiǎn)單,android內(nèi)部使用pix為單位表示控件的尺寸,但這是基于當(dāng)前屏幕基礎(chǔ)上的。為了適應(yīng)多種屏幕,android建議開發(fā)者不要使用具體的像素來表示控件尺寸。
不使用AbsoluteLayout(android1.5已廢棄) ,可以使用RelativeLayout替代;
對(duì)不同的屏幕提供合適大小的圖片。
不同大小屏幕用不同大小的圖片,low:medium:high:extra-high圖片大小的比例為3:4:6:8;舉例來說,對(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è)像素間隔,用來標(biāo)識(shí)PNG圖片中哪些部分可以拉伸、哪些不可以拉伸、背景上的邊框位置等。
“上、左”定義可拉伸區(qū)域
“右、下”定義顯示區(qū)域,如果用到完整填充的背景圖,建議不要通過android:padding來設(shè)置邊距,而是通過9-patch方式來定義。
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ì)寫入R.java里,而系統(tǒng)會(huì)根據(jù)屏幕的大小自己選擇合適的layout進(jìn)行使用。
2.5 測(cè)試驗(yàn)證
一般使用AVD Manager創(chuàng)建多個(gè)不同大小的模擬器,如果條件具備,也可以直接用真機(jī)測(cè)試,這個(gè)比較靠譜。