作者:流浪汉kylin
一. 前言
当我们的项目比较大时,迭代的时间比较长的时候,我们往往都会对代码进行重构,会对代码进行一次系统的整合和规范的讨论,为了之后的开发能够避免写重复的代码,方便代码的维护和扩展等等。我们会对代码进行清理并设计出一套开发的规范,我想好多公司都有这样的经历。
那资源呢?又有多少人会去思考对资源如何进行整理,方便资源文件的维护和扩展(这里说的资源主要讲的是图片资源)。
二. 为什么要对图片资源进行管理
因为我有接触过比较小的项目,也有接触过比较大的项目。如果你的项目比较小,可能涉及引用到的资源不是很多,我也不建议额外花时间对之前的图片资源进行整理,因为这个流程可能是需要多方进行配合的,简单来说就是杀鸡焉用牛刀。
但是如果项目比较大,不对资源进行整理,那资源就会比较乱。你想想,比如我涉及的资源,有七八个人碰过这个项目,每个人对待资源都有不同的做法,那得有多乱,到时候一个新入职的一看,都不知道怎么去操作这些资源了,无从下手。
其实这方面最主要的是两个问题,一是规范问题,比如命令,假如有一个灰色的关闭按钮,一个同事给资源命名grey_close.webp ,另外一个命令close_grey.webp。 然后我新入职的,我写个页面,有个关闭按钮,那我第一反应就是全局选资源文件搜close,然后搜到grey_close.webp和close_grey.webp。并且两个图片,一个稍微大一点,一个稍微小一点,那我要用哪个,一个个试效果吗?还是随便用一个?
另一个我觉得比较严重的问题是资源重复的问题。还是拿上面的例子,我有个close按钮,我写这个页面的时候,我不管三七二十一,我直接再导入一张新的close切图,那项目中就用很多张关闭按钮。我相信有很多人在导入切图之前会去看项目中有没有相同的图片防止重复,但同样也会有很多人为了方便直接导入图片。你能想象一个项目里面有十几二十张“关闭”的切图是什么体验吗?当然它不影响开发,大不了我要用的时候我再重新导入一张就好(选择困难症的福音)。
是的,这个问题,不会影响开发流程,但它可能会在某一时刻把你给坑了。 比如我有15个关闭的按钮,我其中5个页面要做换肤。那你是对这5个地方都做操作吗?你肯定会想为什么这5个地方的关闭图片长得都一样,为什么当时还要用五张,为什么不共用一张。
三. 如何做资源的管理
1. 命名规范
我认为每个公司都应该对自己的资源有一套命名规范。如果可以,我希望是整个公司的规范,而不是单独android端的规范,比如一张close切图,android端、ios端、前端都用到了这一张切图,最好就是它们的文件命名规范都一样。
当然命名上也有一些细节要处理,首先你不能单独把一张图片资源直接为了方便而命名close.png。因为我相信你的项目不可能只有一个关闭的样式。你有两张切图
这时候你要只用close去命名,那就很尴尬了,候命那张你就只能玩close2.png这种操作了,久而久之,close15.png出现的时候,你又会陷入懵逼。
然后是样式问题。像上图一样,你可能有不同的图片样式,但他们都表示关闭,你要怎么去命名,这可能不算什么技术,但也算得上一门艺术。比如第一张close,你总不能命名close_in_round吧。
然后是颜色问题。也许你的UI设计师比较喜欢搞活,你的项目集齐了赤橙黄绿青蓝紫黑灰白的关闭按钮颜色。那你要怎么去命名。当然这一块对于Android来说,矢量图是能直接改颜色的。但如果你有引入不同颜色的切图时,你也确实要思考如何去命名。
然后是大小问题。可能同样的切图有不同的大小,这个你要出如何命名呢?这个我其实建议学android的资源文件夹,xhdpi、xxhdpi、xxxhdpi,搞它个几套大小的规范。 你总不能一个项目你的同个样式的大小还能超过六七个吧,那我感觉设计就有问题。
2. 防止重复资源
得尽量防止重复资源,比如说关闭按钮,假设颜色和大小相同的情况下,就这样的
他们基本就长得一个样,如果一个项目里面有个两三张,那我觉得情有可原,可能某些页面特殊要用单独的。但是这玩意长得差不多的你的项目有个七八张,那我觉得过分了,我说的是图中这种差不多的,不算上面那个带圈那种不一样的。
所以开发页面导入切图时,要先去查看有没有相同的图片,避免重复导入。查找图片导入的方法有两种,一是通过搜索资源,因为我们这些搞开发我算3年以上的,至少你命名也和图片有关的吧,比如你总不能搞一张关闭的按钮,和close这些词无关吧。第二种方法比较直观,通过Resource Managaer ,我觉得AS提供这个功能确实用处很大。
用这个肯定是能找图片,问题就在于,我上面说的,你一张关闭的切图有十几二十张,我就算用Resource Managaer找到了有关闭样式的切图,我也不知道要复用哪张。
然后上面也有说了,Android的矢量图,是能改变颜色的,所以通过这个方法,相同的尺寸和样式,不同颜色的矢量图也是能共用一张的,注意是矢量图。
对于一些样式相同但是长宽尺寸不同的图片,就是拉伸的效果相同的图,可以使用.9
3. 切图源头进行处理
其实很多切图的源头,都没处理好,如果说设计师其实知道两个地方的图片是相同的,但是他给忘记了,他也懒得找。所以重新弄了一张切图给你,导致和之前的尺寸不同。其实这里图片的源头就出了问题。所以我说这个图片资源的管理是需要多方进行努力的。
4. 图片管理系统
这一步就是做大了,你的公司有一个图片管理系统,甚至应该叫资源管理系统。当然如果要做这样的系统,也是需要额外的精力和成本。如果公司开发的项目比较小,我觉得花人力物力去做这样一个系统也不值,性价比不高。但是对于一个大公司而言,我觉得有一套这样的系统,还是挺好的,挺有用的,对于项目的迭代和维护来说。
无论是资源的大小、颜色和样式。我们如果想唯一标识它,靠谱的不是靠命名,而是ID。没错,如果你要做一个唯一标识,那么ID是最靠谱的。
假如每个不同的切图都有一个ID对它进行唯一标识,然后你有一张表,通过ID能找到对应的资源文件。那你就能管理好资源文件。
从源头UI设计开始,他的每张切图都传到这个系统中,我假设就有3个重要的字段,名称、描述、文件原。传上去之后系统生成个ID,然后UI设计师传这个切图到设计稿时,就用这个ID命名。之后他做切图可以去这个系统中通过“描述”去搜索有没有对应的切图,有的话就不用重新做,
对于客户端,如果你想要对应的切图,可以通过ID从这个系统中快速的拿到图片。命令时也可以通过ID和描述命名,比如close_457762.png ,这样就不会有重复的图片资源。
然后如果要做换肤,直接说对哪个ID的图片做换肤,也能很快很清晰的找到。
通过一个资源管理系统,来达到管理所有端的资源绝对是一个很好的做法。但是缺点就是对该系统的开发和维护是需要一定的成本。
四. 总结
这篇文章主要是想表达出在大项目中资源混乱的一种常见问题。如果有哪位大佬有比较好的图片资源管理的办法,也希望能分享出来。
Android 学习笔录
Android 性能优化篇:https://qr18.cn/FVlo89
Android 车载篇:https://qr18.cn/F05ZCM
Android Framework底层原理篇:https://qr18.cn/AQpN4J
Android 音视频篇:https://qr18.cn/Ei3VPD
Jetpack全家桶篇(内含Compose):https://qr18.cn/A0gajp
Kotlin 篇:https://qr18.cn/CdjtAF
Gradle 篇:https://qr18.cn/DzrmMB
OkHttp 源码解析笔记:https://qr18.cn/Cw0pBD
Flutter 篇:https://qr18.cn/DIvKma
Android 八大知识体:https://qr18.cn/CyxarU
Android 核心笔记:https://qr21.cn/CaZQLo
Android 往年面试题锦:https://qr18.cn/CKV8OZ
2023年最新Android 面试题集https://qr18.cn/CgxrRy
Android 车载开发岗位面试习题:https://qr18.cn/FTlyCJ
音视频面试题锦:https://qr18.cn/AcV6Ap