〔兩行哥〕致敬AutoLayout紧显,手把手帶你適配任意分辨率

本項目已經(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猎物,如下圖所示:


圖1 添加不同的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值

圖2 項目結(jié)構(gòu)

這里借用鴻洋的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ù)閱讀射亏。

圖4 生成res文件夾

如果我們想把上述1334 * 750分辨率下效果圖中寬50px,高20px的控件,適配到我們想要的分辨率中怎么辦呢绎签?寫控件時的寬高為x50和x20就可以了(或者寬高為x50和y20壮韭,但是不建議产徊,見下文)胞四,如下圖:


圖5 控件寬高

稍微看一下,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):


圖6 獨立module進行適配

新建一個module庶灿,將這些values-xxxx * xxxx拷貝進去纵搁,然后讓需要使用屏幕適配的module依賴這個module即可,如app module往踢,還有一些第三方控件庫module腾誉。那么就可以在你想用的地方盡情使用dimen值了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末峻呕,一起剝皮案震驚了整個濱河市利职,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瘦癌,老刑警劉巖猪贪,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異讯私,居然都是意外死亡哮伟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門妄帘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來楞黄,“玉大人,你說我怎么就攤上這事抡驼」砝” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵致盟,是天一觀的道長碎税。 經(jīng)常有香客問我,道長馏锡,這世上最難降的妖魔是什么雷蹂? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮杯道,結(jié)果婚禮上匪煌,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好萎庭,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布霜医。 她就那樣靜靜地躺著,像睡著了一般驳规。 火紅的嫁衣襯著肌膚如雪肴敛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天吗购,我揣著相機與錄音医男,去河邊找鬼。 笑死捻勉,一個胖子當(dāng)著我的面吹牛昨登,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贯底,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼丰辣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了禽捆?” 一聲冷哼從身側(cè)響起笙什,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胚想,沒想到半個月后琐凭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡浊服,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年统屈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牙躺。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡愁憔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出孽拷,到底是詐尸還是另有隱情吨掌,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布脓恕,位于F島的核電站膜宋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏炼幔。R本人自食惡果不足惜秋茫,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乃秀。 院中可真熱鬧肛著,春花似錦圆兵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抬吟。三九已至萨咕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間火本,已是汗流浹背危队。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钙畔,地道東北人茫陆。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像擎析,于是被迫代替她去往敵國和親簿盅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容