Android开发

Android中的dp

2018-01-15  本文已影响54人  呼吸的蜗牛

在Android开发中,我们在描述View的宽、高时通常使用dp,但是设计在UI中进行标注时,却使用的是px。所以很多时候就导致UI和实际效果不一致。史记开发中,给设计和开发人员带来了很多困扰。

在回答上面的问题之前,我们需要了解Android上一些基本概念:

  1. dp是什么?

    dp是Android中的计量单位,主要是是用来标注控件的宽、高。它是一种基于像素密度的抽象单位,在每英寸160点的显示器上1dp=1px。

  2. Android为什么要引入dp,为什么不可以直接用px?

    由于,不同的手机使用的屏幕像素密度(每英寸屏幕上拥有的像素点)不一致,如果都使用px进行计量,就会导致同一个控件在不同的手机上,所表现出来的差异极大。

image

可以看到,如果不用dp进行转换,同样一个布局,在不同的手机上差异巨大,甚至有可能导致布局错乱,这样对普通用户的使用体验极差。而使用dp就基本不会出现这 种情况,因为Android系统已经帮我们进行了适配。

  1. dp和px的关系,以及实际开发中该怎么转换?

    先看一个公式:<code>px=dp * (dpi/160)</code>,这里的dpi就是我们上面提到的像素密度,至于为什么是除以160,可以查看知乎上的问题为什么 px=dp*(dpi/160),看到这里,我们就明白为什么每英寸160个像素点的时候1dp=1px了。在实际开发中我们不需要这么计算,因为<code>(dpi/160)</code>这一步Android系统已经帮我们计算好了,所以我们可以通过以下的方式对px和dp进行转换:

  /**
     * dp转换px
     */
    private fun dp2px(context: Context, dpValue: Float): Float {
        return context.resources.displayMetrics.density * dpValue
    }

    /**
     * px转换dp
     */
    private fun px2dp(context: Context, pxValue: Float): Float {
        return pxValue / context.resources.displayMetrics.density
    }
  1. 补充:

    像素密度和屏幕的关系:

    QVGA(240*320)   density=120  
    WQVGA(240*400)  density=120  
    HVGA(320*480)   density=160  
    WVGA(480*800)   density=240  
    WXGA(1280*720)  density=320
    WUXGA(1920*1200)density=480
    QXGA(2018*1536) density=640
    

    不同像素密度对应的drawable文件夹

    drawable-ldpi:  屏幕密度为120的手机设备
    
    drawable-mdpi:  屏幕密度为160的手机设备
    
    drawable-hdpi:  屏幕密度为240的手机设备
    
    drawable-xhdpi: 屏幕密度为320的手机设备
    
    drawable-xxhdpi:屏幕密度为480的手机设备
    
上一篇下一篇

猜你喜欢

热点阅读