Android资源文件夹及资源文件的详细介绍

与其他平台的应用程序一样,Android中的应用程序也会使用各种资源,比如图片,字串等,会把它们放入源码的相应文件夹下面,Android也支持并鼓励开发者把UI相关的布局和元素,用XML资源来实现。总结起来,Android中支持的资源有:
•颜色值                 /res/values               以resources为Root的XML文件,定义形式为<color name>value</color>
•字串                    /res/values                以resources为Root的XML文件<string name>value</string>

•图片                    /res/drawable            直接放入,支持9 Patch可自由拉伸

详细解释:

Android提供了一个自定义的2D图形库来绘制图像和图像.在android.graphics.drawable包中你就可以找到这些用于2维绘画的通用类.

Drawable是通常指的那种可以作画的东西的抽象.你将发现Drawable类扩展出了很多特定的可绘图形类,包括BitmapDrawable,ShapeDrawable,PictureDrawable,LayerDrawable,等等.当然,你也可以从它们派生出你自己的类来定义你自己的Drawable对象,并且以你独有的方式来表现.

有三种方法来定义并实例化一个Drawable:使用一个保存在你的项目资源中的图像;使用一个定义了Drawable属性的XML文件;或使用普通的类对象构造方式.

1.从资源中的图像创建

添加图形到你的应用的一个简单的方式是从你的项目资源中引用一个图像文件.支持的文件格式有PNG(首选),JPG (可接受)和GIF(不推荐).此技术优先用于程序图标,logo,或其它图形,比如用于游戏中的.
要使用一个图像资源,只需把你的文件添加到项目的res/drawable/文件夹下.从这里,你可以在你的代码或XMLlayout中引用它.不论从哪里引用,推荐使用一个资源ID,它是不带扩展名的文件名(例如,my_image.png的ID是my_image).
注:图像资源放在res/drawable/下,可能会在构建过程中自动被aapt工具无损压缩以进行优化.例如,一个不需要超过256种颜色的真彩色PNG可能被转换成一个带有调色板的8位PNG.这将造成保持图像质量不变的情况下,占用更少的内存.所以要注意放在这个文件夹下的图像在构建期间可能会改变.如果你想把一个图像作为比特流读入以转换成一个bitmap,那么应把你的图象放在res/raw/文件夹下,在这里他们不会被优化.

如果你想创建一个Drawable对象,你就可以在在你的XML中定义Drawable,并且把文件保存到项目的res/drawable/文件夹下.然后,通过调用Resources.getDrawable()方法获取并实例化这个对象,把你的XML文件的资源ID传给这个函数。

•图片的颜色        /res/values               以resources为Root的XML文件,定义形式为<drawable name>value</drawable>
•单位资源            /res/values               以resources为Root的XML文件<dimen name>value</dimen>
•菜单                    /res/menu                以menuo为root的XML文件
•布局                    /res/layout                 这个就是GUI的布局和元素 (被编译为屏幕布局(或屏幕的一部分)的XML文件)
•风格和主题        /res/values                以resources为Root的XML文件<style name>value</style>
•动画                    /res/anim                 有二种:一个是帧动画(frame animation),也就是连续变换图片以animation-list为Root的XML文件;另外一种就是补间动画(tweened
animation),它对应于API中的Animation和AnimationSet,有translate、scale、rotate、alpha四种,以set为root来定义,这个set就相当于AnimationSet
目录:
•/res/anim                  用于存放动画

•/res/drawable          存放图片,或等同于图片的资源如shape,或selector

详细解释:

在之前的版本中,只有一个drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三个,这三个主要是为了支持多分辨率。

  drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:

  (1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)

  (2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)

  (3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)

  系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。

  在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。

 

Android的icon尺寸

在运行时,程序为最佳显示效果提供了三种方法:

1.图片缩放

基于当前屏幕的精度,平台自动加载任何未经缩放的限定尺寸和精度的图片。如果图片不匹配,平台会加载默认资源并且在放大或者缩小之后可以满足当前界面的显示要求。例如,当前为高精度屏幕,平台会加载高精度资源(如图片),如果没有,平台会将中精度资源缩放至高精度。

2.自动定义像素尺寸和位置

如果程序不支持多种精度屏幕,平台会自动定义像素绝对位置和尺寸值等,这样就能保证元素能和 精度160的屏幕上一样能显示出同样尺寸的效果。例如,要让WVGA高精度屏幕和传统的HVGA 屏幕一样显示同样尺寸的图片,当程序不支持时,系统会对 程序慌称屏幕分辨率为320×533,在(10,10)到(100,100)的区域内绘制图形完成之后,系统会将图形放大到(15,15)到 (150,150)的屏幕显示区域。

