天天看點

了解Android中dpi和分辨率的關系,談談Android做成适應全部手機的UI方式

最近我在做一個界面,UI給的切圖是1280x720這個分辨率的,給的标注機關是px(像素)。

我把原圖自然而然地放在drawable-xhdpi中,然後開始調整布局(當時我預設1dp=2px)。把這個布局放到一個720P的電視上,發現完全變形了,奇囧無比之際,看了下電視的density,發現這貨是1,這是一個mdpi的裝置!!!

然後我就開始想了,720P的切圖,要放在xhdpi這裡,但是有的裝置自身是mdpi之類的,那這個分辨率和dpi到底是什麼關系?

樓主先是查了下基本的概念:

1.DPI:dots per inch,一英寸的像素數量,這個值是裝置自己決定的,是寫死的,當然也有廠商自己搞了個density=1.25的,我都不知道該說啥了...

Google規定的見下表:

一英寸有多少個點兒? 我們用來density來分辨
ldpi 120dpi 0.75
mdpi 160dpi 1
hdpi 240dpi 1.5
xhdpi 320dpi 2

2.DIP(也就是我們用的dip/dp):device independent pixel,裝置獨立像素,我們不會直接使用px,而是使用dp,1 px = 1dp * density(由DPI)決定。

這裡完全沒有涉及到分辨率的問題...我覺得dpi和分辨率之間壓根沒有關系...

和基友讨論了好一會,終于明白了以下這兩個問題:

1.為什麼一個720P的裝置,取mdpi裡的圖檔,但是720P的切圖要放在xhdpi裡?

A: 這完全是根據主流手機來決定的,比如現在主流的是480P/hdpi的手機,那麼,在做UI時,就會取720P作為xhdpi,取320P作為mdpi,取240P作為ldpi,這樣一套套圖就切出來了。

如果,主流的手機分辨率變成了720P/hdpi的手機,那麼,在做UI時,就會取480P作為mdpi,取1080P作為xhdpi,以此類推。

至于Google是這樣推薦的:取你手邊最大的分辨率作為基準,做出最清晰的圖(xhdpi),然後,按比例縮放,做出hdpi、mdpi和ldpi。是以從原理上,720P的切圖放在哪裡是可以根據裝置來變換的。

2.如果720P的切圖在xhdpi裡,但我手頭有一個mdpi/720P的裝置,那怎麼辦呢?

(假設你的應用要支援所有奇葩的分辨率,而且你已經切好了4套圖(ldpi~xhdpi)  并在layout裡寫了一套布局)

A: 如果你自己思考了dpi和分辨率的關系的話,你會發現,他們的關系就是沒有關系...是以這個問題,我的解決辦法(大家的)是,讓多套dimens來幫我們解決這個問題。

480p 600p 720p 1080p
mdpi values-sw480dp-mdpi values-sw600dp-mdpi values-sw720dp-mdpi values-sw1080dp-mdpi
hdpi values-sw480dp-hdpi
xhdpi values-sw480dp-xhdpi

在你的res檔案夾下,建立這些檔案夾,然後再放進一個dimens.xml,用這種方法,就可以應對所有的分辨率情況了。

舉例說明下:如果原圖(1280x720)上有一個100x50(像素)大小的控件,那麼對于一個正常的hdpi/800x480的裝置來說,應該設定它的大小(dp)為:

長:(100/720*480/1.5)dp = 45dp (向上取整)

寬:(50/720*480/1.5)dp = 23dp

将這兩個值寫在values-sw480dp-hdpi/dimens.xml裡,圖的比例和原圖就一樣了。

那對于一個剛才我列舉到的mdpi/1280x720的裝置,它的大小應該是:

長:(100/720*720/1) = 100dp;

寬:(50/720*720/1) = 50dp;

将這兩個值寫在values-sw720dp-mdpi中,圖的比例和原圖就一樣了。

3.不是我要黑IOS,如果IOS再出幾個分辨率的話,那IOS開發者是不是都要抓狂了呢?

A: 就現在而言,我很高興地回答你:是的! IOS布局的方式相當于Android中的絕對布局,而且它沒有wrap_content和match_parent這些方式,等到IOS 10長到及腰時,我看你等做IOS開發的腫麼辦,哈哈。

綜上,希望此帖可以幫到一些對Android布局有疑惑的同學~