参考:https://www.jianshu.com/p/4d3ae6d18993
Android应用资源可分为两大类:
在Android应用中使用资源可分为在Java代码和XML文件中使用资源,其中Java代码用于为Android应用定义四大组件,而XML文件则用于为Android应用定义各种资源。
在Java代码中访问实际资源
可以借助于Android提供的Resources类来获取实际资源。Resources由Context调用getResources()方法来获取。Resources主要提供了如下两种方法:
getXxx(int id):根据资源清单ID来获取实际资源。
getAssets():获取访问/assets/目录下资源的AssetManager对象。
字符串资源、颜色资源、尺寸资源,它们对应的XML文件都将位于/res/values/目录下,它们 默认的文件名以及在R类中对应的内部类如下所示
Android中的颜色值是通过红(Red)、绿(Green)、蓝(Blue)三原色以及一个透明度(Alpha)值来表示的,颜色值总是以#开头,接下来就是Alpha-Red-Green-Blue的形式。其中Alpha值可以省略,如果省略了Alpha值,name该颜色默认是完全不透明的。
Android颜色值支持常见的4种形式(A代表透明度,R代表红色数值,G代表绿色数值,B代表蓝色数值):
#RGB:分别指定红、绿、蓝三原色的值(0~F)来代表颜色。
#ARGB:分别指定红、绿、蓝三原色的值(0F)及透明度(0F)来代表颜色。
#RRGGBB:分别指定红、绿、蓝三原色的值(00~FF)来代表颜色。
#AARRGGBB:分别指定红、绿、蓝三原色的值(0F)及透明度(0F)来代表颜色。
2.定义字符串、颜色、尺寸资源文件
字符串资源文件位于/res/values/目录下,字符串资源文件的根元素是
Hello World ,World!
颜色资源文件位于/res/values/目录下,颜色资源文件的根元素是
#F00
尺寸资源文件位于/res/values/目录下,尺寸资源文件的根元素是
10dp
Android采用位于/res/values目录下的arrays.xml文件来定义数组资源,定义数组时XML资源文件的根元素也是
子元素:定义普通类型的数组。
子元素:定义字符串数组。
子元素:定义整型数组。
一旦定义好了数组资源之后,在Java程序中通过如下形式访问资源:
[.]R.array.array_name
在XML文件中则可通过如下形式访问资源:
@[:]array/array_name
为了能在Java程序中访问到实际数组,Resources提供了如下方法:
String[] getStringArray(int id):根据资源文件中字符串数组资源的名称来获取实际的字符串数组。
int[] getIntArray(int id):根据资源文件中整型数组资源的名称来获取实际的整型数组。
TypedArray obtainTypedArray(int id):根据资源文件中普通数组资源的名称来获取实际的普通数组。
图片资源是最简单的Drawable资源,只要把.png、.jpg、*.gif等格式的图片放入/res/drawable-xxx目录下,AndroidSDK就会在编译应用中自动加载该图片,并在R资源清单类中生成该资源的索引。
一旦定义好了图片资源之后,在Java程序中通过如下形式访问资源:
[.]R.drawable.
在XML文件中则可通过如下形式访问资源:
@[:]drawable/file_name
为了在程序中获得实际的Drawable对象,Resources提供了Drawable getDrawable(int id)方法,该方法即可根据Drawable资源在R资源清单类中的ID来获取实际的Drawable对象。
1.StateListDrawable资源
StateListDrawable用于组织多个Drawable对象。当使用StateListDrawable作为目标组件的背景、前景图片时,StateListDrawable对象所显示的Drawable对象会随目标组件状态的改变而自动切换。
定义StateListDrawable对象的XML文件的根元素为
android:color或android:drawable:指定颜色或Drawable对象。
android:state_xxx:指定一个特定状态。
2.LayerDrawable资源
LayerDrawable也包含一个Drawable数组,所以系统会按这些Drawable对象的数组顺序来绘制它们,索引最大的Drawable对象将会被绘制在最上面。定义LayerDrawable对象的XML的根元素为
android:drawable:指定作为LayerDrawable元素之一的Drawable对象。
android:id:为该Drawable对象指定一个标识。
android:buttom|top|left|button:用于指定一个长度值,用于指定将该Drawable对象绘制到目标组件的指定位置。
3.ShapeDrawable资源
ShapeDrawable用于定义一个基本的几何图形,定义它的XML文件的根元素是
android:shape=["rectangle"|"oval"|"line"|"ring"]:指定定义哪种类型的几何图形。
4.ClipDrawable资源
ClipDrawable代表从其他位图上截取的一个“图片片段”。在XML文件中定义ClipDrawable对象使用
android:drawable:指定截取的源Drawable对象。
android:clipOrientation:指定截取方向,可设置水平截取或垂直截取。
android:gravity:指定截取时的对齐方式。
在使用ClipDrawable对象时可以调用setLevel(int level)方法来设置截取的区域大小,当level为0时,截取的图片片段为空;当level为10000时,截取整张图片。
5.AnimationDrawable 资源
动画的相关知识还要另外做更详细的总结,所以这里只是简单的提一下。定义动画的XML资源应该放在/res/anmi/路径下,如果使用AndroidStudio创建一个Android应用的时候,默认不会包含该路径,我们需要自己创建该路径。
定义补间动画的XML资源文件以
alpha:设置透明度的改变。
scale:设置图片进行缩放变换。
translate:设置图片进行位移变换。
rotate:设置图片进行旋转。
Android 系统的R.anim类中包含了大量常量,它们定义了不同的动画速度:
linear_interpolator:匀速变换。
accelerate_interpolator:加速变换。
decelerate_interpolator:减速变换。
如果程序想让android:shareInterpolator="true"
为了在Java代码中获取实际的Animation对象,可调用AnimationUtils的如下方法:
oadAnimation(Context ctx ,int resId)
6.属性动画资源
Animator代表一个属性动画,但它只是一个抽象类。定义属性动画的XML资源文件能以下面三个元素中的任意一个作为根元素:
:它是一个父元素,用于包含 、 或 子元素,该元素定义的资源代表AnimatorSet对象。
:用于定义ObjectAnimator动画。
:用于定义ValueAnimator动画。
Android应用有一些初始化的配置信息、应用相关的数据资源需要保存,一般都是使用XML文件来保存的,这些资源被称为原始XML资源。
1.定义原始XML资源
原始XML资源一般保存在/res/xml/路径下–使用AndroidStudio创建Android应用时,/res/目录下并没有包含xml子目录,我们需要自行手动创建xml子目录。
定义好了原始XML资源,在XML文件中就可以通过如下语法格式来访问它:
@[:]xml/file_name
在Java代码中则按如下语法来访问它:
[.]R.xml.
为了在Java程序中获取实际的XML文档,可以通过Resources的如下两个方法来实现:
XmlResourceParser getXml(int id):获取XML文档,并使用一个XmlPullParser来解析该XML文档,该方法返回一个解析器对象。
InputStream openRawResource(int id):获取XML文档对应的输入流。
2.使用原始XML文件
在程序中添加一个原始的XML文件,将该XML文件放到/res/xml目录下;
在Java程序中获取该XML资源,并解析该XML资源中的信息。
布局资源
布局资源(Layout)文件是放在/res/layout/目录下的,Layout资源文件的根元素通常是各种布局管理器,然后在布局管理器中定义各种View组件就可以了。
定义好Layout资源后,可通过如下语法来访问它:
@[:]layout/file_name
在Java代码中可通过如下语法来访问它:
[.]R.layout.
菜单资源
菜单资源文件放在/res/menu/目录下,菜单资源的根元素通常是
元素,元素无需指定任何属性。定义好了菜单资源,接下来在XML文件中可以通过如下语法访问它:
@[:]menu/file_name
在Java代码中可通过如下语法访问它:
[.]R.menu.
样式(Style)和主题(Theme)资源
样式资源文件放在/res/values/目录下,样式资源文件的根元素是
name:指定样式的名称。
parent:指定该样式所继承的父样式。当继承某个父样式时,该样式将会获得父样式中定义的全部格式。当然样式也可以覆盖父样式中指定的格式。
元素内可包含多个
定义好样式资源之后,在XML资源中可以通过如下语法访问它:
@[:]style/file_name
主题资源的XML文件通常也放在/res/values/目录下,主题资源的XML文件同样以
主题与样式的区别:
主题不能作用于单个的View组件,主题应该对整个应用中的所有Activity起作用,或对指定的Activity起作用。
主题定义的格式应该是改变窗口外观的格式,如窗口标题、窗口边框等。
Android5.0新增了Material设计得主题,我们只需要将APP的主题设为android:Theme.Material.Xxx即可启用Material主题。
Material Design支持包括下面几个方面:
属性资源(Attribute)
属性资源文件放在/res/values/目录下,属性资源文件的根元素也是
attr子元素:定义一个属性。
declare-styleable子元素:定义一个styleable对象,每个styleable对象就是一组attr属性的集合。
定义好属性资源文件后,可以在自定义组件的构造器中通过AttributeSet对象来获取这些属性。
使用原始资源
Android的原始资源可以放在如下两个地方:
位于/res/raw/目录下的资源会在R清单类中生成一个索引项,在XML文件中可以通过下面的语法访问它:
@[:]raw/file_name
在Java代码可以通过下面的语法访问它:
[.]R.raw.
AssetManager是一个专门管理/assets/目录下原始资源的管理器类,AssetManager提供了下面的方法来访问Assets资源:
InputStream open(String fileName):根据文件名来获取原始资源对应的输入流。
AssetFileDescripyor openFd(String fileName):根据文件名来获取原始资源对应的AssetFileDescripyor。
AssetFileDescripyor代表了一项原始资源的描述,应用程序可通过AssetFileDescripyor来获取原始资源。
国际化和资源自适应
引入国际化的目的是为了提供自适应、更友好的用户界面,并不需要改变程序的逻辑功能。国际化的英文单词是Internationalization,因为单词太长了,所以也称为I18N。
Java程序的国际化主要通过如下三个类完成:
java.util.ResourceBundle:用瑜伽在一个国家、语言资源包。
java.util.Locale:用于封装一个特定的国家/区域、语言环境。
java.text.MessageFormat:用于格式化带占位符的字符串。
为了实现程序的国际化,必须先提供程序所需要的资源文件。资源文件的命名可以有如下三种形式:
baseName_language_country.properties
baseName_language.properties
baseName.properties
其中baseName是资源文件的基本名,用户可以自由定义。但是language和country都不可以随意变化,必须是Java所支持的语言和国家。
1.Java支持的国家和语言
需要获取Java所支持的国家和语言,可以调用Locale类的getAvailableLocales方法获取,这个方法返回一个Locale数组,数组中包含了Java所支持的国家和语言。
Java程序国际化的关键类是ResourceBundle,它有个静态方法:getBundle(String baseName ,Locale locale)。这个方法会根据Locale加载资源文件,Locale封装了一个国家、语言。
2.位Android应用提供国际化资源
为了给/res/values/目录下的资源文件提供不同国家、语言的版本,不同的values文件夹的命名方式为:
values-语言代码-r 国家代码
不同的drawable文件夹的命名方式为:drawable-语言代码-r 国家代码
自适应不同屏幕的资源
Android设备的屏幕尺寸、分辨率差别非常大,但是又总希望可以在所有的Android设备上运行An冬日的应用,所以开发Android应用就需要考虑不同屏幕的适应性问题。
通常来说,屏幕资源需要考虑如下两个方面:
四种屏幕尺寸所需的最低尺寸:
为了提供自适应不同屏幕的资源,最简单的做法就是为不同屏幕尺寸、不同屏幕分辨率提供相应的布局资源、Drawable资源: