dp与px的转换对照表

什么是dp

  • 含义:density-independent pixel,叫dp或dip,与终端上的实际物理像素点无关。
  • 单位:dp,可以保证在不同屏幕像素密度的设备上显示相同的效果
    1. Android开发时用dp而不是px单位设置图片大小,是Android特有的单位
    2. 场景:假如同样都是画一条长度是屏幕一半的线,如果使用px作为计量单位,那么在480×800分辨率手机上设置应为240px;在320×480的手机上应设置为160px,二者设置就不同了;如果使用dp为单位,在这两种分辨率下,160dp都显示为屏幕一半的长度。

换算的基本公式

dp = (width in pixels * 160) / screen density

在Android中,规定以160dpi(即屏幕分辨率为320×480)为基准:1dp=1px

密度类型 代表的分辨率(px) 屏幕密度(dpi) 换算(px/dp) 比例
低密度(ldpi) 240×320 120 1dp=0.75px 3
中密度(mdpi) 320×480 160 1dp=1px 4
高密度(hdpi) 480×800 240 1dp=1.5px 6
超高密度(xhdpi) 720×1280 320 1dp=2px 8
超超高密度(xxhdpi) 1080×1920 480 1dp=3px 12

getResources().getDisplayMetrics().densityDpi 就是屏幕密度。
getResources().getDisplayMetrics().density 也可以理解为1dip相当于多少个px啦。

dp是虚拟像素,在不同的像素密度的设备上会自动适配,比如:
dpi 为160,  1dp = 1px
dpi是240,1dp = 1.5px

Java 计算代码

public class ui {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        double dp = getPixelsToDp(1920,480);
        System.out.println("result:"+dp);
    }

    private static double getPixelsToDp(int pixels,int density){
        return (pixels*160)/density;
    }
}

分辨率 :320 * 480
宽的dp:widthDp = ( 320 * 160 ) / 160 = 320
高的dp:widthDp = ( 480 * 160 ) / 160 = 480

分辨率 :480 * 800
宽的dp:widthDp = ( 480 * 160 ) / 240 = 320
高的dp:widthDp = ( 800 * 160 ) / 240 = 533

分辨率 :720 * 1280
宽的dp:widthDp = ( 720 * 160 ) / 320 = 360
高的dp:widthDp = ( 1280 * 160 ) / 320 = 640

分辨率 :1080 * 1920
宽的dp:widthDp = ( 1080 * 160 ) / 480 = 360
高的dp:widthDp =( 1920 * 160 ) / 480 = 640

dp,px 互相转换

 Android 的 kotlin dp,px 互相转换的代码

  object ScreenUtil {
        /**
         * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
         */
        fun dp2px(context: Context, dpValue: Float): Int {
            val scale = context.resources.displayMetrics.density
            return (dpValue * scale + 0.5f).toInt()
        }

        /**
         * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
         */
        fun px2dp(context: Context, pxValue: Float): Int {
            val scale = context.resources.displayMetrics.density
            return (pxValue / scale + 0.5f).toInt()
        }
    }

扩展阅读:http://www.ui.cn/detail/343460.html