easySmallWidth
设计目的:
让 smallWidth 屏幕适配更加灵活,容易,减轻开发者的维护难度。
EasySmallWidth 原理
AndroidStudio 通过 Gradle 进行打包,会经过 Initialization、Configuration、Execution 三个阶段。在 configuration 会读取所有项目的配置,并最终生成 Gradle TASK 执行的有相图。EasySmallWidth 就是在 Gradle 读取项目配置之后,生成有相图之前,插入自定义 Task,让我们需要的 dimens 文件,先于构建 Apk。通过观察 Gradle 打包生成 apk 的 Task,不论是 Android library 还是 android application 在执行 task 之前都会执行 preBuild Task 。因此 EasySmallWidth 选取 PreBuild 作为插入点。进行适配工作。
EasySmallWidth 配置项
| 属性 | 作用 | 默认值 |
|---|---|---|
| enableAdapter | 是否开启适配 true 开启,false 关闭 | true |
| defaultDesignWidth | 默认设计图宽度 | 360f |
| resPath | res 相对 当前模块的路径。系统会根据 res 查找默认的 dimen 文件,然后创建在此路径下创建 values-swxxxdp 文件。考虑到项目可能从 eclipse 迁移过来。增加这个配置项 | /src/main/res/ |
| needToAdaptedWidth | 需要适配的最小宽度,需要自己添加 | size 为 0 的 set |
| conversionMap | 需要自定义转换的 dimens 文件,默认不需要填写。 | 以 Integer 为 Key,Float 为 value 空 map |
EasySmallWidth 包含二级配置,总体配置,模块配置。具体的配置参考 EasySmallWidth 的使用 step3。当没有模块配置的时候,会使用总体配置 。
EasySmallWidth 的使用
step1:
在根目录的 build.gradle 添加下面的代码

classpath 'com.txl.EasySmallWidth:easySmallWidth:1.0.0'
step2: 引入插件
项目的入口引入插件,EasySmallWidth 会自动遍历当前项目的 所有模块并为它添加适配任务,所以不需要在 每个模块重复引用插件
apply plugin: 'BuildAdaptionPlugin'
插件引入成功后在模块的中可以看到 EasySmallWidth 为每个 模块添加的创建和删除适配文件的 task

如果 Android Studio 没有显示 task 重新设置下下面的属性即可

step3:添加配置项
adaptionAppExtension{
defaultDesignWidth = 360f //默认设计图的宽度为 360dp
enableAdapter = true //开启屏幕适配
needToAdaptedWidth.add(400) // 需要适配最小宽度 400dp 即会创建 values-sw400dp
needToAdaptedWidth.add(411) // 需要适配最小宽度 411dp 即会创建 values-sw411dp
needToAdaptedWidth.add(441) // 需要适配最小宽度 441dp 即会创建 values-sw441dp
// res 路径,默认不用配置
// resPath = "${File.separator}src${File.separator}main${File.separator}res${File.separator}"
//针对 testAutoBuildDimen 模块创建独自的配置
def ex = createBuildAdaptionPluginExtension(project,adaptionAppExtension,"testAutoBuildDimen")
//对模块 testAutoBuildDimen sw400 与默认值的转换关系为 实际值*1.0
ex.conversionMap.put(400,1.0f)
//对模块 testAutoBuildDimen sw400 与默认值的转换关系为 实际值*2.0
ex.conversionMap.put(411,2.0f)
//对模块 testAutoBuildDimen sw400 与默认值的转换关系为 实际值*3.0
ex.conversionMap.put(441,3.0f)
def aeasy = createBuildAdaptionPluginExtension(project,adaptionAppExtension,"aeasybuild")
//aeasy 模块的默认宽度是 375dp
aeasy.defaultDesignWidth = 375f
}
验证 EasySmallWidth
直接通过 android studio 进行编译,然后在对应模块下就会产生对应的 dimens 文件
app 模块:

可以看到 sw400dp 中的 dimen 值 = 400/360 * 实际值 符合 SmallWidth 要求
aeasybuild 模块:

可以看到 sw400dp 中的 dimen 值 = 400/375 * 实际值 符合 SmallWidth 要求 (我们在配置的时候将 aeasybuild 的默认宽度设置成立 375dp)
testAutoBuildDimen 模块:

为什么这个模块的值不是按照 smallWidth 来的呢?因为我们在前面配置的时候对它做了自定义转换,sw400 与设计图 1.0 倍处理
EasySmallWidth demo
地址: https://github.com/xiaolutang/androidTool
EasySmallWidth 特性
缺点:
- 由于 SmallWidth 适配的原因,它无法解决为了适配需要生成更多的文件的问题。
优点:
- 代码侵入性低
- 基于系统原理适配稳定性高
- 方便适配方案切换,可与 AndroidAutoSize 适配方案进行无缝切换
- 兼容性好,与第三方库适配没有冲突(与 AndroidAutoSize 不兼容)
- 适配灵活,可以针对每一个模块进行适配。
可以这样说 EasySmallWidth 做为 SmallWidth 的升级版,主要的职责就是解决 SmallWidth 的维护性 和代码入侵的问题。
注意事项
- EasySmallWidth 为了方便使用者切换适配方案(主要是 AndroidAutoSize),在执行 clean task 的时候会删除每个模块下的适配文件,如果想买有特殊 处理,需要提前保存下
- EasySmallWidth 兼容三方库是指兼容第三方运用 SmallWidth 原理进行适配的三方库,它与 AutoSize 并不兼容。
关于三方库的适配问题建议
因为现在流行的 AutoSize 与 SmallWidth 之间不兼容,建议三方库不进行屏幕适配,对外公布自己的设计图尺寸,同时将默认的 dimen 文件发不出来。具体的适配工作交给开发者自己选择。
说明
由于个人水平有限,个人也是一边看 gradle 文档,一边开发。项目免不了有一些奇奇怪怪的问题,欢迎大家和我一起开发这个框架。让屏幕适配变得更加简单
