最近我在做一個界面,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布局有疑惑的同學~