Android 屏幕適配終結者

背景

之前基于頭條的適配方案寫了篇文章 Android 屏幕適配從未如斯簡單,但后續發現還是有挺多坑的,這些坑都記錄在了 GitHub 屏幕適配問題匯總及解決,基于這么多坑,最終我發現了一種更完美的適配方案,本打算一個多月前就寫這篇文章的,但由于公司事務繁忙一直抽不出空來,拖更到現在才發布,下面就讓我來分享下此法,先來吹下優點吧。

優點

1. 無侵入性

首先科普下 Android 中的一個長度單位:pt,它表示一個點,是屏幕的物理尺寸,其大小為 1 英寸的 1 / 72,也就是 72pt 等于 1 英寸(其實 Android 中還有比較少見的 inmm 的長度單位)。而我本次的適配使用的單位恰好是 pt,所以對你從前使用的布局不會造成任何影響,在老項目中開發新功能你可以膽大地加入該適配方案,新項目的話更可以毫不猶豫地采用該適配,并且在關閉該關閉后,pt 效果等同于 dp 哦。

2. 靈活性高

如果你想要對某個 View 做到不同分辨率的設備下,使其尺寸在適配維度上所占比例一致的話,那么對它使用 pt 單位即可,如果你不想要這樣的效果,而是想要更大尺寸的設備顯示更多的內容,那么你可以像從前那樣寫 dpsp 什么的即可,結合這兩點,在界面布局上你就可以游刃有余地做到你想要的效果。

3. 不會影響系統 View 和三方 View 的大小

這點其實在無侵入性中已經表現出來了,由于頭條的方案是直接修改 DisplayMetrics#densitydp 適配,這樣會導致系統 View 尺寸和原先不一致,比如 DialogToast、 尺寸,同樣,三方 View 的大小也會和原先效果不一致,這也就是我選擇 pt 適配的原因之一。

4. 不會失效

這一點是最值得吹牛的,因為不論頭條的適配還是 AndroidAutoSize,都會存在 DisplayMetrics#density 被還原的情況,需要自己重新設置回去,最顯著的就是界面中存在 WebView 的話,由于其初始化的時候會還原 DisplayMetrics#density 的值導致適配失效,當然這點已經有解決方案了,但還會有很多其他情況會還原 DisplayMetrics#density 的值導致適配失效。而我這方案就是為了解決這個痛點,不讓 DisplayMetrics 中的值被還原導致適配失效。

效果

說了這么多,先上下效果圖壓壓驚吧,每種分辨率的圖依次是寬度 1080pt 適配,高度 1920pt 適配以及關閉適配的效果。

480 x 800 - mdpi(160dpi)

mdpi

720 x 1280 - xhdpi(320dpi)

xhdpi

1080 x 1920 - xxhdpi(480dpi)

xxhdpi

1440x2560 - 560dpi

560dpi

可以看到效果圖中 WebView 對之后的 View 并沒有產生適配失效的問題,這是之前適配所不能解決的問題。

如何創建預覽?

在 AS 中 Tools -> AVD Manager -> Create Virtual Device...,我們以適配 1080 x 1920px 為例,具體操作如下:

1080pt

創建完設備我們在預覽界面選中這個設備即可看到 pt 單位效果。

設計師給你的設計圖尺寸是多少,那你就建多少尺寸的設備即可,比如是 720 x 1280px 的,那你把上圖的尺寸換成 7201280,再計算下屏幕尺寸即可,如果是 360 x 640dp 的話,那就把上圖的尺寸換成 360640,再計算下屏幕尺寸即可,不用去 care 單位到底是什么,設計圖標注多少那你就寫多少即可,無需換算。適配的時候傳入這個維度的尺寸值即可,比如 720 x 1280 的寬度適配,那就傳入 720 即可。

原理及用法

原理其實也是基于頭條的原理,不過我是操作 pt,所以不是改 DisplayMetrics#density,而是 DisplayMetrics#xdpi,由于適配不會失效,所以需要在適配的 Activity 中重寫下 getResources() 函數,因為每次 View 在變更尺寸時都會調用到 getResources(),所以我們直接在這里進行適配就不會導致失效,效果圖中對應的代碼分別如下所示:

override fun getResources(): Resources {
    return AdaptScreenUtils.adaptWidth(super.getResources(), 1080)
}

override fun getResources(): Resources {
    return AdaptScreenUtils.adaptHeight(super.getResources(), 1920)
}

override fun getResources(): Resources {
    return AdaptScreenUtils.closeAdapt(super.getResources())
}

其源碼、Demo 以及 API 如下所示:

AdaptScreen 相關 -> [AdaptScreenUtils.java][adaptScreen.java] -> [Demo][adaptScreen.demo]

adaptWidth : 適配寬度
adaptHeight: 適配高度
closeAdapt : 關閉適配(pt 等同于 dp)
pt2Px      : pt 轉 px
px2Pt      : px 轉 pt

pt2Px 及 px2Pt 是提供給需要動態操作 View 的。

如上只需依賴 AndroidUtilCode 最新版本即可:

implementation 'com.blankj:utilcode:1.22.3'

結尾的話

看了原理之后是不是覺得很簡單,但能想到這種解決方案的又能有幾人呢,我也是站在了巨人的肩膀上才能想到這一層次,希望該適配方案能像文章標題一樣終結我們的適配,這是我目前發現最簡單有效的適配方案,如果覺得不錯的話記得推薦給身邊的 Androider 哦,使用過程有問題的話歡迎同步到 「Android 屏幕適配終結者」問題匯總 這個 issue 中。

最后再插個內容,AndroidUtilCode 項目已改造為組件化,有興趣的可以翻閱源碼查看,相信你肯定會學到不少好東西的,下一篇文章我會為大家介紹下這方面的內容,期待我能盡快出產吧。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容