Android 的度量單位 dp sp px DPI

1 篇文章 / 0 new
author
Android 的度量單位 dp sp px DPI
android 使用單位不在僅以 pixel 為主, 這樣的好處是容易自我調整顯示的尺寸
  • Android上常見度量單位:
px(像素):屏幕上的點,絕對長度,與硬體相關。
in(英寸):長度單位。
mm(毫米):長度單位。
pt(磅):1/72英寸,point。
dp(與密度無關的像素):一種基於屏幕密度的抽象單位。 在每英寸160點的顯示器上,1dp = 1px。
dip:Density-independent pixel,同dp相同。
sp:在dp的基礎上,還與比例無關,個人理解為是一個矢量圖形單位。
引入dp/dip的原因:
過 去,程序員通常以像素為單位設計計算機用戶界面。 例如,定義一個寬度為300像素的表單字段,列之間的間距為5個像素,圖標大小為16×16像素等。 這樣處理的問題在於,如果在一個每英寸點數(dpi)更高的新顯示器上運行該程序,則用戶界面會顯得很小。 在有些情況 ​​下,用戶界面可能會小到難以看清內容。 與分辨率無關的度量單位可以解決這一問題。
  • 如何計算密度
  1. 1.標準是240*320畫在1.5*2平方inch上。 那麼像每平方英寸有240*320/(1.5*2)=25600點,也就是一平方英寸的像素點為25600,所以dpi取為它的平方根160;如果你的dpi是120,那麼它的密度就是0.75.
  2. 密度不只是與width有關,還與height有關,所以不管width是1.8還是1.3,它的密度都有可能是1;比如width是1.8,只要它的 height是3/1.8的話,如果pixel為240 *320的話,它的密度仍舊是1;同樣如果width為1.3,只要它的height為3/1.3的話,像素點為240*320,則密度也是1.
  3. 320*480/(1.5*2)得到單位平方英寸的點為51200,所以單位平方英寸是240*320畫在1.5*2屏幕的2倍。 但是這是平方英寸啊,算密度的時候要開平方的啊,所以應該是2開平方,是1.414吧,大緻密度為1.5。
  • 如何做到與密度無關:
如 果屏幕密度為160,這時dp和sp和px是一樣的。 1dp=1sp=1px,但如果使用px作單位,如果屏幕大小不變(假設還是3.2寸),而屏幕密度變成了320。 那麼原來TextView的寬度設成160px,在密度為320的3.2寸屏幕裡看要比在密度為160的3.2寸屏幕上看短了一半。 但如果設置成160dp或160sp的話。 系統會自動將width屬性值設置成320px的。 也就是160 * 320 / 160。 其中320 / 160可稱為密度比例因子。 也就是說,如果使用dp和sp,系統會根據屏幕密度的變化自動進行轉換。 官方文檔總結的計算公式為:pixels = dps * (density /160).
  • 屏幕尺寸Screen size
即顯示屏幕的實際大小,按照屏幕的對角線進行測量, (比如2.8寸, 3.5寸)。 為簡單起見,Android把所有的屏幕大小分為四種尺寸:小,普通,大,超大(分別對應:small, normal, large, extra large).   應用程序可以為這四種尺寸分別提供不同的自定義屏幕佈局-平台將根據屏幕實際尺寸選擇對應佈局進行渲染,這種選擇對於程序側是透明的。 系統會負責把你的佈局方案以合適的方式渲染到對應的屏幕上,這個過程是不需要程序員用代碼來干預的。
  • 屏幕長寬比 Aspect ratio
長寬比是屏幕的物理寬度與物理高度的比例關係。 應用程序可以通過使用限定的資源來為指定的長寬比提供屏幕佈局資源。 只需要用系統提供的資源分類符long和notlong。
  • 分辨率 Resolution
在屏幕上顯示的物理像素總和。 例如320*480。 需要注意的是:儘管分辨率通常用寬x高表示,但分辨率並不意味著具體的屏幕長寬比。 在Andorid系統中,應用程序不直接使用分辨率。  
  • 密度Density
