Android 理解像素密度與像素的關(guān)系

Android的手機多種多樣,不同手機的屏幕密度也不同,故在相同物理尺寸下的所包含的像素點是不同的。

開發(fā)使用

在日常開發(fā)中,界面的xml文件中我們使用的是 dp 的單位,但是開發(fā)中使用的Android 的 API 則是 px。對于xml文件,系統(tǒng)在進行界面繪制時,會根據(jù)手機屏幕密度計算出對應(yīng)的像素尺寸,所以我們在編寫代碼需要進行適配,根據(jù)不同手機屏幕的密度設(shè)置像素尺寸。

密度是單位體積的質(zhì)量,所以相同物理尺寸下的屏幕區(qū)域中,密度越大,那么這塊區(qū)域內(nèi)的像素點也就越多。如果在代碼中添了設(shè)計給的像素尺寸,那么在密度大的手機上,實際的顯示效果就會比設(shè)計圖上的小了。

dp與px轉(zhuǎn)換公式

px = dp * (dpi / 160)
dp = px / (dpi / 160)

這個公式的由來是因為,android官方規(guī)定,在dpi為160的設(shè)備下,1dp = 1px,其中 dpi / 160 也稱之為密度。那么在320dpi設(shè)置下,1dp = 2px。

Google的官方文檔給出過解釋,因為第一款 Android 設(shè)備( HTC 的T-Mobile G1)是屬于(注意,是屬于,不是等于)160dpi的,

dp 與 px 轉(zhuǎn)換代碼

public static int dipToPx(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    public static int pxToDip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

在代碼中轉(zhuǎn)換時最后加上了0.5f,Android官方文檔給的解釋是為了向上取整,這樣轉(zhuǎn)換也就更精確

相關(guān)概念

DPI

DPI 全稱為 Dots Per Inch. (Inch的含義是英寸),意思也就是『一英寸內(nèi)點的個數(shù)』。Android 設(shè)備采用 DPI 來表示屏幕的『密度』。DPI 原本是印刷行業(yè)的概念,意思是一英寸內(nèi)有多少個墨點。

PPI

PPI(Pixels Per Inch) 意思是『每英寸內(nèi)的像素數(shù)』,這是通用的概念

屏幕尺寸

手機所說的5.0寸指的是屏幕對角線的長度為5.0英寸。1英寸 = 2.54cm

分辨率

指的是屏幕的像素總數(shù),1920 X 1080 的分辨率指的屏幕是由長為1920個像素點,寬為1080個像素點所組成的長方形區(qū)域。

屏幕密度

可以通過屏幕的長寬算出對角線的長度除以對角線的長度,就可以算出每英寸的屏幕密度

px

px 就是像素 pixel 的縮寫。1px 代表一個顯示設(shè)備中的一個像素點。

dp

DP 或者 DIP 叫做(Density-Independent pixel),Android 中的特有單位,它的大小是由操作系統(tǒng)根據(jù)手機屏幕密度動態(tài)渲染出來的,1dp 對應(yīng)多少 px 在不同的設(shè)備上,可能是不一致的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容