演講實錄——Android開發目前最高效且最穩定的UI適配方案 [復制鏈接]

2019-4-23 10:24
九霄逆鱗 閱讀:443 評論:0 贊:0
Tag:  

本文來自2019安卓巴士開發者大會現場實錄,由于錄入匆忙,內容可能存在些許偏差,歡迎大家掃描文末二維碼查看現場實錄視頻和下載大會完整PPT。演講者:吳釗


Android UI 適配是Android開發中很古老的問題,也是Android開發的基本問題,一個好的適配方案能夠給開發者帶來很多便利和優勢,希望大家能夠通過我的講述,會對適配方案有更多的了解,并找到最適合自己項目的適配方案。

——糗事百科高級Android工程師  吳釗


大家好,我來自糗事百科,我演講的題目是《Android開發目前最高效且最穩定的UI適配方案》。

其實這個是主辦方主動找我要求我分享的這個方向的主題,但是我聽到這個事情的時候,我還是挺驚訝的,因為Android的適配其實不是一個新問題,它是一個特別特別老的問題,所有做過Android開發的人都知道這個適配方案和適配的經驗,但是后來我回想過我自己博客上分享的關于Android適配這方面的文章,我發現這方面的文章的關注度還比較高,我猜大家對于這方面還是不理解,或者說正在尋找一些更適合的方案。

所以安卓巴士也支持我選其他的選題,但是我還是想把這個主題分享一下。

首先我們可以看一下Android的適配,Android的適配是可以分兩個大塊的,一個是關于系統版本方面的適配,這個不僅是原生的系統版本,還有我們的各家廠商的ROM的適配,糗事百科現在正在做的給SDK升級之后也對系統版本做了一個適配,這個里面有很多的事情可以分享,大家可以對Android的適配有一個全面的理解。

我今天分享的主題是Android關于UI的適配,我們現在對于原生系統會有一些行為變更,比如Android6.0會有一些權限,同時那些國產產商有一些ROM他們有自己的代碼及你還要針對這些東西進行適配,這個里面的東西比較多,不過不屬于今天分享的主題。



AndroidUI的適配就是我們把設計師的設計稿要還原到用戶手中,我們還是要順帶講講AndroidUI適配的一些難點,這個問題大家已經爛熟于心了,核心就是碎片化,首先Android支持的設備多,這是不只是手機的設備,Android還支持手機平板和電腦。在同一種設備當中比如手機現在分辨率的種類還是很多,這樣也會導致我們適配的難度比較大,屏幕的尺寸也比較多,我們叫做三多,這個問題大家也很清楚,我這里先給大家提一下。

今天我們講適配方案首先要講一個適配方案評判的標準,因為你沒有標準的話你不能說哪個方案是好的,要說到UI的適配方案我們就要講講UI適配的整個工作流程,當然大家普遍認為Android的適配是我們的布局文件和我們的布局代碼可以適配到所有的手機上,這個是整個AndroidUI適配的流程,但是我認為不是這樣的。

真正的AndroidUI適配的流程我們首先要從設計稿到我們的布局代碼,這個步驟其實很容易被忽略,大家覺得是自然而然的,當你看到UI你就開始寫界面了。但是這個里面比如我們的設計稿它有自己的標注和尺寸,其實我們沒有辦法把原來的尺寸直接拿來用,所以這個地方有一個轉化的問題。

第二個步驟就是我們大家都知道的我們自己寫的UI界面可以完美的還原到所有的手機屏幕上,這個是UI適配的第二個步驟。

總體來說這兩個步驟是可以分開的,因為每一個步驟對于安卓適配方案的要求是不一樣的。第一個步驟是要求高效,這個是開發的高效,當我們看到UI設計稿的時候,我們更希望它的空間里面有自己的要求,我們更希望看到這些長寬的標注之后可以直接寫到我們的代碼里面,這樣的話不需要什么思考和轉化。



所以我們說第一個步驟對于適配的方案是高效,第二個步驟它對于適配方案的要求是穩定,你的效果要穩定,穩定表現在不同的手機里面,有的手機大有的手機小的,不同的手機分辨率也不一樣,你拿給UI的人看的時候表現要一樣。