在單位屏幕面積上能顯示的像素數量。 在同樣的寬高區域,低密度的顯示屏能顯示的像素較少,而高密度的顯示屏則能顯示更多的像素。 屏幕密度非常重要,因為其它條件不變的情況下,一個寬高固定(這裡寬高應是指的像素)的UI組件(比如一個按鈕)在在低密度的顯示屏上顯得很大,而在高密度顯示屏上看起來就很小。 為簡單起見,Android把所有的屏幕分辨率也分為四種尺寸:小,普通,大,超大(分別對應:small, normal, large, and extra large).   應用程序可以為這四種尺寸分別提供不同的資源,平台將透明的對資源進行縮放以適配指定的屏幕分辨率。
  • 密度無關的像素(DIP)通設備獨立像素Density-independent pixel (dp)
應用程序可以用來定義UI組件的虛擬像素單元,通過密度無關的方式來描述佈局尺寸和位置。   一個設備獨立像素相當於一個160 dpi屏幕上的物理像素。   在程序運行時,系統根據屏幕的實際密度透明的處理任何需要縮放的設備獨立像素單元,設備獨立像素轉換成屏幕實際像素的換算很簡單:pixels = dps * (density / 160).  
例如在240 dpi的屏幕上,1個設備獨立像素等於1.5物理像素.為確保UI組件在不同的屏幕都能合適的展示,強烈建議使用設備獨立像素單元來定義你的應用程序UI。  
四種屏幕尺寸分類:: small, normal, large, and xlarge  
四種密度分類: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)  
需要注意的是: xhdpi是從Android 2.2 (API Level 8)才開始增加的分類.  
xlarge是從Android 2.3 (API Level 9)才開始增加的分類.   一般情況下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。
強烈推薦你用DIP來定義你程序的界面佈局,因為這樣可以保證你的UI在各種分辨率的屏幕上都可以正常顯示。
  • DPI是“dot per inch”的縮寫,每英寸像素數。兩種獲取屏幕分辨率信息的方法:
DisplayMetrics metrics = new DisplayMetrics();
Display display = activity.getWindowManager().getDefaultDisplay();
display.getMetrics(metrics);
//這裡得到的像素值是設備獨立像素dp
//DisplayMetrics metrics=activity.getResources().getDisplayMetrics();這樣獲得的參數信息不正確,不要使用這種方式。
//不能使用android.content.res.Resources.getSystem().getDisplayMetrics()。 這個得到的寬和高是空的。
  • 如果需要為Android pad定制資源文件,則res目錄下的目錄可能為:
drawable
drawable-ldpi
drawable-mdpi
drawable-hdpi
drawable-xhdpi
drawable-nodpi
drawable-nodpi-1024×600
drawable-nodpi-1280×800
drawable-nodpi-800×480
values
values-ldpi
values-mdpi
values-hdpi
values-xhdpi
values-nodpi
values-nodpi-1024×600
values-nodpi-1280×800
values-nodpi-800×480
private void initResolutionStr(Context context) {
    if (ApiConfig.getResolutionStr() == null || ApiConfig.getResolutionStr().equals("")) {
        WindowManager winMgr = (WindowManager) context.getApplicationContext()
                .getSystemService(Context.WINDOW_SERVICE);
        Display display = winMgr.getDefaultDisplay();
 
        int height = display.getHeight();
        int width = display.getWidth();
        String resolution = height > width ? height+"x"+width : width+"x"+height;
 
        ApiConfig.setResolutionStr(resolution);
        // densityDpi = 120dpi is ldpi, densityDpi = 160dpi is mdpi,
        // densityDpi = 240dpi is hdpi, densityDpi = 320dpi is xhdpi
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
 
        int densityDpi = dm.densityDpi;
        ApiConfig.setDensityDpi(densityDpi);
    }
}
   
如果需要為Android pad定制資源文件,則res目錄下的目錄可能為:
drawabledrawable-ldpi
drawable-mdpi
drawable-hdpi
drawable-xhdpi
drawable-nodpi
drawable-nodpi-1024×600
drawable-nodpi-1280×800
drawable-nodpi-800×480
values
values-ldpivalues-mdpi
values-hdpivalues-xhdpi
values-nodpi
values-nodpi-1024×600
values-nodpi-1280×800
values-nodpi-800×480
Free Web Hosting