Android屏幕大小適配問題解決

原地址:http://www.penddy.com/a-variety-of-screen-adaptation-of-android.html

Android屏幕大小適配問題解決

轉載:http://www.cnblogs.com/crazywenza/p/3480297.html

一、一些基本概念

1、長度(真實長度):英寸、inch

2、分辨率:density 每英寸像素數  dpi(密度)

3、像素:px

4、dip的公式:px /dip=dpi/160  所以 dip 類似於英寸、長度(dp=dip,sp類似於dip)  dip=160*inch

5、相對分辨率=長px*寬px

二、平時我們一些概念的混淆

1、平時我們說 手機的分辨率是 320*480的,其實的這裏的分辨率是相對分辨率

意思是:水平方向上的像素數是320,垂直方向上像素數是480,

分辨率是160(默認是160,意思是每英寸像素數160)

那麼水平方向:320 /160=2英寸

垂直方向:480/160=3英寸

於是乎 屏幕對角線 是根號下4*9=3.6(這就是常說的3.6英寸屏幕)

 

2、說一個手機的屏幕參數有三個:長寬像素之積(相對分辨率)、真實分辨率、對角線長度(真實分辨率默認是160所以不常說,如果不是160你可以通過另外兩個參數求出真實分辨率)

 

3、模擬器的分辨率都是160,所以像素越大,屏越大

 

4、l、m、h 三個文件夾是按 真是分辨率dpi 來對應找文件的。

 

5、有三種方案解決屏幕適配

(1)按像素比      y/開發時用的屏幕像素=x/用戶設備像素

(2)按長度        用dip(假設屏幕尺寸基本不變)

(3)按密度        放在l、m、h文件夾(假設屏幕尺寸基本不變,dpi越大 px越大)

6、如果手機是hdpi,但hdpi裏沒有東西,l裏有東西,程序就會去l裏找圖片並且把它按比例放大。

 

7、最全的辦法:單獨適配

屏幕分辨率:1024x600
density:1(160)
文件夾:values-mdpi-1024x600

屏幕分辨率:1024x600
density:1.5(240)
文件夾:values-hdpi-683x400  由1024/1.5  600/1.5得到,需要四捨五入。

屏幕分辨率:800x480
density:1(160)
文件夾:values-mdpi-800x480

屏幕分辨率:800x480
density:1.5(240)
文件夾:values-hdpi-533x320  由800/1.5  480/1.5得到,需要四捨五入。

以此類推
一般情況下需要創建出values 、values-mdpi 、 values-hdpi文件夾,以備在一些沒有規定的尺寸屏幕上找不到資源的情況。

 

8、我的原則,能用拉伸圖片的就拉伸、能用相對佈局的就用相對佈局、能用代碼計算寬度就代碼計算。

0.75 _1_   1.5_            2_               2.4                        3

240_ 320_  480_   (xhdpi)640*960_   (xlarge)768*1280           (xlarge)

res/drawable下的文件會做失真壓縮

res/drawable-nodpi下的文件不做任何處理

我的處理是:

drawable-xhdpi是適應現在的大屏手機,三星9250就是320dpi(但它確是1280*720的)

drawable-xlarge是適配平板的

 

版權聲明:轉載時請以超鏈接形式標明文章原始出處和作者信息
  本文鏈接:http://www.penddy.com/a-variety-of-screen-adaptation-of-android.html

嚴格來說,作爲讀者,你應該帶着批判性質的眼光來看這篇文章,此文章依據本人對Android官方開發資料《Supporting Multiple Screens》的閱讀、實踐以及和開發人員的溝通形成,內容更多爲目前盆地個人理解的總結。

一、Android支持的多種屏幕

傳統意義上,一般是是這麼認爲的:

ldpi: 對應分辨率240×320

mdpi: 對應分辨率320×480

hdpi:對應分辨率480×800或480×854

但實際上沒有這麼簡單,直接看官方資料的下標,可以看到其實ldpi一樣由480×800,甚至還有1024×600


低密度(ldpi 120)中密度(mdpi 160)高密度(hdpi 240)超高密度(320 xhdpi)
小屏幕QVGA (240×320)
480×640
中屏幕WQVGA400 (240×400)
WQVGA432 (240×432)
HVGA (320×480)WVGA800 (480×800)
WVGA854 (480×854)
600×1024
640×960
大屏幕WVGA800** (480×800)
WVGA854** (480×854)
WVGA800* (480×800)
WVGA854* (480×854)
600×1024


超大屏幕1024×600WXGA (1280×800)
1024×768
1280×768
1536×1152
1920×1152
1920×1200
2048×1536
2560×1536
2560×1600

二、如何分辨是ldpi、mdpi、hdpi?

