一、基本概念

px(像素):,这是我们手机上能显示的最小物理单位,你可以把它理解为一个个点。

分辨率:我们买手机的时候,经常会听到分辨率这个词,它表示的是长和宽方向上分别有多少个像素点,例如2340×1080,就表示手机宽方向有1080个像素点,高方向有2340个像素点

手机尺寸:这个是以英寸作为单位的,表示的是你手机的对角线长是多少英寸的

dpi(像素密度):表示的是一英寸有多少个像素点

dp官方定义的dp是:当你的手机的dpi是160dpi时,1dp=1px,这样一看好像很难懂,安卓使用这个单位,其实是为了让他的组件可以更好地适配各种不同的屏幕。你可以先理解为,官方定义了一个标准,一英寸等于160dp。

最短宽度dp最短宽度是指你的设备中最短的那一条边有多少dp,对于手机来说,就是宽,对于横屏的平板来说就是他的高。

假设现在有一个平板的分辨率是1600×900,dpi是240,求他的最短宽短dp。那我们要求的肯定是900这条边的dp值,问题是现在900使用的单位是px,我们怎么求得他的dp值呢?
形象比如一下:现在有900个人(宽900px),每240个人一组(dpi=240,即一英寸有240个px),每个组可以分的160个dp(即上面说到的标准,一英寸等于160dp),求所有组分到的dp的和。一共有900/240=3.75个组,每个组可以分得160个dp,那么3.75个组一共可以分得3.75*160=600个dp,所以900px的屏幕宽至此求得他的dp长度是600dp。

二、手机和平板的适配

现在我们在app/src/res目录下新建一个名为layout-sw600dp的文件夹,sw的意思就是最短宽度shortest width,安卓的适配方案是最短宽度dp适配方案,默认使用的XML文件夹是app/src/main/res/layout/xxx.xml当安卓检测到登录设备的最短边是600dp时,则使用app/src/main/res/layout-sw600dp文件夹中的文件。如果没有对应的文件,则使用默认文件夹中的文件。

知道这样的话那就好办了。假设现在有一个登录界面activity_main.xml,那么你就可以将这个XML文件,复制到app/src/main/res/layout-sw600dp下,然后设计你想要的另外一种布局就可以了。这样当你在600dp的的平板上登录时,安卓就会自动使用app/src/main/res/layout-sw600dp这个目录下的activity_main.xml文件了。

现在使用模拟器构建出一个平板,经过计算他的最短边的dp值就是600d,这里应该使用900这个条边来算。
在这里插入图片描述
app/src/main/res/layout/activity_main.xml中设置手机登录的布局
在这里插入图片描述
app/src/main/res/layout-sw600dp/activity_main.xml中设置平板登录布局。
在这里插入图片描述
在手机上的运行效果:
在这里插入图片描述
在平板上的运行效果:
在这里插入图片描述

三、不同尺寸的手机之间的适配

1、先看个例子,左边这个手机的宽度是360dp,右边这个手机的宽度是720dp,虽然他们的宽的都是1080px,可是他们的dpi不同,左边这个是480dpi,右边这个是240dpi。
2、为了避免刚才的影响,先把刚才建的app/src/main/res/layout-sw600dp文件夹删掉,不然的话,两个手机的布局可能会出现不一样。
3、设计时设计的登录按钮是360dp,如果在360dp的手机登录时,他应该是铺满的,在720dp的手机登录时,则会只占了屏幕的一半,这显然不是我们想要的结果,如下图:
在这里插入图片描述
解决的方法和在平板上做适配类似,我们先在app/src/main/res/values中新建一个名为dimens.xml的文件,然后在里面写上我们经常用到的一些尺寸,如图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/c6f0731080d347d985dbb0f27279b0c4.png
然后在我们的布局中使用这些尺寸元素,如图
在这里插入图片描述

