天天看點

Android 螢幕适配方案

轉載請标明出處: 

http://blog.csdn.net/lmj623565791/article/details/45460089; 

大家在android開發時,肯定會覺得螢幕适配是個尤其痛苦的事,各種螢幕尺寸适配起來蛋疼無比。如果我們換個角度我們看下這個問題,不知道大家有沒有了解過web前端開發,或者說大家對于網頁都不陌生吧,其實适配的問題在web頁面的設計中理論上也存在,為什麼這麼說呢?電腦的顯示器的分辨率、包括手機分辨率,我敢說分辨率的種類遠超過android裝置的分辨率,那麼有一個很奇怪的現象:

為什麼web頁面設計人員從來沒有說過,尼瑪适配好麻煩?

那麼,到底是什麼原因,讓網頁的設計可以在千差萬别的分辨率的分辨率中依舊能給使用者一個優質的體驗呢?帶着這個疑惑,我問了下媳婦(前端人員),媳婦睜大眼睛問我:什麼叫适配?fc,尼瑪,看來的确沒有這類問題。後來再我仔細的追問後,她告訴我,噢,這個尺寸呀,我都是設定為20%的~~追根到底,其實就是一個原因,網頁提供了百分比計算大小。

同樣的,大家拿到ui給的設計圖以後,是不是抱怨過尼瑪你辨別的都是px,我項目裡面用dp,這什麼玩意,和ui人員解釋,ui妹妹也不了解。那麼本例同樣可以解決android工程師和ui妹妹間的沖突~ui給出一個固定尺寸的設計稿,然後你在編寫布局的時候不用思考,無腦照抄上面辨別的像素值,就能達到完美适配,理想豐不豐滿~~。

然而,android對于不同的螢幕給出的适配方案是dp,那麼dp與百分比的差距到底在哪裡?

dp

我們首先看下dp的定義:

density-independent pixel (dp)獨立像素密度。标準是160dip.即1dp對應1個pixel,計算公式如:px = dp * (dpi / 160),螢幕密度越大,1dp對應 的像素點越多。  上面的公式中有個dpi,dpi為dpi是dots per inch(每英寸所列印的點數),也就是當裝置的dpi為160的時候1px=1dp;

好了,上述這些概念記不記得住沒關系,隻要記住一點dp是與像素密度無關的,在實際使用中1dp大約等于1/160inch。

那麼dp究竟解決了适配上的什麼問題?可以看出1dp = 1/160inch;那麼它至少能解決一個問題,就是你在布局檔案寫某個view的寬和高為160dp*160dp,這個view在任何分辨率的螢幕中,顯示的尺寸大小是大約是一緻的(可能不精确),大概是 1 inch * 1 inch。

但是,這樣并不能夠解決所有的适配問題:

呈現效果仍舊會有差異,僅僅是相近而已

當裝置的實體尺寸存在差異的時候,dp就顯得無能為力了。為4.3寸螢幕準備的ui,運作在5.0寸的螢幕上,很可能在右側和下側存在大量的空白。而5.0寸的ui運作到4.3寸的裝置上,很可能顯示不下。

以上兩點,來自參考連結1

一句話,總結下,dp能夠讓同一數值在不同的分辨率展示出大緻相同的尺寸大小。但是當裝置的尺寸差異較大的時候,就無能為力了。适配的問題還需要我們自己去做,于是我們可能會這麼做:

上述代碼片段來自網絡,也就是說,我們為了優質的使用者體驗,依然需要去針對不同的dpi設定,編寫多套數值檔案。

可以看出,dp并沒有能解決适配問題。下面看百分比。

百分比 

這個概念不用說了,web中支援控件的寬度可以去參考父控件的寬度去設定百分比,最外層控件的寬度參考螢幕尺寸設定百分比,那麼其實中android裝置中,隻需要支援控件能夠參考螢幕的百分比去計算寬高就足夠了。

比如,我現在以下幾個需求:

對于圖檔展示的banner,為了起到該有的效果,我希望在任何手機上顯示的高度為螢幕高度的1/4

我的首頁分上下兩欄,我希望每個欄目的螢幕高度為11/24,中間間隔為1/12

slidingmenu的寬度為螢幕寬度的80%

