本項目已經(jīng)上傳至碼云撇他,有興趣的哥們可以參考逛裤。
碼云:https://gitee.com/xuzhaoyu/ScreenPixelDemo
場景一:UI拿著一份1334 * 750(參照iPhone 8)的效果圖時指孤,各位Androider心里肯定千萬個草泥馬奔騰辕棚,這種分辨率的圖能用?簡直渣渣暗瞬蕖逝嚎!放眼當(dāng)下安卓陣營,1000-2000價位详恼,遍地2K屏幕补君,遍地“全面屏”,1334*750這種“類720P”分辨率的蘋果效果圖昧互,安卓百元機都不好意思用挽铁,還要我們做的與其一致伟桅?
場景二:在5.0寸的1920 * 1080設(shè)備上,一個Button的寬度為180dp叽掘,大概占屏幕寬度1/2楣铁。可是在6.8寸1920 * 1200的某設(shè)備上更扁,該Button寬度居然只占了屏幕的1/4到1/3的樣子盖腕,最終UI和產(chǎn)品驗收產(chǎn)品的時候,BBBB浓镜,Androider心里同樣千萬個草泥馬溃列。
滿滿痛點啊膛薛!現(xiàn)今安卓陣營高分設(shè)備越來越多听隐,屏幕適配刻不容緩,讓我們自己動手哄啄,豐衣足食雅任。如果您還不了解px,dp咨跌,dpi沪么,請先移步補充px,dp虑润,dpi的概念成玫。
不知道諸位是否使用過鴻洋的AutoLayout加酵,簡直是安卓碎片化大背景下的屏幕適配的救星拳喻。不過可惜的是,AutoLayout已經(jīng)停止更新很久猪腕,而且本身在兼容性上也存在一定問題冗澈,比如僅支持三大布局的如下屬性:
1.layout_width
2.layout_height
3.layout_margin(left,top,right,bottom)
4.pading(left,top,right,bottom)
5.textSize
其次,Autolayout對部分含有虛擬按鍵的機型適配不佳陋葡。
再者亚亲,全面屏(18:9)機型也有很多,如果UI給的基準(zhǔn)分辨率比例為16:9腐缤,在全面屏機型上會出現(xiàn)畫面被拉高的問題捌归。
那么我們該如何做屏幕適配呢?為了更好的兼容性岭粤,讓我們回到屏幕適配的起點惜索,看看基本的做法:在項目moudle/src/main/res/包下建立對應(yīng)分辨率包,如values-1920 * 1080剃浇,values-1280 * 720等巾兆,并在每個包內(nèi)創(chuàng)建合適的dimen猎物,如下圖所示:
當(dāng)設(shè)備的分辨率為1920 * 1080時,就會讀取values-1920 * 1080包下的dimen值角塑,當(dāng)設(shè)備分辨率為1280 * 720時蔫磨,就會讀取values-1280 * 720包下的dimen值,以此類推圃伶。
這種方式的兼容性毫無疑問是最佳的堤如,而且也幾乎不用考慮性能損失。如果采取這種方式進行適配留攒,那么接下來的兩個問題是:
1.我們到底有多少種分辨率煤惩?也就是要建立多少種values-xxxx*xxxx包?
2.然后又如何給每個包內(nèi)生成dimen值炼邀?
一魄揉、主流設(shè)備的分辨率
為了保證兼容性,兩行哥公司的App搜集了用戶設(shè)備屏幕尺寸的信息拭宁,抓取到的分辨率如下(為期1年左右洛退,近80款):
1440* 2427; 800 * 1217杰标; 1600* 2434兵怯; 1024* 720; 1440* 2368腔剂; 1440* 2768媒区; 1600* 2461; 1080* 1809掸犬; 1080* 2220袜漩; 1080* 2076; 1080* 2094湾碎; 1080* 1815宙攻; 1080* 1919; 1080* 1804介褥; 1080* 2016座掘; 1080* 2030; 720 * 1166柔滔; 1920* 1080溢陪; 1080* 2160; 720 * 1192睛廊; 1280* 720形真; 800 * 1232; 1080* 2034喉前; 576 * 1024没酣; 621 * 1104王财; 1080* 1797; 1080* 1803裕便; 1080* 1825绒净; 1080* 1810; 1200* 1920偿衰; 800 * 1216挂疆; 1200* 1848; 1080* 1848下翎; 1200* 1852缤言; 720 * 1200; 1080* 2040视事; 720 * 1216胆萧; 900 * 1600; 1200* 1830俐东; 1080* 1821跌穗; 1152* 1920; 1600* 2560虏辫; 1440* 2434蚌吸; 1600* 2452; 768 * 1184砌庄; 768 * 1280羹唠; 1536* 2048; 1440* 2792娄昆; 936 * 1664佩微; 1080* 1788; 1080* 1794稿黄; 1080* 1830喊衫; 1080* 1800跌造; 720 * 1208杆怕; 320 * 432; 320 * 480壳贪; 800 * 1280陵珍; 1440* 2416; 1200* 1824违施; 1080* 1806互纯; 480 * 854; 1200* 1836磕蒲; 1440* 2560留潦; 1536* 2560只盹; 1440* 2392; 1440* 2408兔院; 1080* 1812殖卑; 600 * 976; 720 * 1242坊萝; 540 * 960孵稽; 1080* 1776; 240 * 320十偶; 480 * 800菩鲜; 480 * 640; 720 * 1184惦积; 600 * 1024接校; 1080* 1920; 720 * 1280狮崩; 1440 * 2960馅笙; 720 * 1440。
那就以此為標(biāo)準(zhǔn)厉亏,我們根據(jù)上述分辨率建立values-xxxx * xxxx包董习。
二、生成dimen值
這里借用鴻洋的autolayout.jar工具(具體參見http://blog.csdn.net/lmj623565791/article/details/45460089)爱只。
將圖中標(biāo)注的autolayout.jar拷貝至任意目錄皿淋,在當(dāng)前目錄下打開命令窗口。例如恬试,在windows環(huán)境下窝趣,在文件管理器中,按住Shift训柴,右鍵哑舒,選擇在此處打開命令窗口。在彈出的命令行窗口中幻馁,按照如下格式輸入命令:
java -jar autolayout.jar defaultWidth defaultHeight targerWidth1,targetHeight1_targerWidth2,targetHeight2_targerWidth3,targetHeight3......
defaultWidth洗鸵,defaultHeight就是基準(zhǔn)分辨率,targetWidth和targetHeight就是目標(biāo)分辨率仗嗦,可以有多個目標(biāo)分辨率膘滨。
例如:
UI的效果圖基于1334 * 750(基準(zhǔn)分辨率),上面有一個寬50px稀拐,高20px的控件火邓,那么換算到目標(biāo)分辨率(1920 * 1080 和 1280 * 720)上的寬高是多少呢?運行如下命令:
圖3 命令行
運行完畢你會發(fā)現(xiàn)在autolayout.jar所在的路徑下生成了一個res文件夾,拷貝到項目中即可铲咨。
請先點進去看看res里面有什么雪隧,然后再繼續(xù)閱讀射亏。
如果我們想把上述1334 * 750分辨率下效果圖中寬50px,高20px的控件,適配到我們想要的分辨率中怎么辦呢绎签?寫控件時的寬高為x50和x20就可以了(或者寬高為x50和y20壮韭,但是不建議产徊,見下文)胞四,如下圖:
稍微看一下,1920 * 1080分辨率下闸翅,x20 = 28.8px再芋,x50 = 72px(<dimen name="x20">28.8px</dimen>,<dimen name="x50">72.0px</dimen>)坚冀,即1920 * 1080 分辨率下寬28.8px济赎,高72px與1334 * 750 分辨率下寬20px,高50px所占屏幕比例一致记某,做到了完美適配司训。
那么接下來就把兩行哥生成dimen的代碼附上,省的各位手敲麻煩:
java -jar autolayout.jar 750 1334 1600,2434_1600,2461_1600,2560_1600,2452_1536,2048_1536,2560_1440,2960_1440,2427_1440,2368_1440,2768_1440,2434_1440,2792_1440,2416_1440,2560_1440,2392_1440,2408_1200,1920_1200,1848_1200,1852_1200,1830_1200,1824_1200,1836_1152,1920_1080,1809_1080,2220_1080,2340_1080,2076_1080,2094_1080,1815_1080,1919_1080,1804_1080,2016_1080,2030_1080,2160_1080,2034_1080,1797_1080,1803_1080,1825_1080,1810_1080,1848_1080,2040_1080,1821_1080,1788_1080,1794_1080,1830_1080,1800_1080,1806_1080,1812_1080,1776_1080,1920_900,1600_800,1217_800,1232_800,1216_800,1280_768,1184_768,1280_720,1440_720,1166_720,1192_720,1200_720,1216_720,1208_720,1242_720,1184_720,1280_600,976_600,1024_576,1024_540,960_480,854_480,800_480,640_320,432_320,480_240,320
如果UI給的效果圖是基于1920 * 1080的液南,那么把上述750(defaultWidth) 1334(defaultHeight)改成1080 1920即可壳猜,以此類推。然后參照效果圖的標(biāo)注滑凉,標(biāo)注多少px统扳,在項目中就使用dimen/x多少 或 dimen/y多少。
如果要保證控件寬高比例畅姊,建議不要使用y的值咒钟,因為現(xiàn)在18:9的屏幕也出來了,如果效果圖是16:9若未,那么在18:9的屏幕中朱嘴,單位y值已經(jīng)變大,可能使控件被拉高而變形(不再是效果圖中的寬高比)粗合,寬高都使用x值即可萍嬉。如果控件不需要考慮寬高比例,只是需要保證寬高所占屏幕的百分比一致舌劳,那么寬使用x帚湘,高使用y玫荣。請各位讀者自行思考琢磨甚淡。
三、其他優(yōu)化
考慮一個問題,生成了這么多的values包贯卦,我們放入了app這個module资柔。同時,我們項目也依賴了一些第三方的控件庫module撵割,在這些控件module里也有一些xml布局贿堰,如果我們想讓它也適配屏幕,該如何做啡彬?難道我們在每個第三方控件庫module的src/main/res/都拷貝這么多的values包嗎羹与?其實不用,可以參照Demo中的架構(gòu):
新建一個module庶灿,將這些values-xxxx * xxxx拷貝進去纵搁,然后讓需要使用屏幕適配的module依賴這個module即可,如app module往踢,還有一些第三方控件庫module腾誉。那么就可以在你想用的地方盡情使用dimen值了。