dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算

一、基本概念

  • dip : Density independent pixels ,设备无关像素
  • dp :就是dip
  • px : 像素
  • dpi :dots per inch , 直接来说就是一英寸多少个像素点。常见取值 120,160,240。我一般称作像素密度,简称密度
  • density : 直接翻译的话貌似叫 密度。常见取值 1.5 , 1.0 。和标准dpi的比例(dpi / 160)
  • 分辨率 : 横纵2个方向的像素点的数量,常见取值 480X800 ,320X480
  • 屏幕尺寸: 屏幕对角线的长度。电脑电视同理
  • 屏幕比例的问题。因为只确定了对角线长,2边长度还不一定。所以有了4:3、16:9这种,这样就可以算出屏幕边长了

2. 获取 dpi 与 density

        DisplayMetrics metric = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metric);
        int width = metric.widthPixels;  // 屏幕宽度(像素)
        int height = metric.heightPixels;  // 屏幕高度(像素)
        float density = metric.density;  // 屏幕密度(0.75 / 1.0 / 1.5)
        int densityDpi = metric.densityDpi;  // 屏幕密度DPI(120 / 160 / 240)

densityDpi : 就是我们常说的dpi。

density : 其实是 DPI / 160(像素/英寸) 后得到的值。是不是有点奇怪,因为我带了单位。。。这个涉及到后面一个比较重要的东西,后面再说。

从上面就看得出了,DPI 本身的单位也是 像素/英寸,所以density其实是没单位的,他就是一个比例值

而dpi的单位是 像素/英寸,比较符合物理上面的密度定义,密度不都是单位度量的值么,所以我更喜欢把dpi叫像素密度,简称密度,density还是就叫density。

3. 各单位间转换

3.1 计算 dpi

比如一个机器,屏幕4寸(对角线长度),分辨率480X800,他的dpi能算么


    /**
     * E.g: 480*800分辨率,屏幕大小为4.0英寸 
     * @param width 480
     * @param height 800
     * @param inch 4.0
     * @return dpi
     */
    public static double calculateDpi(int width,int height,double inch){
        double diagonal = Math.sqrt(width * width + height * height);
        return diagonal / inch;
    }

顺带说下,android默认的只有3个dpi,low、medium和high,对应 120、160、240,如果没有特别设置,所有的dpi都会被算成这3个,Android中density 设置的代码,其中的default就是160

3.2 计算 dp 与 px

我们写布局的时候,肯定还是要知道1个dp到底有多少px

  换算公式如下: dp = (DPI / 160(像素/英寸))px = density px

  注意,这里都是带单位的。px是单位,dp是单位,density没单位。

  为了方便,假设dpi是480 像素/英寸 , 那么density就是 3.0

  那么就是 dp=3 px ,注意这是带了单位的,也就是 dp(设备无关像素) = density 像素

  那么转换为数值计算的话,应该是下面这个式子

  dp = density * px

4. 为什么我们在布局的时候最好要用dip,不要用px?

是因为这个世界上存在着很多不同屏幕密度的手机,屏幕密度是什么?就是dpi,就是单位长度里的像素数量

想象一下,如果这些手机的尺寸一样,屏幕密度相差很大,那么是不是说一个手机水平方向上像素很少,另一个手机水平方向上像素很多?那我们画同样pix数量的时候,它显示的长度不就会不一样了?

比如下面图中的两个手机,同时设置2px长度的Button,在屏幕密度较高的手机里就会显示的比较小。

而同时设置的2dip长度的Button,在两个手机上显示的大小是一样的

这里写图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值