换肤规范的目的是什么?对于UI设计和开发人员而言,设计与开发都应该基于统一且完整的规范之上进行,以掘金APP为例:
对于UI设计人员,在APP不同的主题下,控件的颜色不再是一个单一的值,而应该用一个通用的key
来进行定义,如上图所示,「标题」的颜色,在日间应该是黑色#000000
,而深色模式下则应该为白色#FFFFFF
,同理,「次级标题」、「主背景色」、「分割线颜色」,都应该随着不同的主题下,对应不同的值。
设计人员在设计时,仅需要针对页面每一个元素填充好对应的key
,根据规范很清晰地完成UI设计:
颜色Key | 日间模式 | 深色模式 | 备注 |
---|---|---|---|
skinPrimaryTextColor | #000000 | #FFFFFF | 标题字体颜色 |
skinSecondaryTextColor | #CCCCCC | #CCCCCC | 次级标题字体颜色 |
skinMainBgColor | #FFFFFF | #333333 | 页面主背景色 |
skinSecondaryBgColor | #EEEEEE | #000000 | 次级背景、分隔线背景色 |
其他更多… | |||
skinProgressBarColor | #000000 | #FFFFFF | 进度条颜色 |
这对于开发人员的效率提升更加明显,开发者不再需要关心具体颜色的值,只需要将对应的color
填充到布局中即可:
二、构建产品化思维:皮肤包
如何衡量一个开发人员的能力——对复杂功能快速、稳定的交付?
如果只是单纯的认可这个理念,那么对于换肤功能的实现反而简单了,以标题颜色skinPrimaryTextColor
为例,我只需要声明两个color
资源:
笔者成功摆脱了复杂的编码实现,在Activity
中我只需2行代码即可:
public void initView() {
if (isLightMode) { // 日间模式
tv.setTextColor(R.color.skinPrimaryTextColor);
} else { // 夜间模式
tv.setTextColor(R.color.skinPrimaryTextColor_Dark);
}
}
这种实现并非一无是处,从实现的难度而言,