使用最小宽度(Smallest-width)完成屏幕适配

一、关于px、dpi、dp的概念

1、px:px表示手机的像素,通常我们所说的手机分辨率1920x1080,实际上指的就是手机高有1920个像素,宽有1080个像素。

2、dpi:dpi即像素密度(Dots Per Inch),表示每英寸(1英寸=2.54cm)内有多少个像素。手机画面是否清晰就是由dpi决定的,这里以分辨率为1920x1080的手机为例,如果手机是5英寸的,那手机画面自然清晰,如果手机是100英寸的呢,那此时你看到的应该是一个个的各种颜色的方格了。

关于dpi和px的关系用公式表示可以写成:dpi = px/inch (inch表示英寸),假设有一部手机,屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算出在这部手机的屏幕上,每英寸包含的像素点的数量为240/1.5=160dpi(横向)或320/2=160dpi(纵向),160dpi就是这部手机的像素密度。来个一目了然的图吧:
使用最小宽度(Smallest-width)完成屏幕适配_第1张图片

3、dp:当手机每英寸内有160个像素时,1dp=1px。我们以160dpi为基准,那么在240dpi的手机上,1dp = 240/160 = 1.5px。于是我们可以得出:dp = dpi/160

二、适配原理:

我们先声明多套包含dimens.xml文件的values-swdp 文件夹,在不同设备上运行时,app会根据设备的最小宽度(Smallest-width)来找对应的values-swdp 文件夹,如果系统根据当前设备屏幕的最小宽度没找到对应的 values-swdp 文件夹,则会去寻找与其最小宽度最相近且小于或等于当前设备最小宽度的 values-swdp 文件夹。

关于最小宽度这里说明一下:最小宽度是不区分方向的,即无论是宽度还是高度,哪一边小就认为哪一边是最小宽度。所以如果当前设备最小宽度(以 dp 为单位)为400dp,那么系统会自动找到对应的values-sw400dp文件夹下的dimens.xml文件。

获取最小宽度代码:

//获取手机最小宽度
    private float getSmallestWidthDp() {
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        int heightPx = dm.heightPixels;//手机高的像素值
        int widthPx = dm.widthPixels;//手机宽的像素值
        float density = dm.density;
        float heightDp = heightPx / density;//手机高的dp值
        float widthDp = widthPx / density;//手机宽的dp值
        return widthDp < heightDp ? widthDp : heightDp;
    }

三、适配步骤

1、安装ScreenMatch插件,用于自动生成需要适配设备对应的dimens.xml文件,已经安装可以跳过。

2、将ScreenMatch插件生成的screenMatch_example_dimens.xml文件中的内容拷贝到baselib模块(项目公共模块,其余模块都要依赖此模块)的values目录下的dimens.xml文件里。

3、修改screenMatch.properties文件参数配置:根据UI的设计图修改的base_dp的值,根据要是适配的最小宽度修改match_dp的值,match_module的值改为baselib

4、替换dp、sp:
android:layout_width=“50dp” 改为:android:layout_width="@dimen/dp_50"
android:textSize=“16sp” 改为:android:layout_width="@dimen/sp_16"

参考:https://mp.weixin.qq.com/s/AtTTLK7Lf-uSLFt6kovQRg

你可能感兴趣的:(android)