什么是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×3201201dp=0.75px3
中密度(mdpi)320×4801601dp=1px4
高密度(hdpi)480×8002401dp=1.5px6
超高密度(xhdpi)720×12803201dp=2px8
超超高密度(xxhdpi)1080×19204801dp=3px12
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()
}
}