美文网首页
Android屏幕适配

Android屏幕适配

作者: 小阿飞的小蝴蝶 | 来源:发表于2022-11-07 16:41 被阅读0次

    参考:https://zhuanlan.zhihu.com/p/144487134

    屏幕适配图.png

    标准屏幕像素密度(mdpi): 每英寸长度上有160个像素点(160dpi),即称为标准屏幕像素密度(mdpi)。

    1英寸 = 1.54cm

    逻辑密度:density = (dpi / 160)

    dp 与 px 的转换:px = dp * density

    常见的屏幕尺寸有2.4、2.8、3.5、3.7、4.2、5.0、5.5、6.0等


    屏幕密度公式.png

    为什么要屏幕适配?

    Android开发时用dp而不是px单位设置图片大小,是Android特有的单位。

    场景:假如同样都是画一条长度是屏幕一半的线,如果使用 px 作为计量单位,那么 480x800 分辨率手机上设置应为240px ;在 320x480 的手机上应设置为 160px ,二者设置就不同了;如果使用 dp为单位,在这两种分辨率下, 160dp 都显示为屏幕一半的长度。
    480x800px ---------------------- 320x480
    1dp = 1.5px ---------------------- 1dp = 1px
    可得:
    160dp = 240px------------------------ 160dp = 160px

    由上可知,Google已经给我们developer提供了dp可以做到屏幕适配了,为什么还会在其他手机上不能完全满足显示效果呢?
    我们通过px = dp * density可以看出如果手机厂商不按照Google提供的标准来,as: 1080 * 1920 的设备dpi 应该是480dpi,但是手机厂商的设计的手机尺寸确是5英寸。那么最终得到的dpi约等于440dpi, 440dpi!=480dpi,dp就肯定不一样了。
    [(1080 * 1080 + 1920 * 1920)^ (1/2)] / 5 = 440

    现有的适配方案有哪些

    1.屏幕分辨率限定符适配

    屏幕分辨率限定符适配需要在 res 文件夹下创建各种屏幕分辨率对应的 values-xxx 文件夹:如下图:

    image.png

    然后根据一个基准分辨率,例如基准分辨率为 1280x720,将宽度分成 720 份,取值为 1px~720px,将高度分成 1280 份,取值为 1px~1280px,生成各种分辨率对应的 dimens.xml 文件。如下分别为分辨率 1280x720 与 1920x1080 所对应的横向dimens.xml 文件:

    image.png

    假设设计图上的一个控件的宽度为 720px,那么布局中就写 android:layout_width="@dimen/x720" ,当运行程序的时候,系统会根据设备的分辨率去寻找对应的 dimens.xml 文件。例如运行在分辨率为 1280x720 的设备上,系统会自动找到对应的 values-1280x720 文件夹下的 lay_x.xml 文件,由上图可知 x720 对应的值为
    720.px,可铺满该屏幕宽度。运行在分辨率为 1920x1080 的设备上,系统会自动找到对应的 values-1920x1080 文件夹下的 lay_x.xml 文件,由上图可知 x720 对应的值为 1080.0px,可铺满该屏幕宽度。这样就达到了屏幕适配的要求!

    2.今日头条屏幕适配方案

    implementation 'com.github.JessYanCoding:AndroidAutoSize:v1.2.1'
    maven { url "https://jitpack.io" }
    AndroidManifest.xml 中添加配制,这里的宽高设置可以问设计师要设计图尺寸根据实际填写

    <meta-data
    android:name="design_width_in_dp"
    android:value="360"/>

    <meta-data
    android:name="design_height_in_dp"
    android:value="640"/>

    3.smallestWidth适配屏幕

    as自带的SmallestWidth Dimens插件 重启
    Tools - > SmallestWidth
    插件启动后可自主选择要在那个moudel下生成values-sw<N>dp文件夹,默认有一些文件夹,你也可以通过Add smallestWidth添加需要的尺寸。Design Width 为你设计稿的尺寸是必填项,我在这里填写最小单位360。

    image.png

    为什么选择smallestWidth 限定符适配?

    既然原理都一样,都需要多套 dimens.xml 文件,那为什么要选择 smallestWidth 限定符适配呢?

    1.屏幕分辨率限定符适配是根据屏幕分辨率的,Android 设备分辨率一大堆,而且还要考虑虚拟键盘,这样就需要大量的 dimens.xml 文件。因为无论手机屏幕的像素多少,密度多少,90% 的手机的最小宽度都为 360dp,所以采用 smallestWidth 限定符适配只需要少量 dimens.xml 文件即可。

    2.屏幕分辨率限定符适配采用的是 px 单位,而 smallestWidth 限定符适配采用的单位是 dp 和 sp,dp 和 sp 是google 推荐使用的计量单位。又由于很多应用要求字体大小随系统改变,所以字体单位使用 sp 也更灵活。

    3.屏幕分辨率限定符适配需要设备分辨率与 values-xx 文件夹完全匹配才能达到适配,而 smallestWidth 限定符适配寻找 dimens.xml 文件的原理是从大往小找,例如设备的最小宽度为 360dp,就会先去找 values-360dp,发现没有则会向下找 values-320dp,如果还是没有才找默认的 values 下的 demens.xml 文件,所以即使没有完全匹配也能达到不错的适配效果。

    常见问题汇总

    为什么宽度适配了,高度有时候没有完全适配?

    因为各种屏幕高宽比并不是固定的,有16:9、4:3,还有全面屏的19.5:9等等,如果强行将宽高都适配那只会导致布局变形。

    例如一个控件的宽高为360dp和640dp,如果将它显示在宽高为360dp和640dp的设备上是正常铺满整个屏幕的,但是显示在宽高为360dp和780dp的设备上高度则不能铺满,如果你让高度铺满,而宽度又保持不变,那就会出现变形的情况。所以这也就是为什么目前市面上的屏幕适配方案只能以宽或高一个维度去适配,另一个方向用滑动或权重的方式去适配的原因。

    那你为什么说高度也能适配呢?
    这里说的高度也能适配指的是在不同分辨率和密度的手机上能达到等比缩放的适配,其他屏幕适配方案也是一样的。

    如何同时适配横竖屏?

    方案一:(不推荐)
    计算出设备宽度和高度的dp值,然后生成对应的宽高 dimens.xml 文件。然后去掉所有 values-swXXXdp 目录上的s,即改为 values-wXXXdp。这样设备不管横竖屏都能找到对应的 values-wXXXdp 目录下的 dimens.xml 文件了。 虽然也能达到一定程度的适配,但是这样会增加很多 dimens.xml 文件,而且使用竖屏的设计图显示出来的效果也不够好。
    方案二:(推荐)
    因为横屏时宽高变化太大,想要横屏时也能完全适配,那就只能让设计师出一套横屏的设计图,然后单独写一套横屏的布局文件。
    注意:smallestWidth 限定符适配的效果是让不同分辨率和密度的设备上能达到以设计图等比缩放的适配,如果设备与设计图相差太大时并不能达到很好的适配效果,需要单独出图,其他屏幕适配方案也是一样的。

    相关文章

      网友评论

          本文标题:Android屏幕适配

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