什么是dp
- 含义:density-independent pixel,叫dp或dip,与终端上的实际物理像素点无关。
- 单位:dp,可以保证在不同屏幕像素密度的设备上显示相同的效果
- Android开发时用dp而不是px单位设置图片大小,是Android特有的单位
- 场景:假如同样都是画一条长度是屏幕一半的线,如果使用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() } }