當然了這僅僅是從一個大的層面上來說,其實小範圍布局,可能百分比将會更加有用。

那麼現在不支援百分比,實作上述的需求,可能需要1、代碼去動态計算(很多人直接pass了,太麻煩);2、利用weight(weight必須依賴linearlayout,而且并不能适用于任何場景)

再比如:我的某個浮動按鈕的高度和寬度希望是螢幕高度的1/12,我的某個button的寬度希望是螢幕寬度的1/3。

上述的所有的需求,利用dp是無法完成的,我們希望控件的尺寸可以按照下列方式編寫:

利用螢幕的寬和高的比例去定義view的寬和高。

好了,到此我們可以看到dp與百分比的差別,而百分比能夠更好的解決我們的适配問題。

some 适配tips

我們再來看看一些适配的tips

多用match_parent

多用weight

自定義view解決

其實上述3點tip,歸根結底還是利用百分比,match_parent相當于100%參考父控件;weight即按比例配置設定;自定義view無非是因為裡面多數尺寸是按照百分比計算的;

通過這些tips,我們更加的看出如果能在android中引入百分比的機制,将能解決大多數的适配問題,下面我們就來看看如何能夠讓android支援百分比的概念。

其實我們的解決方案,就是在項目中針對你所需要适配的手機螢幕的分辨率各自履歷一個檔案夾。

如下圖:

Android 螢幕适配方案

然後我們根據一個基準,為基準的意思就是:

比如480*320的分辨率為基準

寬度為320,将任何分辨率的寬度分為320份,取值為x1-x320

高度為480,将任何分辨率的高度分為480份,取值為y1-y480

例如對于800*480的寬度480:

Android 螢幕适配方案

可以看到x1 = 480 / 基準 = 480 / 320 = 1.5 ;

其他分辨率類似~~ 

你可能會問,這麼多檔案,難道我們要手算,然後自己編寫?不要怕,下文會說。

那麼,你可能有個疑問,這麼寫有什麼好處呢?

假設我現在需要在螢幕中心有個按鈕,寬度和高度為我們螢幕寬度的1/2,我可以怎麼編寫布局檔案呢?

可以看到我們的寬度和高度定義為x160,其實就是寬度的50%; 

那麼效果圖:

Android 螢幕适配方案

可以看到不論在什麼分辨率的機型,我們的按鈕的寬和高始終是螢幕寬度的一半。

對于設計圖

假設現在的ui的設計圖是按照480*320設計的,且上面的寬和高的辨別都是px的值,你可以直接将px轉化為x[1-320],y[1-480],這樣寫出的布局基本就可以全分辨率适配了。

你可能會問:設計師設計圖的分辨率不固定怎麼辦?下文會說~

對于上文提出的幾個dp做不到的

你可以通過在引入百分比後,自己試試~~

好了,有個最主要的問題,我們沒有說,就是分辨率這麼多,尼瑪難道我們要自己計算,然後手寫?

好了,其實這樣的檔案夾手寫也可以,按照你們需要支援的分辨率,然後編寫一套,以後一直使用。

當然了,作為程式員的我們,怎麼能做這麼low的工作,肯定要程式來實作:

那麼實作需要以下步驟:

分析需要的支援的分辨率

對于主流的分辨率我已經內建到了我們的程式中,當然對于特殊的,你可以通過參數指定。關于螢幕分辨率資訊,可以通過該網站查詢:http://screensiz.es/phone

編寫自動生成檔案的程式

代碼如下

同時我提供了jar包,預設情況下,輕按兩下即可生成,使用說明:

Android 螢幕适配方案

下載下傳位址見文末,内置了常用的分辨率,預設基準為480*320,當然對于特殊需求,通過指令行指定即可:

例如:基準 1280 * 800 ,額外支援尺寸:1152 * 735;4500 * 3200;

Android 螢幕适配方案

按照

java -jar xx.jar width height width,height_width,height

上述格式即可。

到此,我們通過編寫一個工具,根據某基準尺寸,生成所有需要适配分辨率的values檔案,做到了編寫布局檔案時,可以參考螢幕的分辨率;在ui給出的設計圖,可以快速的按照其辨別的px機關進行編寫布局。基本解決了适配的問題。