編輯:關於Android編程
近期遇到一個問題,我的地圖浮標圖片在WVGA手機上正好,在QVGA上就顯的太大,所以我要根據屏幕的不同調整浮標的大小使其在QVGA大小合適。有的同事提出了依據分辨率來區分不同的屏幕,但是單WVGA就支持好幾種不同的分辨率,QVGA又支持好幾種。。。而且更神奇的時候,有時候,通過代碼獲取屏幕分辨率竟然得到了320 x 427,Android文檔是不支持這種分辨率的,所以依據分辨率來區分不同的屏幕是行不通的。還好通過仔細研讀文檔,“各種VGA的density是不同的,(hdpi: 240 , ldpi: 120 , mdpi: 160 , xhdpi: 320)”,所以只要求出不同屏幕的density,就可以知道該手機屬於的屏幕類型。
首先是幾個基本概念:
1.屏幕尺寸Screen size
即顯示屏幕的實際大小,按照屏幕的對角線進行測量。
為簡單起見,Android把所有的屏幕大小分為四種尺寸:小,普通,大,超大(分別對應:small, normal, large, and extra large).
應用程序可以為這四種尺寸分別提供不同的自定義屏幕布局-平台將根據屏幕實際尺寸選擇對應布局進行渲染,這種選擇對於程序側是透明的。
2.屏幕長寬比Aspect ratio
長寬比是屏幕的物理寬度與物理高度的比例關系。應用程序可以通過使用限定的資源來為指定的長寬比提供屏幕布局資源。
3.屏幕分辨率Resolution
在屏幕上顯示的物理像素總和。需要注意的是:盡管分辨率通常用寬x高表示,但分辨率並不意味著具體的屏幕長寬比。
在Andorid系統中,應用程序不直接使用分辨率。
4.密度Density
根據像素分辨率,在屏幕指定物理寬高范圍內能顯示的像素數量。
在同樣的寬高區域,低密度的顯示屏能顯示的像素較少,而高密度的顯示屏則能顯示更多的像素。
屏幕密度非常重要,因為其它條件不變的情況下,一共寬高固定的UI組件(比如一個按鈕)在在低密度的顯示屏上顯得很大, 而在高密度顯示屏上看起來就很小。
為簡單起見,Android把所有的屏幕分辨率也分為四種尺寸:小,普通,大,超大(分別對應:small, normal, large, and extra large).
應用程序可以為這四種尺寸分別提供不同的資源-平台將透明的對資源進行縮放以適配指定的屏幕分辨率。
密度無關的像素( DIP )// 獲取屏幕密度(方法1) int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕寬(像素,如:480px) int screenHeight = getWindowManager().getDefaultDisplay().getHeight(); // 屏幕高(像素,如:800p) Log.e(TAG + " getDefaultDisplay", "screenWidth=" + screenWidth + "; screenHeight=" + screenHeight); // 獲取屏幕密度(方法2) DisplayMetrics dm = new DisplayMetrics(); dm = getResources().getDisplayMetrics(); float density = dm.density; // 屏幕密度(像素比例:0.75/1.0/1.5/2.0) int densityDPI = dm.densityDpi; // 屏幕密度(每寸像素:120/160/240/320) float xdpi = dm.xdpi; float ydpi = dm.ydpi; Log.e(TAG + " DisplayMetrics", "xdpi=" + xdpi + "; ydpi=" + ydpi); Log.e(TAG + " DisplayMetrics", "density=" + density + "; densityDPI=" + densityDPI); screenWidth = dm.widthPixels; // 屏幕寬(像素,如:480px) screenHeight = dm.heightPixels; // 屏幕高(像素,如:800px) Log.e(TAG + " DisplayMetrics(111)", "screenWidth=" + screenWidth + "; screenHeight=" + screenHeight); // 獲取屏幕密度(方法3) dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); density = dm.density; // 屏幕密度(像素比例:0.75/1.0/1.5/2.0) densityDPI = dm.densityDpi; // 屏幕密度(每寸像素:120/160/240/320) xdpi = dm.xdpi; ydpi = dm.ydpi; Log.e(TAG + " DisplayMetrics", "xdpi=" + xdpi + "; ydpi=" + ydpi); Log.e(TAG + " DisplayMetrics", "density=" + density + "; densityDPI=" + densityDPI); int screenWidthDip = dm.widthPixels; // 屏幕寬(dip,如:320dip) int screenHeightDip = dm.heightPixels; // 屏幕寬(dip,如:533dip) Log.e(TAG + " DisplayMetrics(222)", "screenWidthDip=" + screenWidthDip + "; screenHeightDip=" + screenHeightDip); screenWidth = (int)(dm.widthPixels * density + 0.5f); // 屏幕寬(px,如:480px) screenHeight = (int)(dm.heightPixels * density + 0.5f); // 屏幕高(px,如:800px) Log.e(TAG + " DisplayMetrics(222)", "screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);重中之重: density值表示每英寸有多少個顯示點,與分辨率是兩個不同的概念:
Android主要有以下幾種屏:
QVGA和WQVGA屏density=120;
HVGA屏density=160;
WVGA屏density=240;
下面以480dip*800dip的WVGA(density=240)為例,詳細列出不同density下屏幕分辨率信息:
當density=120時 屏幕實際分辨率為240px*400px (兩個點對應一個分辨率)
狀態欄和標題欄高各19px或者25dip
橫屏是屏幕寬度400px 或者800dip,工作區域高度211px或者480dip
豎屏時屏幕寬度240px或者480dip,工作區域高度381px或者775dip
density=160時 屏幕實際分辨率為320px*533px (3個點對應兩個分辨率)
狀態欄和標題欄高個25px或者25dip
橫屏是屏幕寬度533px 或者800dip,工作區域高度295px或者480dip
豎屏時屏幕寬度320px或者480dip,工作區域高度508px或者775dip
density=240時 屏幕實際分辨率為480px*800px (一個點對於一個分辨率)
狀態欄和標題欄高個38px或者25dip
橫屏是屏幕寬度800px 或者800dip,工作區域高度442px或者480dip
豎屏時屏幕寬度480px或者480dip,工作區域高度762px或者775dip
apk的資源包中,當屏幕density=240時使用hdpi標簽的資源
當屏幕density=160時,使用mdpi標簽的資源
當屏幕density=120時,使用ldpi標簽的資源。
不加任何標簽的資源是各種分辨率情況下共用的。
建議:布局時盡量使用單位dip,少使用px。
device independent pixels(設備獨立像素). 不同設備有不同的顯示效果,這個和設備硬件有關,一般我們為了支持WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。
從Android3.0開始,Android SDK提供了Loader技術,使用Loader技術可以很容易進行數據的異步加載。Loader技術為我們提供的核心類有:
一.相關概念(一)基本概念Intent中文意思指”意圖”,按照Android的設計理念,Android使用Intent來封裝程序的”調
Adapter的作用:數據在adapter中做了處理之後,顯示在視圖上 一般的對於ArrayAdapter來說,只需要把一個數組和一個樣式傳遞給ArrayAdapter之
先來看一段代碼: public static void main(String[] args) { new Timer().schedule(new TimerTas