Android应用源代码:界面布局文件、Java源文件、资源文件。
“魔术数值”指直接在代码中使用字符串、数值而不做注释,这些数值常常让人摸不着头脑,大大增加了程序的维护成本。Android通过将各种资源放到res目录中定义,提高程序的可维护性。
Android应用资源的两大类:
assets目录下,无法通过R资源清单类访问的原生资源,应用程序需要通过AssetManager以二进制流的形式读取资源。
res目录下,可通过R资源清单访问的资源,Android SDK会在编译应用时,自动在R.java文件中为这些资源建立索引。
res目录下的资源:
目录 |
存放的资源 |
animator/ |
属性动画的XML文件 |
anim/ |
补间动画的XML文件 |
color/ |
颜色列表的XML文件 |
drawable/ |
存放各种位图,和一些XML文件 |
layout/ |
界面布局文件 |
menu/ |
菜单资源的XML文件 |
raw/ |
任意类型的原生资源(比如音频文件、视频文件等),再Java代码中通过调用Resources对象的openRawResource(int id)方法来获取该资源的二进制文件 |
values/ |
各种简单值的XML文件,如字符串、整数值、颜色值、数组等 |
xml/ |
原生XML文件,可以通过Resources.getXML()方法访问 |
资源的访问:
1. 在Java代码中使用资源清单项
[<package_name>.]R.<resource_type>.<resource_name>
2. 在Java代码中访问实际资源
需要借助Resources类,通过Context.getResource()获取Resources,Resources类提供了如下两类方法:
getXxx(int id) //根据资源清单ID获取实际资源
getAssets() //获取访问assets目录下资源的AssetManager对象
3. 在XML文件中使用资源
@[<package_name>:]<resource_type>/<resource_name>
颜色值的定义:
Android支持4种颜色值的形式:
#RGB 0到f,16级颜色
#ARGB 0到f,16级颜色,0到f,16级透明度
#RRGGBB 00到ff,256级颜色
#AARRGGBB 00到ff,256级颜色,00到ff,256级透明度
数组资源Array
三种子元素:
<array…/>
<string-array…/>
<integer-array…/>
StateListDrawable资源(选择器)
StateListDrawable对象所显示的Drawable对象会随目标组件状态的改变而自动切换。
StateListDrawable对象的XML文件根元素为<selector…/>,该元素可以包含多个<item…/>元素,可以指定如下属性:
android:color或android:drawable:指定颜色或Drawable对象
android:state_xxx:指定一个特定状态
<item…/>元素支持的状态:
状态 |
含义 |
android:state_pressed |
按下的状态,(按下但是还没松开) |
android:state_focused |
当前View获取了焦点 |
android:state_selected |
用户选择了当前View |
android:state_checked |
用户选中了View,一般用于CheckBox这种非黑即白的选项 |
android:state_enabled |
当前View处于可用的状态 |
android:state_hovered |
光标是否悬停,通常与focused state相同,它是4.0的新特性 |
android:state_checkable |
组件是否能被check。如:RadioButton是可以被check的。 |
android:state_active |
是否被激活 |
android:state_window_focused |
应用程序是否在前台,当有通知栏被拉下来或者一个对话框弹出的时候应用程序就不在前台了 |
LayerDrawable资源:
LayerDrawable包含一个Drawable数组,系统将会按这些Drawable对象的数组顺序来绘制它们,索引最大的Drawable对象将会被绘制在最上面。
LayerDrawable对象的XML文件的根元素为<layer-list…/>,该元素可以包含多个<item…/>元素。
<item…/>元素可指定如下属性:
android:drawable:Drawable对象
android:id:Drawable对象的id
android:buttom|top|left|right:长度值,用于将该Drawable对象绘制到目标组件的特定位置
ShapeDrawable资源:
用于定义基本几何图形。
ShapeDrawable对象的XML文件的根元素为<shape…/>,可以指定属性:
android:shape[“rectangle”|”oval”|”line”|”ring”]用于指定几何图形的类型。
ClipDrawable资源:
ClipDrawable代表从其他位图上截取一个“图片片段”,在XML中使用<clip…/>元素。
可以指定如下三个属性:
android:drawable:指定截取的Drawable对象
android:clipOrientation:指定截取方向,水平或垂直
android:gravity:指定读取时的对齐方式
ClipDrawable对象调用setLevel(intlevel)设置截取区域的大小,0为空,10000为截取整张图。
AnimationDrawable资源:代表动画,逐帧动画或是补间动画。
PropertyAnimation属性动画资源
样式(Style)和主题(Theme)资源
样式(Style):
一个样式等于一组格式的集合。
Android的样式一般定义在res/values/styles.xml文件中,其中有一个根元素<resources…/>,而具体的每种样式定义则是通过<resources…/>下的子标签<style…/>来完成,<style…/>通过添加多个<item…/>来设置样式不同的属性。
<style…/>元素的属性:
name:指定样式的名称
parent:属性声明要继承的父样式
主题(Theme):
与样式资源非常相似,区别在于:
主题不能作用于单个View组件,主题应该对整个应用中的所有Activity起作用,或者对指定的Activity其作用。
主题定义的格式应该是改变窗口外观的格式,例如窗口标题、窗口边框等。
Android 5.0 新增了Material设计的主题,开发者只要将App主题设为android:Theme.Material.Xxx即可启用Material主题。
属性资源(Attribute)
放在res/values目录下,通过AttributeSet对象来获取属性。
使用原始资源:
raw目录下,按上面的语法格式访问
assets目录下,用AssetsManager的InputStream open(String fileName),AssetFileDescriptoropenFd(String fileName)访问Assets资源