新建一个文件夹叫app/src/main/res/values-sw720dp的文件夹,然后将刚才新建的dimens.xml复制一份到该文件夹中,然后我们修改一下name=“dp360”的值,把360dp改成720dp。当安卓检测到设备是在720dp的设备上登录的时候,就会使用app/src/main/res/values-sw720dp这个文件夹中的尺寸了。即如图:
在这里插入图片描述
下面是适配后的效果图(我只做了宽度的适配):
在这里插入图片描述

四、使用自动生成工具ScreenMatch插件

1.下载ScreenMatch插件

在Android Studio中点击File->Settings->Plugins,在搜索框搜索ScreenMatch
在这里插入图片描述

2.生成配置文件

右键app文件夹,选择ScreenMatch
在这里插入图片描述
在这里插入图片描述

3.拷贝样板尺寸文件

配置完之后,在gradle文件下会多出两个文件夹,第一个是配置文件夹,第二个是尺寸文件夹,将screenMatch_example_dimens.xml文件夹复制到app/src/main/res/values文件夹中,并重命名为dimens.xml
在这里插入图片描述

4.配置适配手机的dp值

打开screenMatch.properties文件夹,我们只需要配置三个常用的属性就好
base_dp: 这个属性是问你,你开发的软件所正常运行的设备的最小宽度dp值是多少,即不需要适配的那个设备的最小宽度dp值是多少,由于我设计是按照360设计的,所以这里我取360
match_dp:这个属性是问你,你需要适配的设备的最小宽度dp值是多少,对于我刚才的例子来说,就是720.如果你不设置,插件作者也会帮你设置了几个默认值,如果默认值里没有你想要的,你可以自己加,多个值之间用英文逗号间隔,如图
在这里插入图片描述
ignore_dp这个属性是问你,你不需要适配的最小宽度dp值是多少。由于每一个适配值,即match_dp,插件都会帮你在app/src/main/res目录下生成一个适配文件夹,如图
在这里插入图片描述
但是很多时候,我们不需要适配那么多的设备,也不想在项目中生成这么多的文件夹,所以我一般会把match_dp属性中那些我用不上的默认值,写在这里,让插件不要生成。配置完之后,我们再执行一次步骤2,就可以看到新生成的适配文件夹了,每次配置完之后,记得都要生成一下。

值得注意的是,安卓采用的是最接近适配,如果你不去掉240,320这两个适配尺寸的话,那么如果程序运行在360dp的设备下,安卓会优先去找values-sw360dp的文件夹,没有的话,就会去适配values-sw360dp这个文件夹中的尺寸了,如果没有相近的,才会使用默认文件夹中的尺寸。所以我为了程序运行在360dp的设备时,使用的是默认values文件夹中的尺寸时,我会把这两个值去掉。

5、成功示例

在开发的时候,只需要使用像这样使用尺寸即可,碰到没有的尺寸,在app/src/main/res/values/dimens.xml文件中添加就好,然后在运行前执行步骤2适配一下,这样在对应的文件夹下也会出现你所添加的尺寸的适配尺寸。
在这里插入图片描述

五、获取设备的最小宽度dp

在类中定义该函数,然后调用,就会显示出当前运行设备的dp值和分辨率等

private void getScreenSize(){
        //获取屏幕分辨率
        DisplayMetrics metric=new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metric);

        int width=metric.widthPixels; // 宽度(PX)
        int height=metric.heightPixels; // 高度(PX)

        float density=metric.density; // 密度(0.75 / 1.0 / 1.5)
        int densityDpi=metric.densityDpi; // 密度DPI(120 / 160 / 240)

        //屏幕宽度算法:屏幕宽度(像素)/屏幕密度
        int screenWidth = (int) (width/density);//屏幕宽度(dp)
        int screenHeight = (int)(height/density);//屏幕高度(dp)

        String a = "宽度:" + width + " 高度:" + height + " 密度:" + density + " 密度DPI:" + densityDpi
                + "\r\n屏幕dp宽度:" + screenWidth + " 屏幕dp高度:" + screenHeight;
        Toast.makeText(MainActivity.this, a, Toast.LENGTH_LONG).show();
    }
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