android尺寸問題(轉)

android尺寸問題(轉)

  (2013-01-15 16:55:36)
標籤: 

雜談

分類: LINUX

最近公司作的項目中涉及到屏幕自適應的問題。因爲作的是電視版的項目,所以屏幕自適應問題更爲突出。想起以前曾經寫過一篇這樣的文章做爲備忘。今天特地在電腦上翻了一下,把它找了出來,順便也把當時參考過的文章給找了出來。這裏分享給你們,但願對你們有所幫助,有錯誤的地方還忘各位指正。html

   參考的文章地址以下,在此對兩位做者表示感謝。android

http://blog.csdn.net/beihai1212/article/details/7026327  api

http://blog.csdn.net/moruite/article/details/6028547佈局

     首先咱們瞭解一下屏幕分辨率,像素密度,drawable和layout的匹配規則等問題,而後會給出屏幕自適應的解決方案(官方文檔上也有)。測試

  

一、基本概念字體

in:即英寸,它表示的是屏幕的物理尺寸。1in = 2.54cm,並且咱們平時所說的尺寸是指可視屏幕的對角線的長度,並非屏幕面積。所以,好比咱們說一個手機是3.2英尺,也就 是說,它的可視區域的對角線的長度是:3.2*2.54 = 8.128cm。ui

分辨率:它指的是屏幕垂直方向和水平方向的像素個數。好比分辨率是:480*320,也就是說: 水平方向(寬)有320個像素點。豎直方向(高)有480個像素點。編碼

dpi:像素密度,即dots per inch,指的是每英寸的像素數。如160dpi指手機水平或垂直方向 上每英寸距離有160個像素點。假定設備分辨率爲320*240,屏幕長2英寸寬1.5英 寸,dpi=320/2=240/1.5=160。Android中主要有三種像素密度:120,160,240。它就是 DisplayMetrics類中屬性densityDpi的值。spa

density:密度,指每平方英寸中的像素數。計算方式:density=分辨率/屏幕尺寸。在android中,160dpi的密度爲1.0,120dpi的密度爲0.75,240dpi的密度爲1.5。它就是 DisplayMetrics類中屬性density的值。.net

px:即pixel,像素。它在不一樣設備上的顯示效果相同。這裏的「相同」指的是像素不會變。第一個問題:好比一個button的寬是100px,那麼不管是在120,160,仍是240像素密度 的設備上,它的寬都應該顯示100px。,好比咱們有三個480x320的手機,它的dpi 分 別爲:120,160,180。那麼此時,若是它在160dpi的手機上顯示3釐米,在120dpi的 手機上就會顯示(4/3)*3釐米,就比160dpi上顯示的要大了,同理,在240dpi上顯示的 按鈕看起來就更窄了。而這裏咱們的手機是同樣大的,這就出現了不適應屏幕的問題。

這就是咱們不推薦不使用px的緣由之一,由於px與手機的像素密度有直接的關係

第二個問題:好比咱們有三個手機,它的dpi都爲120,而屏幕尺寸分別爲【寬度爲更 小的那個值】:320*240,480*320,640*480。咱們須要在屏幕的第一行放一個按 鈕,讓它 佔滿屏幕。設計的時候,咱們在480*320的手機上設置好了大小,好比爲180px,當把 這個程序運行在320*240的手機上時,而明顯,這個按鈕是顯示不全的,而在640*480 的手機上它又是佔不滿的。這就是咱們不推薦不使用px的緣由之二,由於px與手機的屏幕有直接的關係

因爲有上面的問題,android中咱們通常就推薦使用dip,而不使用px。

dp:dp是dip的縮寫,它是device-independent pixel,即設備獨立像素。它是一個與像素密 度和屏幕尺寸都無關的單位。在不一樣的屏幕上有不一樣的顯示效果。它與像素px的換算 公式爲:px = (像素密度/160)*dp。

上面已經說過,android中經常使用的像素密度有120,160,240。那麼在160dpi的設備上, 1px=1dp。

解決第一個問題:仍是三個480x320的手機,它的dpi 分別爲:120,160,180。咱們將 一個按鈕的寬度設置爲:100dp。根據上面的換算單位,它在160dpi的手機上顯示的像 素爲100px,即上面的3cm。那麼在120dpi的手機上它顯示的像素就爲(3/4)*100px,換 算成釐米爲:(4/3)*(3/4),仍是至關於在160dpi上的顯示寬度,即3cm。同理可獲得在 240dpi的設備上,它的顯示寬度也爲3釐米。

sp:放大像素,即ScaledPixels。它主要用於字體的顯示,他會根據像素密度來放大或者縮 寫字體。

二、android中的drawable和layout。

對於API 1.6及以上版本的應用程序中,可使用drawable,drawable-hdpi,drawable-ldpi,drawable-mdpi,drawable-xdpi的文件夾來在不一樣的像素密度下使用的圖片。使用layout-small,layout-normal,layout-large,layout-xlarge來存放不一樣屏幕尺寸下使用的佈局文件。其在android應用程序中所對應的實際設備的轉換關係以下圖:

 

Android系統對drawable,drawable-hdpi,drawable-ldpi,drawable-mdpi,drawable-xdpi中存放的圖片進行選擇的規則是:先去匹配此密度下對應的圖片資源,若是沒有,就去使用drawable目錄下的圖片資源。好比,有一個設備像素密度是240dpi,那麼此時它將優先使用drawable-hdpi目錄下的圖片資源,可是若是drawable-hdpi目錄不存在,它就會去使用drawable目錄下的資源文件。

在android中除了使用上面的五種佈局外,還可使用layout-axb和layout-swadp的方式來存放佈局文件。好比layout-480x360和layout-sw600dp。通過測試,總結出以下的匹配規則:

假設在某個應用程序中存在以下的佈局文件:

Layout-xlarge,layout-large,layout-normal,layout-small,layout,layout-sw500dp,layout-1280x800,layout-1280x888,layout-1280x750,layout-sw1280dp,layout-sw1dp。

對於全部版本的API(2.2,3.0,3.2,4.0測試均是以下結果):

A、首先去匹配layout-xlarge,接着是layout-large,而後是layout-normal,最後是layout-small。上述中的任一一個能夠匹配成功,佈局文件就匹配成功。

B、若是匹配未成功,就會去找layout-swadp這個文件,若是能夠找到adp能比屏幕寬度小的,就匹配成功。即便你的屏幕是:1280x800,若是layout中有layout-sw1dp,且第一個條件未被匹配,而layout-swadp又只有這一個,那麼此時,無論其餘還有什麼佈局文件,layout-sw1dp都會去匹配,即便你的佈局文件中有layout-1280x800。

C、若是上面兩中狀況都未匹配到,此時就要分版原本匹配layout-axb文件了:

3.2之前的版本:

只有當layout-axb徹底匹配時,纔去使用這個佈局文件,不然使用layout。也就是說,個人屏幕是1280x800,api版本是1.6-3.0,那麼此時若是佈局文件中有layout-1280x750而沒有layou-1280x800,也就說不能徹底匹配,那麼系統會選用layout這個佈局文件來進行匹配。

3.2之後的版本:

若是layout-axb能徹底匹配,就使用這個佈局文件,若是不能匹配,就去找a和b都要比它的屏幕小,而且最接近的那個佈局文件。可是前提條件是:若是是大屏幕,你給的佈局文件尺寸比normal的大,若是是小屏幕,你給的佈局文件比normal的小。

三、屏幕自適應解決方法

A、使用wrap-content和match-parent(api2.2以前使用fill-parent),即寬高根據內容調整以及伸展至父控件一致。而不是硬編碼寫死控件的大小。

B、使用相對佈局(RelativeLayout)

使用相對的佈局方式來進行控件的擺放,這種方式靈活性大,可是也相對複雜。

C、使用FrameLayout,即幀佈局能夠在必定程度上消除屏幕尺寸帶來的問題。

D、使用layout-xlarge,layout-large,layout-small這種方式來創建多個佈局文件。使用這種方式能夠僅用四個佈局文件就匹配全部高於1.6版本的應用。而且效果比只用一個layout要好不少。

E、使用最小寬度標識符,也就是layout-swaaaadp的方式。官方在3.2的新特性中特別申明瞭以下四種方式用於使用3.2版本的平板建議使用的佈局方式,以下:

res/layout-sw600dp/main_activity.xml  // 7英寸平板

res/layout-sw720dp/main_activity.xml  //10英寸平板
res/layout-w600dp/main_activity.xml   //根據寬度自適應
res/layout-sw600dp-w720dp/main_activity.xml  //超寬的佈局

F、使用layout-axb這種方式來進行屏幕自適應。

因爲在3.2版本以前只有當layout-axb徹底匹配時,纔會去使用這個佈局文件,可是在3.2之後能夠最接近匹配,全部在電視版中可使用這種方式進行佈局。

G、一些重要的圖片,好比logo,主頁面的那些圖片可使用9.png圖片,由於這種圖片拉伸後不會出現很嚴重的失真,因此顯示效果會相比於普通的png圖片要好。

9.png圖片的更多信息能夠看這裏:http://www.himigame.com/android-game/321.html

H、使用drawable-hdpi,drawable-mdpi這種方式來定義不一樣的圖片,能夠幫助咱們適應不一樣的屏幕密度。使用dp和sp能夠幫助咱們更好的進行佈局

相關文章
相關標籤/搜索