android尺寸問題

來源:互聯網
上載者:User

標籤:

android尺寸問題(轉)  (2013-01-15 16:55:36) 轉載▼
標籤: 雜談 分類: LINUX

最近公司做的項目中涉及到螢幕自適應的問題。由於做的是電視版的項目,因此螢幕自適應問題更為突出。想起之前曾經寫過一篇這樣的文章作為備忘。今天特意在電腦上翻了一下,把它找了出來,順便也把當時參考過的文章給找了出來。這裡分享給大家,希望對大家有所協助,有錯誤的地方還忘各位指正。

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

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

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

     首先我們瞭解一下螢幕解析度,像素密度,drawable和layout的匹配規則等問題,然後會給出螢幕自適應的解決方案(官方文檔上也有)。

  

1、基本概念

in:即英寸,它表示的是螢幕的物理尺寸。1in = 2.54cm,而且我們平時所說的尺寸是指可視螢幕的對角線的長度,並不是螢幕面積。因此,比如我們說一個手機是3.2英尺,也就 是說,它的可視地區的對角線的長度是:3.2*2.54 = 8.128cm。

解析度:它指的是螢幕垂直方向和水平方向的像素個數。比如解析度是: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的值。

density:密度,指每平方英寸中的像素數。計算方式:density=解析度/螢幕尺寸。在android中,160dpi的密度為1.0,120dpi的密度為0.75,240dpi的密度為1.5。它就是 DisplayMetrics類中屬性density的值。

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。它主要用於字型的顯示,他會根據像素密度來放大或者縮 寫字型。

2、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的小。

3、螢幕自適應解決方案

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可以協助我們更好的進行布局

android尺寸問題(轉)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.