可能你們都知道,一款app要想適配儘量多的手機,在寫佈局文件的時候都會使用dp來代替px. 若是遇到須要特別處理的則寫在指定文件夾(如:values-sw600dp, values-sw720dp-land)下面的dimens.xml中,可是具體到1dp在屏幕上能顯示多大,一張100*100px的圖片在不一樣文件夾(drawable-xhdpi, drawable-xxhdpi)中能顯示多大,佔用多少內存可能相對較模糊,這篇文章就來說講他們之間的關係javascript
在搞清楚他們的關係以前,仍是先來這幾個名稱的概念php
手機的顯示屏上能容納的像素點。
好比1080*1920(俗稱1080p),就是指橫向能容納1080個像素點,縱向能容納1920個像素點html
是Dots Per Inch的縮寫,翻譯過來就是每英寸(Inch)有多少點。來舉個栗子
java
每種通用的密度都涵蓋的是密度範圍,也就是說2部都是480dpi的手機,其實際的dpi有可能不同.
android![]()
actual_density.png
全部的android開發在定義長寬的時候都在使用dp,那麼dp究竟是什麼呢?
要講清楚這個還得從android歷史開始。
第一代 Android 設備 (T-Mobile G1) 的屏幕是採用的HVGA 屏幕(在 Android 1.6 以前,這是 Android 支持的惟一屏幕配置),這個屏幕上1dp=1px,而且是被歸爲mdpi類型,今後,這個就成爲了android的最初始標準。隨着不一樣廠商的加入,愈來愈多的不一樣dpi設備出現,因而有了下面這個標準express
ldpi | mdpi | hdpi | xhdpi | xxhdpi | xxxhdpi |
---|---|---|---|---|---|
0.75px | 1px | 1.5px | 2px | 3px | 4px |
這是怎麼來的呢?以xxhdpi來講,由於xxhdpi是歸爲480dpi的一類設備,是原始標準160dpi的2.5倍,因此1dp就對應2.5pxapp
T-Mobile G1的硬件參數以下:
屏幕尺寸:3.2 寸(8.1 釐米)
分辨率:320 x 480(HVGA)
計算出dpi = 180.27,因此歸爲mdpi類ide
就是一個view顯示在屏幕上有多大,這個沒什麼好說的.佈局
要記住上面的關係可能很難,還好能夠經過代碼來獲取值,咱們只要記住這幾個值是什麼意思就能夠了。
先來看如何獲取dpipost
float dpi = context.getResources().
getDisplayMetrics().densityDpi;複製代碼
這個值就會是160.0 240.0 320.0這些值.
那如何獲取1dp對應着多少px呢?能夠經過以下方式
float scale = context.getResources().
getDisplayMetrics().density;複製代碼
這個值就是0.75 1.0 1.5這些值。
好比在hdpi上,1dp=1.5px,但這實際上是佔有2個像素的。因此在真正編碼的時候會用如下方式來作轉換
// The gesture threshold expressed in dp (定義的16dp的值)
private static final float GESTURE_THRESHOLD_DP = 16.0f;
// Get the screen's density scalefinal (獲取縮放比例)
float scale = getResources().density;
// Convert the dps to pixels, based on density scale (定義的值 * 比例 + 0.5f)
mGestureThreshold = (int) (GESTURE_THRESHOLD_DP * scale + 0.5f);複製代碼
這裏加0.5是爲了將該數字四捨五入到最接近的整數。
那麼,同一張圖,在不一樣的文件夾,同一個手機上會有什麼表現呢?
以一個144*144px的icon圖標(放在drawable-xxxhdpi目錄下),在xxhdpi密度的手機爲例。用以下代碼進行測試
//imageView都是wrap_content屬性, src=144*144px的icon圖標
ImageView imageView = (ImageView)findViewById(R.id.img);
imageView.post(new Runnable() {
@Override
public void run() {
Log.i("hly", "img: " + imageView.getWidth() + " " + imageView.getHeight());
}
});複製代碼
這裏直接給出答案: 108px 【144 * (480 / 640)】
根據該文能夠得出,計算公式是:
最終顯示像素 = 原始像素 * (顯示設備dpi / 放置文件夾對應dpi)複製代碼
這也就是若是對應文件夾裏面沒有圖片的時候,顯示默認圖片大小不一致的緣由。
也沒啥好總結的了,想要熟悉這些關係,須要先記住基準尺寸mdpi- 160dpi。
以上
歡迎關注公衆號