easySmallWidth

More: Author   ReportBugs   
Tags:

设计目的:

让 smallWidth 屏幕适配更加灵活,容易,减轻开发者的维护难度。

EasySmallWidth 原理

AndroidStudio 通过 Gradle 进行打包,会经过 InitializationConfigurationExecution 三个阶段。在 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 添加下面的代码

image-20210125210118474

classpath 'com.txl.EasySmallWidth:easySmallWidth:1.0.0'

step2: 引入插件

项目的入口引入插件,EasySmallWidth 会自动遍历当前项目的 所有模块并为它添加适配任务,所以不需要在 每个模块重复引用插件

apply plugin: 'BuildAdaptionPlugin'

插件引入成功后在模块的中可以看到 EasySmallWidth 为每个 模块添加的创建和删除适配文件的 task

image-20210125210731910

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

image-20210125212842090

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 模块:

image-20210125214106890

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

aeasybuild 模块:

image-20210125214409760

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

testAutoBuildDimen 模块:

image-20210125214737257

为什么这个模块的值不是按照 smallWidth 来的呢?因为我们在前面配置的时候对它做了自定义转换,sw400 与设计图 1.0 倍处理

EasySmallWidth demo

地址: https://github.com/xiaolutang/androidTool

EasySmallWidth 特性

缺点:

  1. 由于 SmallWidth 适配的原因,它无法解决为了适配需要生成更多的文件的问题。

优点:

  1. 代码侵入性低
  2. 基于系统原理适配稳定性高
  3. 方便适配方案切换,可与 AndroidAutoSize 适配方案进行无缝切换
  4. 兼容性好,与第三方库适配没有冲突(与 AndroidAutoSize 不兼容)
  5. 适配灵活,可以针对每一个模块进行适配。

可以这样说 EasySmallWidth 做为 SmallWidth 的升级版,主要的职责就是解决 SmallWidth 的维护性 和代码入侵的问题。

注意事项

  1. EasySmallWidth 为了方便使用者切换适配方案(主要是 AndroidAutoSize),在执行 clean task 的时候会删除每个模块下的适配文件,如果想买有特殊 处理,需要提前保存下
  2. EasySmallWidth 兼容三方库是指兼容第三方运用 SmallWidth 原理进行适配的三方库,它与 AutoSize 并不兼容。

关于三方库的适配问题建议

因为现在流行的 AutoSize 与 SmallWidth 之间不兼容,建议三方库不进行屏幕适配,对外公布自己的设计图尺寸,同时将默认的 dimen 文件发不出来。具体的适配工作交给开发者自己选择。

说明

由于个人水平有限,个人也是一边看 gradle 文档,一边开发。项目免不了有一些奇奇怪怪的问题,欢迎大家和我一起开发这个框架。让屏幕适配变得更加简单

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools