由于不同厂商,屏幕尺寸不一样,所以要做屏幕适配。
有人会说,我在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;
//省略
}
我们拿几个机器来看一下

我们获取一下屏幕的参数和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来设计的,需要一个红色方块占据屏幕一半,效果如下:

我们在布局中设置一个540dp的TextView
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#2200ffff">
<TextView
android:layout_width="540dp"
android:layout_height="540dp"
android:background="#f00"/>
</android.support.constraint.ConstraintLayout>
然后在各机器中运行一下,看效果:

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