所以今天探討UI最高效的適配方案,這個問題也是來自這里,接下來我們探討幾個UI適配方案,實現就是dp直接適配,對于像素我們都知道Android上面所有的東西都是像素的方式展示,但是這里也有問題,比如我在這里設計的長寬都是200px,如果你用px作為標注和單位的話,你拿給設計小姐姐她是絕對不會接受的。



這個時候就引入了dp,就是設備獨立像素,就是可以高分辨率以及低分辨率的手機上轉化視覺效果的時候,你設定的標準dp為標準的時候,低分辨率和高分辨率大體上是一致的。

簡單來講我們如果用到dp適配的話,就是為不同的空間設定一個一定的尺寸級別。我們說一個例子,比如我們的產品當中頭像是比較常用的,我們用dp的話要設定幾個級別,之后我們和UI設計約定好,之后我們根據設計圖的具體情況引用不同的尺寸。但是這里其實還有一個問題,就是我們不能把所有的控件都設定一個級別,因為開發的時候它的東西是非常碎的,很多的長寬還有邊距這些東西都非常散,我們很多時候看到設計稿的時候還需要評估我們的代碼里面是多少尺寸和多大的dp,這個時候實際上就非常的麻煩。這點就從設計稿到數據代碼這個過程就是高效的原則,所以這一點上就有一些不好。

除此之外還有一些其他的比較明顯的問題,dp的適配大體上不同的手機的分辨率的表達上是不一樣的,你仔細看的時候其實表達還是有差別的。也就是說如果兩臺手機的差別很大,但是不同的手機上總體是一樣的,實際上還是有差別的。所以很多時候我們用dp作為適配的方案的話,就會出現一種情況,就是可能某一類手機它的表現情況和UI小姐姐的設計稿差別很大。這樣就非常容易引發UI和開發之間的矛盾,就很容易出現這樣的對話。



這個是非常常見的,我之前在糗事百科工作的時候,我們適配的時候就經常遇到這樣的問題,非常的頭痛,讓我們設計和UI之間的關系非常緊張,最后只能說又不是不能用這樣的一句話,但是你這樣說小姐姐的時候你都會看到她失望的眼神和落寞的被背影,之后她會說IOS就是比Android精致。

我們在適配之后還是效果還是比較穩定的,大部分的手機表現是一致的,很多UI小姐姐看到我們和設計稿做對比總會發現一些細小的差別,這些差別是我們看不到的,這里我們說基本上可以達到UI適配的效果,我前面也說很多的尺寸我們沒有辦法直接表達,但是表達的時候我們布局代碼里面需要做一些轉換和按比例的轉換,這里容易引發設計和開發的沖突。

還有一個適配方案,因為我們之前也用過這個方案,叫做寬高限定符適配,這個是Android加載特定情況下加載資源的一種方式,當設備的寬和高達到一個值的時候,它會加載對應的一些文件,這個我們可以舉個例子。



比如這個手機它是720和1280的尺寸,系統會通過它自己的機制找到對應的文件夾下對應的資源文件,這個方案它的核心就是它能夠提前或者它可以知道這個設備的尺寸,這樣就會給開發帶來很大的優勢,我們可以提前把設計稿上面的尺寸按照比例轉化到不同的尺寸比例當中,這樣的話我們的適配效果就比較好,我們這里說個例子。

這個是糗事百科的一個設計稿的主頁,我們看到頭像是60×60,我們轉換好不同的屏幕尺寸的資源文件,就是它的尺寸信息這里我們寬高上直接填入設計稿對應的引用,就是我們從設計稿到布局文件的時候可以用不同的思考,而這個引用最終被系統拿到真實值的時候是不一樣的。



我們說到手機是720×1280的時候我們要去拿對應的尺寸,這個尺寸我們會提前生成一套相應的正確的表達出來的尺寸,這里就是115.2像素,通過這種方式適配,它最終的效果我這邊團隊里面雖然沒有用,但是實際上我測試的時候效果是OK的。但是前提是你最好可以精準的命中收集的精準尺寸,因為你的手機如果沒有命中這個尺寸的話,比如有一個手機的下巴長了一點,這個時候沒有辦法命中1280這個尺寸,但是Android系統會向下兼容,它最有可能找到800×480,這個時候尺寸就變化很小,我們整個UI的頁面就會有一個變化,這里就是我們面對的其中一個問題。并且這里精準適配的時候,這個效果是非常完美的,我特地拿了這個方案給了UI的小姐姐看,她說非常完美。

