美文网首页
屏幕适配(一)——为什么要适配屏幕

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

作者: 王志强_9380 | 来源:发表于2019-09-26 19:32 被阅读0次

    由于不同厂商,屏幕尺寸不一样,所以要做屏幕适配。
    有人会说,我在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

    <?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>
    

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


    device-2019-09-19-110749.png

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

    相关文章

      网友评论

          本文标题:屏幕适配(一)——为什么要适配屏幕

          本文链接:https://www.haomeiwen.com/subject/bbrructx.html