Android 应用的资源
res目录下的资源,Android SDK会在编译时,自动在R.java文件中为这些资源创建索引,程序可以直接通过R资源清单类进行访问
assets目录下的资源代表应用无法直接访问的原生资源,应用程序需要通过AssetManager以二进制流的形式来读取资源
应用资源---res/assets
资源的类型以及存储方式
raw---原生资源
values---各种简单值的XML文件,根元素都是<resources ... />,建议使用不同的文件来存放不同类型的值。
arrays.xml
colors.xml
dimens.xml
strings.xml
styles.xml
xml---原生XML文件
使用资源---java代码和XML文件中使用资源
java代码---使用资源清单项
[<package_name>.]R.<resource_type>.<resource_name>
java代码---访问实际资源
清单项是一个int类型的值,并不是实际的资源对象
有些时候,程序需要使用实际的Android资源,为通过清单项来获取实际资源,可以借助与Android提供的Resource类
Resources---由Context调用getResources()获取
getXxx(int id)
getAssets()---获取访问/assets/目录下资源的AsseManager对象
XML
@[<package_name>:]<resource_type>/<resource_name>
字符串、颜色、尺寸资源---/res/values/Strings / colors / dimens
颜色值定义---#RGB / #AGRB / #RRGGBB / #AARRGGBB
定义字符串、颜色、尺寸资源文件
使用资源
Android允许使用资源文件定义boolean常量。/res/values/bools.xml
<bool name="...">true</bool>
整型常量---integers.xml
<integer name="...">21</integer>
getResources().getBoolean(R.bool.is_male) / getResources().getInteger(r.intefer.my_size)
数组资源---/res/values/arrays.xml
<array.../>
<string-array.../>
<integer-array... />
得到实际数组:
String[] getStringArray(int id)
int[] getIntArray(int id)
TypedArray obtaintypedArray(int id)
TypedArray代表一个通用类型的数组,该类提供了getXxx(int index)获取指定索引处的数组元素
Drawable资源---不仅可以直接存放图片资源,也可以存放多种XML文件作为资源
图片资源---getDrawable(int id)获取实际资源
StateListDrawable资源---组织多个Drawable对象。随目标组件状态的改变而自动切换。
根元素<selector.../>,包含多个<item.../>元素
android:color或android:drawable 指定颜色或drawable对象
android:state_xxx: 指定一个特定状态
android : state_pressed
android : state_checked
android : state_focused
LayerDrawable资源---也可包含一个drawable数组,将会按照数组顺序绘制,索引最大的Drawable对象将会绘制在最上面
根元素是<layer_list ... />,包含多个<item.../>元素
android : drawable:指定作为LayerDrawable元素之一的Drawable对象
android : id:为该Drawable指定一个标识
android : buttom | top | left | right:用于指定一个长度值,用于指定将该Drawable对象绘制到目标组件的指定位置
ShapeDrawable资源---定义一个基本的几何图形(矩形、圆形、线条等)
根元素为<shape .../>
android : shape=["rectangle" | "oval" | "line" | "ring"]:指定定义那种类型的几何图形。
<corners.../>---四角弧度
radius
topLeftRadius
...
<gradient.../>---使用渐变色填充
angle
centerX | centerY
startColor | centerColor | endColor
gradientRadius
type=["linear" | "radial" | "sweep"]
usesLevel=["true" | "flase"]
<padding.../>---内边距
left | right | top | bottom
<size.../>---形状的大小
wight | color | dashWidth | dashGap
<solid../>---单种颜色填充
color
<stroke.../>---绘制边框
wiath
color
dashWidth
dashGap
ClipDrawable资源---从其他位图截取一个“图片片段”
<clip.../>
android : drawable:指定截取的源Drawable对象
android : clipOrientation:指定截取方向
android : gravity:指定截取的对齐方式
setLevel(int level)设置截取的区域大小,0表示片段为空,10000表示截取整张图片。
设置定时器让程序不断调用setLevel()即可实现图片徐徐展开的效果。---图片进度条
AnimationDrawable资源---代表一个动画。(补间动画为例)
根元素<set.../>
interpolator
shareInterpolator
duration
fillAfter
<alpha.../>
fromAlpha | toAlpha
<scale.../>:缩放变换
fromXScale | fromYScale | toXScale | toYScale
pivotX | pivotY
<translate.../>:位移变换
fromXDelta | fromYDelta | toXDelta | toYDelta
<rotate.../>:旋转
fromDegrees | toDegrees
pivotX | pivotY
定义动画的XML应放在/res/anim/路径下
获取实际的Animation对象,可调用AnimationUtils的如下方法
loadAnimation(Context ctx,int resId)
属性动画资源---<set.../>、<objectAnimator.../>、<animator.../>
原始XML资源---初始化的配置信息、数据资源需要保存,推荐使用XML文件保存。
定义原始XML资源---保存路径/res/xml/
获取实际资源
XmlResourceParser getXml(int id):获取XML文档,并使用XmlPullParse解析该文档,该方法返回一个解析器对象(XmlResourceParse 是XmlPullParse的子类)
.getEventType()!=XmlResourceParser.END_DOCUMENT
Pull解析器是一个开源项目,Android内置了此解析器。
采用事件驱动的方式进行解析
可不断调用Pull解析器的next()获取下一个解析事件
XmlPullParser的getAttributeValue()获取属性值
XmlPullParser的nextText()获取文本节点的值
InputStream openRawResource(int id):获取XML文档对应的输入流
即可自行选择解析器来解析该XML资源
使用原始XML资源
XmlResoueceParser xrp=getResources().getXml(R.xml.books);
try{
StringBuilder sb=new StringBuilder("");
while(.getEventType()!=XmlResourceParser.END_DOCUMENT){
if(xrp.getEventType()==XmlResourceParser.START_TAG){
String tagName=xrp.getName();
if(tagName.equals("book")){
String bookName=xrp.getAttributeValue(null,"price");
sb.append("价格:");
sb.append(bookName);
String bookPrice=xrp.getAttributeValue(1);
sb.append("...");
...
sb.append(xrp.nextText());}
sb.append("\n");}
xrp.next();}
show.setText(sb.toString());}
catch...
布局资源---/res/layout/
菜单资源---/res/menu/,根元素为<menu.../>
样式和主题资源---Style / Theme
样式资源---/res/values/
根元素为<resources.../>
多个<style.../>---每个style包含一个样式
name---样式的名称
parent---所继承的父样式
多个<item.../>子元素,每个item定义一个格式项
主题资源---/res/values/
根元素为<resources.../>,使用<style.../>定义主题
不能作用于单个View组件,对整个应用的Activity或对指定的Activity起作用
主题定义的格式应该是改变窗口外观的格式,例如窗口标题、窗口边框等
支持继承
使用
setTheme(R,style....)
theme="@style/..."
Material主题---5.0新增,动态效果和过度风格
android:Theme.Material.Xxx
属性资源---自定义View组件需要指定属性是需要属性资源的帮助。/res/values/
根元素也是<resources.../>
attr子元素---定义一个属性
declare-styleable子元素---定义一个styleable对象,每个styleable对象就是一组attr属性的集合。
通过自定义组件的构造器中通过AttributeSet对象来获取这些属性
原始资源---类似于声音文件以及其他各种类型的文件(没有为之提供专门的支持)都称为原始资源。
/res/raw/---SDK会在R清单类中为该目录下的资源生成一个索引项
/assets/---通过AssetManager来管理该目录下的原始资源
InputStream open(String fileName)
AssetFileDescriptor openFd(String fileName)
MediaPlayer mp=null
mp=MediaPlayer.create(this,R.raw.bomb);
AssetManager am=getAssets();
AssetFileDescriptor afd=am.openFd("shot.mp3");
mp2=new MediaPlayer()
mp2.setDataSource(afd.getFileDescriptor());
mp2.prepare();
mp.start()
国际化和资源自适应---I18N / L10N
java国际化的思路---提供相应的资源文件。主要通过以下三个类完成:
java.util.ResourceBundle
java.util.Locale
java.text.MessageFormat
资源文件的三种命名形式:
baseName_language_country.properties
baseName_language.properties
baseName.properties---资源文件的基本名
java支持的国家和语言
Locale类的getAvailableLocales方法获取Java所支持的国家和语言。该方法返回一个Locale数组。
完成程序国际化
将需要输出的各种字符串定义在资源包中
非西欧字符的资源文件,java提供工具:native2ascii
native2ascii 源资源文件 目的资源文件
将生成乱码的目的资源文件,重命名即可
讲不同国家的/语言的提示信息分别以不同文件存放即可
Xxx_zh_CN.properties
Xxx_en_US.properties
关键类:ResourceBundle,静态方法:getBundle(String baseName,Locale locale)
ResourceBundle bundle=ResourceBundle.getBundle("mess",myLocale);
为Android应用提供国际化资源---为values目录添加几个不同语言国家版本
values-语言代码-r国家代码
drawable-语言代码-r国家代码
国际化Android应用
自适应屏幕的资源