很好用的Android屏幕适配方案

简述

Android系统是谷歌提供的开源技术,导致设备的碎片化问题,所以对于一个安卓开发人员来讲,开发的程序适配各种屏幕成为了一个麻烦。

屏幕适配

其实适配的主要问题就是分辨率不同,尺寸不同,而设备的像素密度和分辨率、尺寸息息相关,也就是说图片的px在不同机型上转化的dp值是不同的,如果我们不做适配,当dp在不同设备上值是一样的时候,那自然就会出现显示长短不一的效果。
平时开发过程中,首先布局编写时,通过权重,匹配屏幕或包裹内容来实现view的自适应,当然好多view的宽高是切图中规定死的,那么对于这些写死的宽高,在不同设备中就会出现比例拉伸的情况,所以以前项目当中,一般会通过最小宽度限定符适配来实现不同机型的屏幕适配。推荐一个好用的插件 ScreenMatch

最小宽度限定符适配

smallestWidth(最小宽度)限定符适用于AndroidTV屏幕适配,采用的单位是 dp 和 sp,dp 和 sp 是google 推荐使用的计量单位。又由于很多应用要求字体大小随系统改变,所以字体单位使用 sp 也更灵活。另外smallestWidth 限定符适配只需要少量 dimens.xml 文件减少内存

smallestWidth 限定符适配原理

smallestWidth 限定符适配是拿 dp 值来等比缩放,系统都是根据限定符从大往小去寻找对应的 dimens.xml 文件里对应比例的dp值。例如程序运行在最小宽度为 360dp 的设备上,系统会先去找 values-360dp 文件夹下的 dimens.xml 文件,发现没有则会向下找 values-320dp,如果还是没有才找默认的 values 下的 dimens.xml 文件,所以即使没有完全匹配也能达到不错的适配效果。
需要注意的是“最小宽度”是不区分方向的,即无论是宽度还是高度,哪一边小就认为哪一边是“最小宽度”。
px: Android屏幕分辨率,手机屏幕的横纵像素值。
dpi: 像素密度,单位尺寸上像素值,计算方式:在这里插入图片描述

使用插件

smallestWidth 限定符适配是以设计图最小宽度(单位为 dp)作为基准值,生成所有设备对应的 dimens.xml 文件。有大神提供了自动生成这些文件的插件 ScreenMatch

使用步骤:

  1. 在 Android Studio 中安装 ScreenMatch 插件
    点击菜单栏上的 File -> Settings -> Plugins -> Browse Repositories,然后在上面搜索screenmatch,下载这个插件,最后点击 “OK”,重启 Andorid Studio 即可。如图:
    在这里插入图片描述

  2. 在项目的默认 values 文件夹中需要一份 dimens.xml 文件,可以百度搜索一个
    在这里插入图片描述

  3. 使用方法:
    插件安装好后,在项目的任意目录或文件上右键,选择 ScreenMatch 选项。如图:
    在这里插入图片描述
    然后选择在哪个 module 下执行适配。即基于哪个 module 下的 res/values/dimens.xml 文件作为基准 dimens.xml 文件,生成的其他尺寸 dimens.xml 文件放在哪个 module 下。例如选择 app,然后点击 OK 如图:
    在这里插入图片描述
    然后res 目录下会自动生成一堆 dimens.xml 文件,出现如下界面表示生成文件成功。如图:
    在这里插入图片描述
    到这就已经生成了所有设备对应的 dimens.xml 文件了。

  4. 默认生成的 dimens.xml 文件可以适配绝大部分设备,但是如果尺寸比较特殊的设备需要我们自己添加适配值(比如平板和 TV )。实际情况要根据设计图和需求设置。特殊的设备需要自己计算设备的最小宽度,然后添加适配值。

以上修改需要在配置文件里修改,即 screenMatch.properties 文件,该配置文件是执行完上面 3 步后自动生成在项目的根目录下的。如图:
在这里插入图片描述
打开这个配置文件,修改下图中 1、3、4 的值即可。(图中单位均为 dp)
1:最小宽度基准值,填写设计图的最小宽度值即可。
2:插件默认适配的最小宽度值,即默认情况下会生成如下值的 dimens.xml 文件。
3:需要适配的最小宽度值(如果是小数,则保留4位小数。例如 392.727272…,则取 392.7272),即你想生成哪些 dimens.xml 文件。
4:忽略不需要适配的最小宽度值,即忽略掉插件默认生成的 dimens.xml 文件
在这里插入图片描述
配置文件修改完成后,重新执行第 3 步,生成新的 dimens.xml 文件。

当然!如果你的设计图也是标准的 360dp,那么上面的步骤你可以忽略。

其他适配技巧

1.善于使用 wrap_content、match_parent、weight
例如写一个 TextView 控件,一般都不会直接写死宽高,而是用 wrap_content 代替宽高。
2.使用相对布局 / 约束布局,禁用绝对布局
绝对布局(AbsoluteLayout)直接使用 X、Y 坐标来控制控件的位置,对于屏幕碎片化这么严重的今天,使用绝对布局对于屏幕适配来说就是灾难性的,所以 Google 已经废弃了该控件。

相对布局(RelativeLayout)或者约束布局(ConstraintLayout)就不一样了,相对布局的子控件之间使用 相对位置 的方式排列,即使屏幕的大小改变,控件的相对位置也不会变化,与屏幕大小无关,灵活性很强。约束布局也是类似的,通过对某些控件进行约束来确定它们之间的位置。

如何适配平板、TV?

同横屏道理一样,平板、TV 与手机的宽高差距太大,想要平板、TV 也能完全适配,那就只能让设计师出一套平板、TV 的设计图,然后单独写一套平板、TV 的布局文件。

如果 同时适配手机与平板 或者 同时适配手机与 TV,还需要在 res 文件夹下创建 layout-sw533dp 文件夹用来放平板或 TV 的布局文件,默认的 layout 文件夹放手机的布局文件。
注意:这里用的是 533dp 的原因是目前手机最大的宽度为 480dp,所以大于 480dp 的就认为是平板或 TV。

如果 同时适配手机、平板与 TV,这种情况平板与 TV 的设计图可以只出一套,因为平板与 TV 的样式比较类似,而且平板与 TV 的最小宽度值可能会出现一样的情况,这时候适配看成上面那种方式即可。

注意:smallestWidth 限定符适配的效果是让不同分辨率和密度的设备上能达到以设计图等比缩放的适配,如果设备与设计图相差太大时并不能达到很好的适配效果,需要单独出图,其他屏幕适配方案也是一样的。

推荐几个链接

https://www.jianshu.com/p/1302ad5a4b04
https://www.jianshu.com/p/21eadaf65207
今日头条的autosize
implementation ‘me.jessyan:autosize:1.1.2’

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值