如何自定义资源文件夹
android 的文件目录结构都是使用默认的 gradle 中 android 这个插件的配置,其实我们可以自己去定义资源所在文件夹名和文件夹结构,实现自定义的关键点在于我们按照自己的习惯更改完之后,去通知 gradle 构建工具,这样 gradle 构建工具才可以找到资源文件。
比如我们想把资源文件夹结构设计成如下:

很简单,我们只需要我们修改所在项目或module中的 build.gradle 文件,添加如下资源文件的配置:
android {
...
sourceSets {
main {
res.srcDirs('src/main/res', 'src/main/res_core', 'src/main/res_sub')
}
}
}
配置完之后,sync project 一下就成功了。
命名共性
- android 中资源的命名都是全小写,多个单词之间使用 _ 连接。
- 资源命名基本的套路是一样的,都是 :类型名 + 模块名 + 颜色值 / 用途,可能个别的有些差异,但是大体差不多都是这个规律
动画资源
动画资源文件放置:
- 视图动画文件放在 res/anim/ 目录下
- 属性动画文件放在 res/animator/ 目录下
动画文件命名:
- 使用全小写 + _ 连接
- 命名规则:模块名 + 效果名 / 类型名 + 方位 + 效果
例如:refresh_progress.xml、market_cart_add.xml、market_cart_remove.xml , translation_top_in - 动画效果名统一规范:
| 名称 | 说明 |
|---|---|
| fade_in | 淡入 |
| fade_out | 淡出 |
| push_down_in | 从下方推入 |
| push_down_out | 从下方推出 |
| push_left | 推向左方 |
| slide_in_from_top | 从头部滑动进入 |
| zoom_enter | 变形进入 |
| slide_in | 滑动进入 |
| shrink_to_middle | 中间缩小 |
颜色资源
首先声明,res/colors 中的颜色我们都应该是定义的是颜色,而不是其他,在代码中我们知道一个类,一个方法只干一件事,那么我们在定义像颜色这些基础资源时一样值关心颜色这个基本的着眼点,其他的不要多做。
例如,以前我们有的人会像下面这样做,直接在颜色列表中定义以控件为区分的单位的颜色值,这里大家惯用的写法真的错了,第一违背了单一性原则,第二以以控件为区分单位来设置颜色应该是在主题 style 中干的事
<resources>
<color name="button_foreground">#FFFFFF</color>
<color name="button_background">#2A91BD</color>
<color name="comment_background_inactive">#5F5F5F</color>
<color name="comment_background_active">#939393</color>
<color name="comment_foreground">#FFFFFF</color>
<color name="comment_foreground_important">#FF9D2F</color>
...
<color name="comment_shadow">#323232</color>
所以呢,大家一定要分清楚在什么地方干什么事。使用这种格式,会非常容易重复定义 ARGB 值,而且如果应用要改变基色的话会非常困难。同时,这些定义是跟一些环境关联起来的,如 button 或者 comment,应该放到 style 主题列表中,而不是在 colors.xml 文件中。
相反,应该这样做:
<resources>
<!-- grayscale -->
<color name="white" >#FFFFFF</color>
<color name="gray_light">#DBDBDB</color>
<color name="gray" >#939393</color>
<color name="gray_dark" >#5F5F5F</color>
<color name="black" >#323232</color>
<!-- basic colors -->
<color name="green">#27D34D</color>
<color name="blue">#2A91BD</color>
<color name="orange">#FF9D2F</color>
<color name="red">#FF432F</color>
</resources>
向应用设计者那里要这个调色板,名称不需要跟 "green"、"blue" 等等相同。"brand_primary"、"brand_secondary"、"brand_negative" 这样的名字也是完全可以接受的。像这样规范的颜色很容易修改或重构,会使应用一共使用了多少种不同的颜色变得非常清晰。通常一个具有审美价值的 UI 来说,减少使用颜色的种类是非常重要的。
注意:如果某些颜色和主题有关,那就单独写一个 colors_theme.xml。
dimens 资源
像对待 colors.xml 一样对待 dimens.xml 文件,与定义颜色调色板一样,你同时也应该定义一个空隙间隔和字体大小的“调色板”。 一个好的例子,如下所示:
<resources>
<!-- font sizes -->
<dimen name="font_22">22sp</dimen>
<dimen name="font_18">18sp</dimen>
<dimen name="font_15">15sp</dimen>
<dimen name="font_12">12sp</dimen>
<!-- typical spacing between two views -->
<dimen name="spacing_40">40dp</dimen>
<dimen name="spacing_24">24dp</dimen>
<dimen name="spacing_14">14dp</dimen>
<dimen name="spacing_10">10dp</dimen>
<dimen name="spacing_4">4dp</dimen>
<!-- typical sizes of views -->
<dimen name="button_height_60">60dp</dimen>
<dimen name="button_height_40">40dp</dimen>
<dimen name="button_height_32">32dp</dimen>
</resources>
布局时在写 margins 和 paddings 时,你应该使用 spacing_xx 尺寸格式来布局,而不是像对待 string 字符串一样直接写值,像这样规范的尺寸很容易修改或重构,会使应用所有用到的尺寸一目了然。 这样写会非常有感觉,会使组织和改变风格或布局非常容易。
图片资源
- 图片资源文件放置:
- res/mipmap/ 目录下只放启动图标
- res/drawable/ 目录下放的是位图文件,如 .png、.9.png、.jpg、.gif ,或者是 矢量图
- 命名规则:类型 + 模块名 +逻辑名称 / 颜色
例如下表:
| 名称 | 说明 |
|---|---|
| btn_main_about.png | 主页关于按键 |
| btn_back.png | 返回按键 |
| divider_maket_white.png | 商城白色分割线 |
| ic_edit.png | 编辑图标 |
| bg_main.png | 主页背景 |
| btn_red.png | 红色按键 |
| btn_red_big.png | 红色大按键 |
| Ic_head_small.png | 小头像图标 |
| bg_input.png | 输入框背景 |
| divider_white.png | 白色分割线 |
| bg_main_head.png | 主页头部背景 |
| def_search_cell.png | 搜索页面默认单元图片 |
| ic_more_help.png | 更多帮助图标 |
| divider_list_line.png | 列表分割线 |
| sel_search_ok.xml | 搜索界面确认选择器 |
| shape_music_ring.xml | 音乐界面环形形 |
选择器:sel_btn_xx.xml,采用如下命名:
| 名称 | 说明 |
|---|---|
| sel_btn_xx | 作用在 btn_xx 上的 selector |
| btn_xx_normal | 默认状态效果 |
| btn_xx_pressed | state_pressed 点击效果 |
| btn_xx_focused | state_focused 聚焦效果 |
| btn_xx_disabled | state_enabled 不可用效果 |
| btn_xx_checked | state_checked 选中效果 |
| btn_xx_selected | state_selected 选中效果 |
| btn_xx_hovered | state_hovered 悬停效果 |
| btn_xx_checkable | state_checkable 可选效果 |
| btn_xx_activated | state_activated 激活效果 |
| btn_xx_window_focused | state_window_focused 窗口聚焦效果 |
布局资源
- 命名规则:类型 + 模块名 +逻辑名
例如:
| 名称 | 说明 |
|---|---|
| activity_main.xml | 主窗体 |
| activity_main_head.xml | 主窗体头部 |
| fragment_music.xml | 音乐片段 |
| fragment_music_player.xml | 音乐片段的播放器 |
| dialog_loading.xml | 加载对话框 |
| ppw_info.xml | 信息弹窗(PopupWindow) |
| layout_main_song.xml | 主页歌曲列表项 |
另外 Google 官方的 demo 中命名:
- UserProfileFragment / user_profile_layout
官方的明明思路是:类型后缀, 前缀使用 业务模块名+实现功能名,布局的使用和页面相同的名字。这个仁者见仁,智者见智,DataBinding 声明测 Binding 累名字就是 activity 在前的。
id 命名
- 命名规则:控件类型 + 模块名 + 逻辑名
例如: btn_main_search、btn_back
菜单资源
- 命名规则:模块名 + 逻辑名
例如:main_drawer.xml、navigation.xml
values 资源
values/ 资源文件下的文件都以 s 结尾,如 attrs.xml、colors.xml、dimens.xml,起作用的不是文件名称,而是 <resources> 标签下的各种标签,比如 <style> 决定样式,<color> 决定颜色,所以,可以把一个大的 xml 文件分割成多个小的文件,比如可以有多个 style 文件,如 styles.xml、styles_home.xml、styles_item_details.xml、styles_forms.xml。
strings 文字资源
- 命名规则:控件类型 + 模块名 + 逻辑名称
| 名称 | 说明 |
|---|---|
| menu_main_about | 主菜单按键文字 |
| friend_title | 好友模块标题栏 |
| friend_dialog_del | 好友删除提示 |
| login_check_email | 登录验证 |
| dialog_title | 弹出框标题 |
| button_ok | 确认键 |
| loading | 加载文字 |
styles 主题资源
主题的命名使用大驼峰命名法,推荐使用 : 控件类型名+ 模块名 + 逻辑名
<style name="Button_Main_Search">
<item name="android:textSize">@dimen/font_normal</item>
<item name="android:textColor">@color/basic_black</item>
</style>