模擬器上和真機確實存在差距,上了開發板後,發現在模擬器上跑的好好的佈局都必須改變。
下面是轉載的一篇文章,收藏在此。http://blog.csdn.net/xieyan0811/archive/2010/06/18/5931561.aspx
1. 什麼是 density
1)
density
density
表示每英寸有多少個顯示點
(
邏輯值
)
,它的單位是
dpi
:
dot per inch
,通常屏幕大時,
density
就大,屏幕小時,
density
就小,通常
屏幕實際分辨率爲
240px*400px
時,
density=120
屏幕實際分辨率爲
320px*533px
,
density=160
屏幕實際分辨率爲
480px*800px
,
density=240
2)
分辨率
是整個屏是多少點,比如
800x480
,它是軟件的顯示單位
3)
從
Android1.6
版本開始支持
density(
對應
API Level 4)
用於解決應用在屏幕大小不同的硬件上正常顯示的問題
2. 相關代碼及設置
1)
AndroidManifest.xml
這個參數在
API Level 4
也就是
SDK 1.6
以後才啓用的,而且
1.6
版本的
API Level 4
的應用默認值就是
True
2)
資源目錄名(
android 2.0
以後)
res/xxx-hdpi
當
density
爲
240
時,使用此目錄下的資源
res/xxx-mdpi
當
density
爲
160
時,使用此目錄下的資源
res/xxx-ldpi
當
density
爲
120
時,使用此目錄下的資源
res/xxx
不常後綴,爲默認設置,同
xxx-mdpi
3) 資源單位( xml 文件中定義大小的單位)
a)
dp=dip=dx (Density independent pixel
)
基於屏幕密度的抽象單位,設備無關的點,用於說明與密度無關的尺寸和位置。這些單位是相對於一個
160dpi
的屏幕,所有一個
dp
是
160dpi
屏幕上的一個點。
b)
px
px
指軟件的單位點,設備相關的點
c) 具體使用
i.
佈局時儘量使用單位
dip
,少使用
px
若使用
px
,如果設某控件大小
400x400px
,在
800x480
上顯示正常,而在
533x320
的屏上就超出屏幕了
若使用
dp
,如果設某控件大小爲
160x160dp
,就可以通過從系統中取
density
來算出真正的大小,比如在
800x480
屏的
density
設爲
240
,而
533x320
屏的
density
設爲
160
,藉以下公式計算
pixels = dips * (density / 160)
在
800x480
在屏中顯示
240
象素,而在
533x320
的屏中顯示爲
160
象素,控件在屏中顯示的比例是一樣的。
ii.
內部的處理過程分爲三步:
取
screen
中其它元素,轉爲應用的值,計算應用各控件位置,然後再轉成
800x480
以供真正顯示
若
res-xxx
不存在,則讀取
res
有的資源,然後對其做相應縮放
3. 實現 density 的關鍵源碼
1) BitmapFactory.java (用於縮放圖片)
2) ComptibilityInfo.java (用於位置計算)