3.兼容更大尺寸的屏幕

当前屏幕超过程序所支持屏幕的上限时,定义supports- screens元素,这样超出显示的基准线时,平台在此显示黑色的背景图。例如,WVGA 中精度屏幕上,如程序不支持这样的大屏幕,系统会谎称是一个320×480的,多余的显示区域会被填充成黑色。

但为了达到最佳的显示效果,最好的方法还是设计多套图片。那就有必要对于所有的屏幕依据精度值进行分级(高中低),之后再设计三套icon:

•/res/menu                 存放Menu

•/res/values               存放修饰性资源:字串,颜色,单位,风格和主题

详细解释:

values文件可以被编译成很多种类型的资源的XML文件。注意:

values文件夹不像其他的res/文件夹,它可以保存任意数量的文件,这些文件保存了要创建资源的描述,而不是资源本身。XML元素类型控制这些资源应该放在R类的什么地方。 尽管这个文件夹里的文件可以任意命名,但还是要遵循一定的惯例(文件命名的惯例是将元素类型包含在该名称之中):

array.xml 定义数组

colors.xml 定义color drawable和颜色的字符串值(color string values)

使用Resource.getDrawable()和Resources.getColor()分别获得这些资源。

 dimens.xml定义尺寸值(dimension value)。

使用Resources.getDimension()获得这些资源。

 strings.xml定义字符串(string)值

使用Resources.getString()或者Resources.getText()获取这些资源。

styles.xml 定义样式(style)对象

res/xml/ 任意的XML文件,在运行时可以通过调用Resources.getXML()读取。

res/raw/ 直接复制到设备中的任意文件。它们无需编译,添加到你的应用程序编译产生的压缩文件中。要使用这些资源,可以调用Resources.openRawResource(),参数是资源的ID,即R.raw.somefilename。

自动生成的R class 在项目文件夹的gen文件夹里面有个R.java,我们平常引用的资源主要引用这个类的变量。 注意:R类是自动生成的,并且它不能被手动修改。当资源发生变动时,它会自动修改。

在代码中使用资源:下面是一个引用资源的语法:R.resource_type.resource_name 或者 android.R.resource_type.resource_name 其中resource_type是R的子类,保存资源的一个特定类型。resource_name是在XML文件定义的资源的name属性,或者有其他文件类型为资源定义的文件名(不包含扩展名,这指的是drawable文件夹里面的icon.png类似的文件,name=icon)。Android包含了很多标准资源,如屏幕样式和按钮背景。要在代码中引用这些资源,必须使用android进行限定,如android.R.drawable.button_background。

•/res/layout                存放UI布局和元素
•/res/raw                    存放运行时想使用的原始文件

•/assets                     存放运行时想使用的原始文件

assets文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像xml,java文件被预编译,可以存放一些图片,html,js,
css等文件。

R.java文件

除了原始文件目录/res/raw和/assets以外,其他的资源在编译的时候都会被第三方软件aapt进行处理,一个是把图片和XML文件进行处理,例如把XML编译成为二进制形式;另外处理的目的就是生成R.java文件,这个文件是访问资源时必须要用到的。
/res目录下面的所有文件都会映射到R.java文件中,以整数Id的形式被标识,相同类型的资源被一个内部类来封装。

在/res中定义或提供资源时的注意事项:
1. 同一个类型,或同一文件夹下面的资源不可以使用相同的文件名,也就是说不能用文件扩展名来区别不同的文件,因为R.java中只保留资源的文件名而不管扩展名,所以如果有二个图片一个是icon.png另一个是icon.jpg,那么在R.java中只会有一个R.drawable.icon。另外一个则会无法访问到。

2. 资源文件的名字必须符合Java变量的命名规则,且不能有大写,只能是'[a-z][0-9]._',否则会有编译错误,因为R.java中的变量Id要与资源中的文件一一对应,也就是说用资源文件名来作为Id的变量名,所以一定要符合Java变量的命名规则,另外它还不能有大写。

