android 度量單位 dp sp px DPI

術語和概念 android

  • 屏幕尺寸 Screen size程序員

即顯示屏幕的實際大小,按照屏幕的對角線進行測量,(好比 2.8寸, 3.5寸)。爲簡單起見,Android把全部的屏幕大小分爲四種尺寸:小,普通,大,超大(分別對應:small, normal, large, extra large). 應用程序能夠爲這四種尺寸分別提供不一樣的自定義屏幕布局-平臺將根據屏幕實際尺寸選擇對應佈局進行渲染,這種選擇對於程序側是透明的。 系統會負責把你的佈局方案以合適的方式渲染到對應的屏幕上,這個過程是不須要程序員用代碼來干預的。
佈局

  • 屏幕長寬比 Aspect ratiospa

長寬比是屏幕的物理寬度與物理高度的比例關係。應用程序能夠經過使用限定的資源來爲指定的長寬比提供屏幕布局資源。只須要用系統提供的資源分類符long和 notlong。
設計

  • 分辨率 Resolutionorm

在屏幕上顯示的物理像素總和。例如 320*480。須要注意的是:儘管分辨率一般用寬x高表示,但分辨率並不意味着具體的屏幕長寬比。在Andorid系統中,應用程序不直接使用分辨率。 
ip

  • 密度  Density資源

在單位屏幕面積上能顯示的像素數量。在一樣的寬高區域,低密度的顯示屏能顯示的像素較少,而高密度的顯示屏則能顯示更多的像素。屏幕密度很是重要,由於其它條件不變的狀況下,一個寬高固定(這裏寬高應是指的像素)的UI組件(好比一個按鈕)在在低密度的顯示屏上顯得很大, 而在高密度顯示屏上看起來就很小。爲簡單起見,Android把全部的屏幕分辨率也分爲四種尺寸:小,普通,大,超大(分別對應:small, normal, large, and extra large). 應用程序能夠爲這四種尺寸分別提供不一樣的資源,平臺將透明的對資源進行縮放以適配指定的屏幕分辨率。
文檔

  • 密度無關的像素(DIP)通設備獨立像素Density-independent pixel (dp)get

應用程序能夠用來定義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-ldpidrawable-mdpidrawable-hdpidrawable-xhdpidrawable-nodpidrawable-nodpi-1024×600drawable-nodpi-1280×800drawable-nodpi-800×480valuesvalues-ldpivalues-mdpivalues-hdpivalues-xhdpivalues-nodpivalues-nodpi-1024×600values-nodpi-1280×800values-nodpi-800×480Android上常見度量單位:
  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.標準是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).

相關文章
相關標籤/搜索