爲什麼要分辨率ldpi、mdpi、hdpi?我的理解,是爲了要在不同的屏幕密度下取得最好的顯示效果。

從上一段來看,通過分辨率來看並不是很靠譜,那怎麼樣才靠譜?其實,只要我們知道屏幕分辨率、屏幕尺寸(對角線長度),就可以算出相應的屏幕密度,從而根據其範圍得出屬於那種屏幕密度。

我們可以根據長或者根據寬來計算出dpi,計算公式爲:

 

dpi=寬/((尺寸^2 * 寬^2)/(寬^2 + 高^2))^(1/2)

= 長/((尺寸^2 * 長^2)/(寬^2 + 高^2))^(1/2)

此計算公式可以在excel中予以計算。

大概計算方法如下,以寬爲例:

1.比如分辨率爲320×480,則長寬比爲1:1.5

2.比如屏幕尺寸爲3.6”,則根據勾股定理,”長^2+寬^2=3.6^2″,即”寬^2+2.25*寬^2=12.96″,得出”寬^2=12.96/3.25″,則”寬=(12.96/3.25)^(1/2)= 1.9969″

3.寬爲320px,分佈在1.9969”上,因此密度爲320/1.9969=160.2467

4.因此此密度爲mdpi的密度

注:

1.此部分參考文章爲:http://blog.sina.com.cn/s/blog_7377a8a20100qydh.html

2.兩款計算dpi的應用

https://market.android.com/details?id=appinventor.ai_wenjiun1024.DPICalculato

https://market.android.com/details?id=com.andy.dpi

三、粗略的分辨率ldpi 、mdpi、hdpi

套用老資料,其實傳統意義上的通過分辨率判斷手機dpi,還是比較靠譜的:

ldpi: 對應分辨率240×320

mdpi: 對應分辨率320×480

hdpi:對應分辨率480×800或480×854

爲什麼呢?因爲ldpi如果要是320×480,則需要4.8寸的屏幕,如果是480×800,則需要7.8寸的屏幕,如果mdpi是480×800,則需要5.2寸的屏幕,一般的手機屏幕不會這麼大,所以還算靠譜。

當然,如果是分辨android pad的dpi,建議還是算一下吧。

四、如何適配之9-patch?

官方資料:http://developer.android.com/guide/developing/tools/draw9patch.html

簡單來說,如果你的圖片資源是可以拉伸的而不會變形或者模糊的,則完全可以使用9-patch的格式,而不用爲不同的dpi提供不同的圖片資源。

此格式經常用在背景性質的圖片資源中。

android開發包提供了9-patch的製作工具,上方的劃線指明橫向可以拉伸的區域,左方的劃線指明縱向可以拉伸的區域,下方的劃線指明水平居中的區域,右方的劃線指明垂直居中的區域。

盆地的理解中,一般提供hdpi大小的圖片,並製作爲9-patch格式,此時的拉伸在mdpi、ldpi上基本都不會帶來問題。

這部分網上有不少資料,這裏就不再贅述了,上述的描述是爲了盆地日後便於想起和理解。

五、如何適配指圖標和其他圖片

除了指明拉伸區域拉伸不變形的圖片外,類似圖標或者其他會變形的圖片資源,最佳情況下需要分別針對不同的dpi提供不同的圖片。

此處特別需要注意的是,假設不考慮xhdpi的支持,hdpi、mdpi、ldpi的支持,需要考慮相應的比例,即1.5:1:0.75,需要在相應比例關係下保持整數的像素值,否則可能會產生模糊的情況。

舉個具體例子,某個圖標在hdpi下大小爲48×48,則mdpi和ldpi下分別爲32×32和24×24,如果此圖標在hdpi設定爲 50×50,則mdpi下50無法整除1.5,因此mdpi下圖標不論圖標設定爲33×33還是34×34都會模糊(可能獨立指定可以避免此情況,此部分 不太瞭解)。

六、菜單圖標和應用圖標

這一部分在官方資料中描述的很全面,只是不少應用開發者沒有按照規範來,比如桌面圖標的在hdpi上分辨率雖然定義的是72×72,但實際上應該只 佔60×60(如果是正方形,則應該是56×56),而不少應用直接把圖標設定爲72×72,所以會發現android中很多圖標比系統的圖標大一些,就 是這個緣故。

這一部分就直接參照官方文檔吧,做法上也就是做三份,只是需要遵照文檔來。

http://developer.android.com/guide/practices/ui_guidelines/icon_design.html

七、小結

作爲產品人員,瞭解這個的目的,是爲了向UI人員協調相應的UI資源,以及和開發保持順暢的溝通,如果不瞭解這個,可能事倍功半,所以,作爲產品人員,還是瞭解下吧。

上述描述中錯誤的地方,請不吝賜教。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章