這里還是對適配做一個小的總結,我們知道在可以命中寬高尺寸的前提下是可以實現高效穩定的適配的,但是這里還有兩個問題,因為它是對于屏幕尺寸的寬高做適配,我們知道手機屏幕的碎片化還是很嚴重,所以這個情況下覆蓋所有的屏幕尺寸還是比較麻煩,還有一個就是容錯效果不佳。如果你的手機沒有辦法精準命中你生成的資源文件的話,你很可能就會找到一個非常不理想的資源界面,導致你的界面看起來很差。



這個就是一個寬高限定符的問題,我們對于這兩個適配方案做一個小結。之所以要講這兩個適配方案,其實大家知道我對這兩個適配方案的態度是非常保守的,講這兩個方案我覺得他們延伸進化出來下面兩個完美的UI方案,所以我需要在前面兩個方案里面講講它的基本的工作原理和適配工程。下面我推薦的是最小寬度的限定適配,這個也是一個Android的限定符,它是Android手機會識別最小寬度的dp值,嘗試加載最小資源下的文件。

我們說一個例子,這個手機的寬度可能就是360dp,這里和我的寬高限定符讓我們可以拿到手機寬和dp值的問題,我們就提前做一個比例兌換,提前生成所有的數據信息。比如說設計稿上所有用到的尺寸,我們會不同的文件夾下生成,之后我們可以看一下使用的方式,(PPT圖示)這個也是糗事百科的主頁,也是60×60,60的時候手機上的真實表達也是根據手機的SW值所呈現。總體上它會找到對應最好的,我們還是以390為例,如果有一個手機的屏幕寬度是392,可能就找不到限定符的數字,那么它就向下兼容,這里392和390差了多少呢?我們表達同樣的尺寸的時候他們的差別是0.5,如果一個手機的寬度是392,我們可以適配的話,我們可以找到390之后使用,界面同樣是可以完美適配的。我們說適配的匹配度是99%,我們把這個界面拿給UI小姐姐她是分別不出來設計稿和手機界面的區別的。



所以它的容錯性是非常好的,它同時也兼具了之前寬高限定符的那些優點,就是當我們適配的時候,手機設計稿上的尺寸是多少,我們就用類似的尺寸引用。最后表達的值會根據系統自己的判斷,通過手機屏幕寬度的值找到手機對應的dp值,所以這個方案是一個比較優秀的方案。它的缺點不多,但是我們后面可能會講到總的來說這個方案是一個比較完善的方案,我們現在糗事百科的團隊也是在用這個方案。

目前還沒有發言其他的問題,我們用了這個方案和UI小姐姐的關系已經好了很多。接下來我們還是講一下手機的最小寬度怎被適配,這個概念可能大家不是很清楚,但是我們講一下這個屏幕密度系數,它是dpi除以160,比如小米的像素就是3個,屏幕最小寬度是通過手機最小的像素值除以密度系列,小米5的手機是1080像素,這里說一下最小寬度的概念,這個不單是指手機,Android里面寬度是和手機的方向綁定的,最小寬度這個概念保證了不管你屏幕的方向如何,始終它是瞄準了寬和高當中最小的那個值,這個是恒定的。



最后我們說一下它的一些解釋,這個是屏幕最小寬度,我們說一下我們常用的一些屏幕最小寬度以及它的一些數據。正常可能使用最多的是下面這四個,其實那邊是大的的屏幕最小寬度的dp值,其實手機的屏幕最小寬度的dp值固定在300—450之間,因為手機屏幕最小寬度和像素有關,像素密度往會把這個dp值控制在300—450之間,所以我們適配的時候我們會適配所有的資源文件避免出錯導致界面出現問題。

這個就是Android最小屏幕寬度的適配方式,還有一個我需要講的就是去年今日頭條公布的一個適配方案,這個適配方案的本質和屏幕最小寬度的適配方案核心是一致的。我們看它會把設計稿的寬度和dp值設定為一致,我這里把這個值設定為350,這里手機上控線的寬高是20我就可以直接寫20,因為它是1比1兌換。所有屏幕的這個值是不同的,今日頭條就強制把所有的寬度改為相同,他們的核心還是通過手機的最小寬度,他不管你是什么寬度,他把手機所有的屏幕寬度都設在一個值,這樣就只能加載在一個值上。

