屏幕适配(一)——为什么要适配屏幕

由于不同厂商,屏幕尺寸不一样,所以要做屏幕适配。
有人会说,我在xml布局里都用dp,那不就是适配了屏幕吗?我们来看一下机器里是如何给我们做适配的

//TypedValue.java
public static float applyDimension(int unit, float value,
                                       DisplayMetrics metrics)
{
    switch (unit) {
    case COMPLEX_UNIT_PX:
        return value;
    case COMPLEX_UNIT_DIP:
        return value * metrics.density;
    case COMPLEX_UNIT_SP:
        return value * metrics.scaledDensity;
    case COMPLEX_UNIT_PT:
        return value * metrics.xdpi * (1.0f/72);
    case COMPLEX_UNIT_IN:
        return value * metrics.xdpi;
    case COMPLEX_UNIT_MM:
        return value * metrics.xdpi * (1.0f/25.4f);
    }
    return 0;
}

我们可以看到,在系统里面,不管是dip、sp、pt,最终都是转换为px(像素)来用。
我们看到有个值density,这个值的意思是:每个dp占有多少个像素点,那么这个值是怎么来的呢,我们来看一下是怎么计算得到的。
假设屏幕的尺寸是6英寸,分辨率是1920*1080,那么得到对角线上的分辨率为2203,除以屏幕尺寸,得到densityDpi=367,这个值表示的是每英寸有多少个像素点,用densityDpi再除以基准值160,得到2.295,这个值就是density。而实际上,我们从机器了得到的这个值一般不会是这个,因为系统里面有给出一些参考值,我们可以看一下

public class DisplayMetrics {

    public static final int DENSITY_LOW = 120;

    public static final int DENSITY_MEDIUM = 160;

    public static final int DENSITY_TV = 213;

    public static final int DENSITY_HIGH = 240;

    public static final int DENSITY_260 = 260;

    public static final int DENSITY_280 = 280;

    public static final int DENSITY_300 = 300;

    public static final int DENSITY_XHIGH = 320;

    public static final int DENSITY_340 = 340;

    public static final int DENSITY_360 = 360;

    public static final int DENSITY_400 = 400;

    public static final int DENSITY_420 = 420;

    public static final int DENSITY_440 = 440;

    public static final int DENSITY_XXHIGH = 480;

    public static final int DENSITY_560 = 560;

    public static final int DENSITY_XXXHIGH = 640;
    //省略
}

我们拿几个机器来看一下


IMG_20190919_114817.png

我们获取一下屏幕的参数和densityDpi以及density

机器 尺寸(英寸) widthPixels heightPixels 对角线 计算出的densityDpi densityDpi density
机器A 10.5 1920 1200 2264 215.6 240 1.5
机器B 8 1280 800 1509 188.6 160 1.0
机器C 10 1280 800 1509 150.9 160 1.0
机器D 6 2160 1080 2415 402.5 420 2.625

上面的表中可以看到,系统中设定的densityDpi 和计算出来的densityDpi 是比较接近的。

我们看一下,同样的dp值在每个机器上的表现是什么
假设美工给我们一套图,是根据mdip来设计的,需要一个红色方块占据屏幕一半,效果如下:


eff4fd519047dd45bd3ed515691c4326.png

我们在布局中设置一个540dp的TextView




    

然后在各机器中运行一下,看效果:


device-2019-09-19-110749.png

可以看到,并没有达到想要的结果,在机器尺寸各异的情况下。在xml布局里面使用dp,并不能实现屏幕适配。

你可能感兴趣的:(屏幕适配(一)——为什么要适配屏幕)