|
1. 什么是density 引用
1) density density表示每英寸有多少個(gè)顯示點(diǎn)(邏輯值),它的單位是dpi:dot per inch,通常屏幕大時(shí),density就大,屏幕小時(shí),density就小,通常 屏幕實(shí)際分辨率為240px*400px時(shí),density=120 屏幕實(shí)際分辨率為320px*533px,density=160 屏幕實(shí)際分辨率為480px*800px,density=240 2) 分辨率 是整個(gè)屏是多少點(diǎn),比如800x480,它是軟件的顯示單位 3) 從Android1.6版本開(kāi)始支持density(對(duì)應(yīng)API Level 4) 用于解決應(yīng)用在屏幕大小不同的硬件上正常顯示的問(wèn)題 引用
1) AndroidManifest.xml 這個(gè)參數(shù)在API Level 4也就是SDK 1.6以后才啟用的,而且1.6版本的API Level 4的應(yīng)用默認(rèn)值就是True 2) 資源目錄名(android 2.0以后) res/xxx-hdpi 當(dāng)density為240時(shí),使用此目錄下的資源 res/xxx-mdpi 當(dāng)density為160時(shí),使用此目錄下的資源 res/xxx-ldpi 當(dāng)density為120時(shí),使用此目錄下的資源 res/xxx 不常后綴,為默認(rèn)設(shè)置,同xxx-mdpi 3) 資源單位(xml文件中定義大小的單位) a) dp=dip=dx (Density independent pixel) 基于屏幕密度的抽象單位,設(shè)備無(wú)關(guān)的點(diǎn),用于說(shuō)明與密度無(wú)關(guān)的尺寸和位置。這些單位是相對(duì)于一個(gè)160dpi的屏幕,所有一個(gè)dp是160dpi屏幕上的一個(gè)點(diǎn)。 b) px px指軟件的單位點(diǎn),設(shè)備相關(guān)的點(diǎn) c) 具體使用 i.布局時(shí)盡量使用單位dip,少使用px 若使用px,如果設(shè)某控件大小400x400px,在800x480上顯示正常,而在533x320的屏上就超出屏幕了 若使用dp,如果設(shè)某控件大小為160x160dp,就可以通過(guò)從系統(tǒng)中取density來(lái)算出真正的大小,比如在800x480屏的density設(shè)為240,而533x320屏的density設(shè)為160,借以下公式計(jì)算 pixels = dips * (density / 160) 在800x480在屏中顯示240象素,而在533x320的屏中顯示為160象素,控件在屏中顯示的比例是一樣的。 ii. 內(nèi)部的處理過(guò)程分為三步: 取screen中其它元素,轉(zhuǎn)為應(yīng)用的值,計(jì)算應(yīng)用各控件位置,然后再轉(zhuǎn)成800x480以供真正顯示 若res-xxx不存在,則讀取res有的資源,然后對(duì)其做相應(yīng)縮放
引用
1) BitmapFactory.java(用于縮放圖片) 2) ComptibilityInfo.java(用于位置計(jì)算)
public static String getDisplayMetrics(Context cx) {
String str = "";
DisplayMetrics dm = new DisplayMetrics();
dm = cx.getApplicationContext().getResources().getDisplayMetrics();
int screenWidth = dm.widthPixels;
int screenHeight = dm.heightPixels;
float density = dm.density;
float xdpi = dm.xdpi;
float ydpi = dm.ydpi;
str += "The absolute width:" + String.valueOf(screenWidth) + "pixels\n";
str += "The absolute heightin:" + String.valueOf(screenHeight)
+ "pixels\n";
str += "The logical density of the display.:" + String.valueOf(density)
+ "\n";
str += "X dimension :" + String.valueOf(xdpi) + "pixels per inch\n";
str += "Y dimension :" + String.valueOf(ydpi) + "pixels per inch\n";
return str;
}
TextView tv1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_test2);
tv1 = (TextView) findViewById(R.id.TextView01);
tv1.post(new Runnable(){
public void run()
{
processLayout();
}
});
}
private void processLayout(){
Rect rect= new Rect();
Window window= getWindow();
tv1.getWindowVisibleDisplayFrame(rect);
//狀態(tài)欄高度
int statusBarHeight= rect.top;
int contentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
//標(biāo)題欄高度
int titleBarHeight= contentViewTop - statusBarHeight;
//測(cè)試結(jié)果:ok之后 100多 ms 才運(yùn)行了
Log.v("test", "=-init-= statusBarHeight="+statusBarHeight+
" contentViewTop="+contentViewTop+
" titleBarHeight="+titleBarHeight);
}
|
|
|