Android关于图片资源管理的思考

news2024/11/24 6:39:22

作者:流浪汉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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/624537.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面向对象——权限修饰符、匿名内部类

package关键字 为什么要有包? 将字节码(.class)进行分类存放 包其实就是文件夹 包的定义及注意事项 定义包的格式 package 包名 多级包用.分割,如package com.heima里面的.就是分隔符 定义包的注意事项 package语句必须是程序的第…

扩容系统盘【centos-root】

问题描述: 磁盘空间有42G,但是系统盘只有6G。 问题抛出:(P2原本只有7G,其中有30G错误分配到nvmeOn1p2了)p2的30G空间怎么合理分配给系统盘? (执行: sudo growpart /dev/nvme0n1 …

[学习笔记] [机器学习] 7. 集成学习(Bagging、随机森林、Boosting、GBDT)

视频链接数据集下载地址:无需下载 1. 集成学习算法简介 学习目标: 了解什么是集成学习知道机器学习中的两个核心任务了解集成学习中的 Boosting 和 Bagging 1.1 什么是集成学习 集成学习通过建立几个模型来解决单一预测问题。它的工作原理是生成多个分…

【P53】JMeter 断言结果(Assertion Results)

文章目录 一、断言结果(Assertion Results)参数说明二、准备工作三、测试计划设计 一、断言结果(Assertion Results)参数说明 可以查看断言的成功和失败数 使用场景:一般在调试测试计划期间用来查看断言的成功和失败…

水库大坝的安全监测内容包括哪些?

在水库大坝的实时监测中,主要任务是通过无线传感网络监测各个监测点的水位、水压、渗流、流量、扬压力等数据,并在计算机上用数据模式或图形模式进行实时反映,以掌握整个水库大坝的各项变化情况。大坝安全监测系统能实现全天候远程自动监测&a…

本地项目托管到 Gitee

本地项目托管到 Gitee 1、创建远程仓库2、Git Bash Here第一步:初始化本地仓库 git init第二步:建立链接git remote add origin xxx第三步:将远程仓库中的文件推送至本地仓库中git pull --rebase origin master第四步:将本地项目放…

Paddle与AFFormer环境配置

本次重新记录一下paddle的安装过程,主要是因为在进行服务器环境初始化时没有进行正确的环境安装。 基础环境 云硬盘部署 conda安装 Anaconda安装 首先是下载相关包命令: sudo wget https://repo.anaconda.com/archive/Anaconda3-2020.02-Linux-x86_64.…

7.面向对象编程(基础部分)|Java学习笔记

文章目录 类与对象类与对象的关系类和对象的区别和联系对象在内存中的存在形式类和对象的内存分配机制 成员方法方法的调用机制原理 成员方法传参机制基本数据类型的传参机制引用数据类型的传参机制成员方法返回类型是引用类型应用实例 方法递归调用递归重要规则汉诺塔和八皇后…

有哪些内外网都能传输文件的工具-镭速

随着互联网的快速普及,不同地区的人们之间进行了更为频繁的交流与合作。对于企业和组织而言,文件的共享和传输也变得越来越重要,特别是在不同的地理位置之间。此时,一个既可在内网使用,又能在外网实现高速传输的工具就…

企业直播MR虚拟直播实例(混合现实直播)

MR虚拟直播带来的内容、体验和互动的升级,对多个行业、场景具有重大意义,尤其是在汽车、科技、带货、活动等对视觉呈现要求更高的行业和场景中,将会重塑用户的观看体验,​高效赋能企业业务增长​。随着用户对直播体验的需求、企业…

Learning C++ No.29 【右值引用实战】

引言: 北京时间:2023/6/7/9:39,上午有课,且今天是周三,承接之前博客,今天我又去帮我舍友签到早八,但愿这次不会被发现吧!嘻嘻嘻!并且刚刚发文有关对C11相关知识&#xf…

Day_47选择排序

目录 一. 选择排序的实现 1. 简单选择排序 2. 性能分析 二. 代码实现 1. 核心代码 三. 代码展示 四. 数据测试 五. 总结 一. 选择排序的实现 1. 简单选择排序 选择排序的基本思想是:每一趟(如第i趟)在后面n-i1(i1,2,3...n-1&a…

Java 面试题:Spring,Spring MVC,Spring Boot 之间什么关系?

来,先和我看张图: Spring全家桶了为了解决不同场景的问题,逐渐演化出多套生态环框,如:Spring、SpringMVC、SpringBoot、SpringCloud。 Spring MVC和Spring Boot都属于Spring,Spring MVC是基于Spring的一个…

【每日算法】【168. Excel表列名称】

☀️博客主页:CSDN博客主页 💨本文由 我是小狼君 原创,首发于 CSDN💢 🔥学习专栏推荐:面试汇总 ❗️游戏框架专栏推荐:游戏实用框架专栏 ⛅️点赞 👍 收藏 ⭐留言 📝&…

Vue-ECharts使用说明

Vue-ECharts使用说明 vue-echarts 是在Apache Echarts官网的echarts使用方法上二次封装的组件,方便我们创建echarts图应用到我们的项目中。 参考: vue-echarts 官网:https://github.com/ecomfe/vue-echarts Apache Echarts 官网:h…

推荐一款比Flink CDC更好用的免费CDC工具

很多中大型企业都希望选择一款足够轻量好用的CDC工具,而且最好是小白用户都能使用的CDC工具,今天就推荐一款小白都能安装并立即使用的CDC工具给大家。 CDC(Change Data Capture)是一种用于捕获和传递数据库实时变更的技术。它允许…

怎样通过大数据获客?

零售商知道他们需要大数据,并且正在向前冲锋以进入游戏。但许多零售商继续面临挑战。应该收集什么类型的数据?应如何使用数据来生成见解?如何衡量投资回报率? 101data最近对美国各种规模的零售商进行了调查。当被问及哪些流程将受…

YOLOv5/v7 添加注意力机制,30多种模块分析②,BAM模块,CBAM模块

目录 一、注意力机制介绍1、什么是注意力机制?2、注意力机制的分类3、注意力机制的核心 二、BAM模块1、BAM模块的原理2、实验结果3、应用示例 三、CBAM模块1、CBAM模块的原理2、实验结果3、应用示例 大家好,我是哪吒。 🏆本文收录于&#xf…

测试之路-我曾经跨过无数Bug,也怼过各大佬开发

前言: 这是我从事测试的第五个年头的开端,忙忙碌碌到头发现好像忙了个寂寞。也忘了最初走向这条不归路的初心是什么。当时14年学完计算机出来找工作,看着茫茫人海,第一反应就是退缩,该找什么工作?开发&…

sparkSQL的使用

sparksql只能处理结构化数据 基于rdd构建dataframe对象 from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StringType, IntegerTypeif __name__ __main__:spark SparkSession.builder.appName(test).master(local[*]).getOrCreate()sc spa…