如果一個屏本來是390,通過一個方法把這個值改為360,這里有一個問題就是如何修改手機的dp值,我們看一下屏幕寬度dp值是屏幕寬度像素值除以density,我們是直接把屏幕寬度dp值直接改為設計Android寬度值,這樣的話其實就是通過改變屏幕密度系數來強制把所有的dp值改為同一個值。



在代碼里面的方式也是非常簡單的,它本質上最重要的一個公式就是第一行,他這里就有一個密度系數,我們把這個密度系數設置到當前的資源里面,接下來這里就可以修改手機屏幕的寬度,然后它接下來的事情就可以達到比較好的適配效果。

我要推薦兩個適配方案,因為我的實踐來看,這兩個方案都是比較完美的,既滿足穩定和高效,又沒有明顯的缺陷,使用的過程當中也沒有碰到比較大的問題。雖然今日頭條的方案出現了一些問題,但是對于解決方案來講,今日頭條他們在用我覺得問題也不大,所以我目前還是推薦這兩個方案。

我們做一個簡單的比較,對于前面兩個特點來說他們是差不多的,我這里特意插了一個是老項目的引入成本,我們很多情況下會維護一個又老又臭又沒有辦法改的一個項目,所以我們對于這種項目來說,我們需要考慮它的引入成本,這種情況下我做過SW這種適配方案,這種引入成本比較低。你引入了這種適配方案不影響原來已經寫好的功能和UI,今日頭條的這種方案成本是比較高的,之前我們大家也看到它的工作原理是它主動修改屏幕的寬度,導致我們老項目以前有的一些針對原有的情況的UI界面會有一些調整,所以老項目的UI尺寸還有邊距這些都要做一個修改。

還有我們說到今日頭條的適配可能有,因為網上我了解了一下網友的做法,我也看到另外一些解決方案,我可以想到的內部的尺寸邊距這里都會有一個影響,如果你不太在意的話應該也可以。



最后一個是Apk的體積,因為我們需要生成大概10來個文件,如果你找的尺寸比較好的話可能需要6、7個就好了,我們說我們所有的手機尺寸都差不多,對于今日頭條的方案對于Apk是沒有太大的影響,你們特別關注Apk或者不希望它增加的話我覺得這個方案是可以的。我們糗事百科對于Apk的體積其實就沒有那么看重,總體來講我個人非常在意SW的適配方式,不僅是我們這個項目利民在用,因為它首先有Android系統限定符的機制保證所有的流程是OK的,如果我們修改了屏幕的寬度的話,雖然我們項目沒有用,也沒有什么發言權,但是我覺得這個是需要考慮的一個問題。

最后我還想再講一個問題,就是怎么看待這些適配方案,關于Android適配方案我覺得你使用這些適配方案的時候你要思考適配方案的運行機制還有它的適配效果是由什么保證的,如果你不理解這些東西的話,后面一些機型適配的時候你會沒有辦法解決。所以我們首先要對適配方案這種東西至少要在理解機制的情況下使用,并且我們也要優先使用自適應的,或者通過布局依賴關系來解決的適配的問題,因為這種效果會更加可靠一些。適配方案對于自適應適配是一個有力的補充,而不是一個替代。



吳釗博客:

https://www.jianshu.com/u/1d8042233f67

AndroidUI適配文章地址: 

https://www.jianshu.com/p/a4b8e4c5d9b0

UI適配項目地址: 

https://github.com/ladingwu/dimens_sw




  1. 現場PPT分享:

    關注【安卓巴士Android開發者門戶】公眾號,后臺回復“420”獲取講師完整PPT。


  2. 大會現場視頻小程序:



我來說兩句
您需要登錄后才可以評論 登錄 | 立即注冊
facelist
所有評論(0)
領先的中文移動開發者社區
18620764416
7*24全天服務
意見反饋:[email protected]

掃一掃關注我們

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粵ICP備15117877號 )

两码中特期期