3. 除了SDK支持的folder外,不能再有子Folder,虽不会有编译错误,但是子Folder会被完全忽略,如在/res/layout下在建一个子Folder activity(/res/layout/acitivity/,
那么你在生成的R.java中是看不到activity和其内的内容的。

4. 对于资源文件的大小有限制,最好不要让单个文件大于1M,这是SDK文档说明的限制,但具体的我没有进行试验(据说2.2版本以后的可支持到10M,不知道是真的还是假的)

5. 所有/res下面的资源都能通过Resources()并提供Id来访问。

对于大多数资源在编译时会对文件内容进行特殊处理,以方便Apk在运行时访问。
如果想要运行时使用未经处理的原始资源,可以把资源文件放在/res/raw和/assets目录下面

时间: 2024-09-14 08:38:36

Android资源文件夹及资源文件的详细介绍的相关文章

android开发中drawable文件夹下的文件是干什么用

问题描述 android开发中drawable文件夹下的文件是干什么用 android开发中drawable文件夹下的文件是干什么用的是作为对象用,还是作为方法参数用还是如何使用 解决方案 一般是和图片等资源相关的 解决方案二: drawable文件夹一般不放置图片资源,存放一些动画文件.选择器文件.图形配置文件,drawable-mdip/hdip/xhdip文件夹放置图片资源 解决方案三: drawable一般都是放置一些飞图片资源但是又可以管理图片资源的一些xml文件 ,一般都是放置一些s

Android中asset文件夹与raw文件夹的区别深入解析_Android

*res/raw和assets的相同点:1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制.*res/raw和assets的不同点:1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename:assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类.2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹 *读取文件资源:1.读取

android项目中com文件夹和src文件夹的关系是什么

问题描述 android项目中com文件夹和src文件夹的关系是什么 android项目中com文件夹和src文件夹的关系是什么 src里的文件夹里的java文件属于com文件夹的么 src文件夹里面的每一个java文件开头的第一行就声明com包 但是com包里面没有对应src里的java文件 解决方案 com 包只是一个结构.如果你们都公司是百度 那么你们的包路径差不多就是 com.baidu 是你们公司网址的倒置. Src是所有的资源,com包等文件都是在src下就是这样 解决方案二: 没有

Android中asset文件夹与raw文件夹的区别深入解析

*res/raw和assets的相同点:1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. *res/raw和assets的不同点:1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename:assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类.2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹 *读取文件资源:1.读

文件读取-Android jni c++ 如何读取jni文件夹下的文件?

问题描述 Android jni c++ 如何读取jni文件夹下的文件? 在一个jni工程中,jni文件夹的结构如下: jni |--Android.mk |--Application.mk |--filer.h |--file.cpp |--res.txt file.cpp里边的代码如下: #include ""filer.h""#include <fstream>#include <string>using namespace std;j

求解答-android中如何让assets文件夹下的文件显示在Listview中?

问题描述 android中如何让assets文件夹下的文件显示在Listview中? android中如何让assets文件夹下的文件显示在Listview中? 怎么做啊? 求各位大神的源码 谢谢 解决方案 String filenames[] = getResources().getAssets().list(""); 解决方案二: String filenames[] = getResources().getAssets().list(""); 确实能获取到图片

Android 遍历文件夹中所有文件的实例代码

可以获得文件夹中所有文件的路径及文件名. 代码很简单,直接上车,车上再解释: /** * 获取指定目录内所有文件路径 * @param dirPath 需要查询的文件目录 * @param _type 查询类型,比如mp3什么的 */ public static JSONArray getAllFiles(String dirPath, String _type) { File f = new File(dirPath); if (!f.exists()) {//判断路径是否存在 return

Windows文件夹共享及文件权限管理

文件共享管理 1.只可对文件夹共享,如果只是要对某一文件共享,必须先将文件放入共享文件夹下 权限:可以设置被共享的文件夹的权限 缓存:如果共享文件网络切断,用户是否还可以脱机浏览共享文件夹 2.如何访问共享文件夹 单击网上邻居,就可以看到本网段内的所有被共享的文件夹 3.文件夹权限说明 A.文件权限类型说明 读取:此权限可以查看文件夹内的文件名称,子文件夹的属性. 写入:可以在文件夹里写入文件与文件夹.更改文件的属性. 列出文件夹目录:除了"读取"权限外,还有"列出子文件夹&

文件夹里的文件访问验证问题

问题描述 用form验证可以验证页面,但是如果直接输入某个文件下的文件的链接,却可以不用验证而直接下载下来了,比如有个下载园地,下载的资源不是保存在数据库中的而是保存在网站下的某个文件夹里的,该如何让文件夹里的文件访问时也需要验证呢? 解决方案 解决方案二:可以在web.config里面写authorization节解决方案三:如何写解决方案四:想省事的话用ASP.NET的网站管理工具VS-->网站-->ASP.NET配置自己写web.config头很大,一不小心逻辑乱了就出问题了解决方案五: