`
guanxianxiao
  • 浏览: 19479 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Android资源管理框架(Asset Manager)简要介绍和学习

阅读更多

 

 

Android应用程序资源可以分为两大类,分别是assets和res:

1. assets。 assets类资源放在工程根目录的assets子目录下,它里面保存的是一些原始的文件,可以以任何方式来进行组织。这些文件最终会被原装不动地打包在 apk文件中。如果我们要在程序中访问这些文件,那么就需要指定文件名来访问。例如,假设在assets目录下有一个名称为filename的文件,那么 就可以使用以下代码来访问它:

  1. AssetManager am= getAssets();     
  2. InputStream is = assset.open("filename");   

2. res。res类资源放在工程根目录的res子目录下,它里面保存的文件大多数都会被编译,并且都会被赋予资源ID。这样我们就可以在程序中通过ID来访问res类的资源。res类资源按照不同的用途可以进一步划分为以下9种子类型:

 --animator。这类资源以XML文件保存在res/animator目录下,用来描述属性动画。属性动画通过改变对象的属性来实现动画效果,例如,通过不断地修改对象的坐标值来实现对象移动动画,又如,通过不断地修改对象的Alpha通道值来实现对象的渐变效果。

--anim。 这类资源以XML文件保存在res/anim目录下,用来描述补间动画。补间动画和属性动画不同,它不是通过修改对象的属性来实现,而是在对象的原来形状 或者位置的基础上实现一个变换来得到的,例如,对对象施加一个旋转变换,就可以获得一个旋转动画,又如,对对象实施一个缩放变换,就可以获得一个缩放动 画。从数学上来讲,就是在对象的原来形状或者位置的基础上施加一个变换矩阵来实现动画效果。注意,在动画的执行过程中,对象的属性是始终保持不变的,我们 看到的只不过是它的一个变形副本。

--color。这类资源以 XML文件保存在res/color目录下,用描述对象颜色状态选择子。例如,我们可以定义一个选择子,规定一个对象在不同状态下显示不同的颜色。对象的 状态可以划分为pressed、focused、selected、checkable、checked、enabled和window_focused 等7种。

--drawable。这类资源以XML或者Bitmap 文件保存在res/drawable目录下,用来描述可绘制对象。例如,我们可以在里面放置一些图片(.png, .9.png, .jpg, .gif),来作为程序界面视图的背景图。注意,保存在这个目录中的Bitmap文件在打包的过程中,可能会被优化的。例如,一个不需要多于256色的真 彩色PNG文件可能会被转换成一个只有8位调色板的PNG面板,这样就可以无损地压缩图片,以减少图片所占用的内存资源。

--layout。这类资源以XML文件保存在res/layout目录下,用来描述应用程序界面布局。

--menu。这类资源以XML文件保存在res/menu目录下,用来描述应用程序菜单,例如,Options Menu、Context Menu和Sub Menu。

--raw。 这类资源以任意格式的文件保存在res/raw目录下,它们和assets类资源一样,都是原装不动地打包在apk文件中的,不过它们会被赋予资源ID, 这样我们就可以在程序中通过ID来访问它们。例如,假设在res/raw目录下有一个名称为filename的文件,并且它在编译的过程,被赋予的资源 ID为R.raw.filename,那么就可以使用以下代码来访问它:

  1. Resources res = getResources();   
  2. InputStream is = res .openRawResource(R.raw.filename);   

--values。这类资源以XML文件保存在res/values目录下,用来描述一些简单值, 例如,数组、颜色、尺寸、字符串和样式值等,一般来说,这六种不同的值分别保存在名称为arrays.xml、colors.xml、 dimens.xml、strings.xml和styles.xml文件中。

--xml。这类资源以XML文件保存在res/xml目录下,一般就是用来描述应用程序的配置信息。

注意,上述9种类型的资源文件,除了raw类型资源,以及Bitmap文件的drawable类型资源之外,其它的资源文件均为文本格式的XML文件,它 们在打包的过程中,会被编译成二进制格式的XML文件。这些二进制格式的XML文件分别有一个字符串资源池,用来保存文件中引用到的每一个字符串,包括 XML元素标签、属性名称、属性值,以及其它的一切文本值所使用到的字符串。这样原来在文本格式的XML文件中的每一个放置字符串的地方在二进制格式的 XML文件中都被替换成一个索引到字符串资源池的整数值。这样做有两个好处:

A. 文件占用更小。例如,假设在原来的文本格式的XML文件中,有四个地方使用的都是同一个字符串,那么在最终编译出来的二进制格式的XML文件中,字符串资源池只有一份字符串值,而引用它的四个地方只占用一个整数值。

B. 解析速度更快。由于在二进制格式的XML文件中,所有的XML元素标签和属性等值都是使用整数来描述的,因此,在解析的过程中,就不再需要进行字符串解析,这样就可以提高解析速度。

还有另外一个地方需要注意的是,每一个res资源在编译的打包完成之后,都会被分配一个资源ID,这些资源ID被终会被定义为Java常量值,保存在一个 R.java文件中,与应用程序的其它源文件一起被编译到程序中,这样我们就可以在程序或者资源文件中通过这些ID常量来访问指定的资源。

我们接下来再看应用程序资源的组织。应用程序资源的组织方式有18个维度,如图1所示:

图1 应用程序资源的组织方式

注意,图1的表格是来自于官方文档的,它的详细描述可以参考:http://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources。这里有一点需要说明的是,表格中的18个维度是按照优先级从最大到小排列的,这个优先级次序可以帮助系统根据机器的本地配置来在应用程序资源目录中找到最合适的资源来使用。

具体来说,Android资源管理框架按照图2所示的算法流程来在应用程序资源目录中选择最合适的资源:

图2 应用程序资源的匹配算法

注意,图2的算法流程图是来自于官方文档的,它的详细描述可以参考:http://developer.android.com/guide/topics/resources/providing-resources.html#BestMatch。我们同样是通过上述官方文档中的例子来说明上述应用程序资源匹配算法的执行过程。

假设一个应用程序的drawable资源按照以下方式来组织:

  1. drawable/   
  2. drawable-en/   
  3. drawable-fr-rCA/   
  4. drawable-en-port/   
  5. drawable-en-notouch-12key/   
  6. drawable-port-ldpi/   
  7. drawable-port-notouch-12key/   

并且该应用程序所运行在的设置的配置情况如下所示:

  1. Locale = en-GB    
  2. Screen orientation = port    
  3. Screen pixel density = hdpi    
  4. Touchscreen type = notouch    
  5. Primary text input method = 12key   

根据图2所示的算法,Android资源管理框架按照以下步骤来选择一个drawable资源:

Step 1. 消除与设备配置冲突的drawable目录,即drawable-fr-rCA目录,因为设备设置的语言是en-GB。

  1. drawable/   
  2. drawable-en/   
  3. drawable-en-port/   
  4. drawable-en-notouch-12key/   
  5. drawable-port-ldpi/   
  6. drawable-port-notouch-12key/  

Step 2. 从MMC开始,选择一个资源组织维度来过渡从Step 1筛选后剩下来的目录。

Step 3. 检查Step 2选择的维度是否有对应的资源目录。如果没有,就返回到Step 2继续处理。如果有,那么就继续往下执行Step 4。在我们这个例子中,要一直重复执行Step 2,直到检查到language这个维度时。

Step 4. 消除那些不包含有Step 2所选择的资源维度的目录。在我们这个例子中,就是要消除那些不包含有en这个language的目录:

  1. drawable-en/   
  2. drawable-en-port/   
  3. drawable-en-notouch-12key/  

Step 5.  继续执行Step 2、Step 3和Step 4,直到找到一个最匹配的资源目录为止,即剩下最后一个目录为止。在我们这个例子中,下一个要检查的维度是screen orienation。由于设备的screen orienation为port,因此,所有不包含有port资源维度的目录将被消除:

  1. drawable-en-port/   

最后剩下来的目录就只有drawable-en-port,因此,它就是最匹配的资源目录了,这时候所有drawable类型的资源都可以从这个目录中获取。

注意,我们在编译和打包应用程序资源的过程中,会生成一个resources.arsc文件,这个文件记录了所有的应用程序资源目录的信息,包括每一个资 源名称、类型、值、ID以及所配置的维度信息。我们可以将这个resources.arsc文件想象成是一个资源索引表,这个资源索引表在给定资源ID和 设备配置信息的情况下,能够在应用程序的资源目录中快速地找到最匹配的资源。

最后,我们可以通过图3来总结应用程序资源的编译、打包以及查找过程:

图3 应用程序资源的编译、打包以及查找过程

通过图3我们就可以看出:

A. 除了assets和res/raw资源被原装不动地打包进APK之外,其它的资源都会被编译或者处理。 

B. 除了assets资源之外,其它的资源都会被赋予一个资源ID。

C. 打包工具负责编译和打包资源,编译完成之后,会生成一个resources.arsc文件和一个R.java,前者保存的是一个资源索引表,后者定义了各个资源ID常量。

D. 应用程序在运行时通过AssetManager来访问资源,或通过资源ID来访问,或通过文件名来访问。

在接下来的一系列文章中,我们主要关注以下三个关键情景:

1. 应用程序资源的编译和打包过程;

2. 应用程序资源的初始化过程;

3. 应用程序资源的查找过程。

 

转至:http://mobile.51cto.com/android-387419.htm

分享到:
评论

相关推荐

    android激情投篮游戏源代码

    6. **资源管理**:理解如何加载和管理游戏的图像、音频和其他资源,包括使用Android的Asset Manager和XML资源文件。 7. **用户界面(UI)设计**:观察游戏UI的布局和设计,可以学习到如何使用LinearLayout、...

    Android 仿雷电简单飞行游戏.rar

    6. **资源管理**:游戏中涉及到的音效、背景音乐、图片素材等资源,需要通过Asset Manager进行加载和管理。 7. **Boss战**:设计复杂的boss战斗通常需要编写特定的AI逻辑,确保其行为多样且具有挑战性。 8. **随机...

    Android_SDK_Windows

    2. **Android SDK Build-Tools**: 提供构建Android应用所需的工具,例如`aapt`(Android Asset Packaging Tool)处理应用资源,`dx`编译Dalvik字节码,以及`gradle`插件,与Gradle构建系统集成。 3. **Android ...

    从零开始Android游戏编程(第二版)

    9. **游戏资源管理**:了解如何管理和优化图像、音频、纹理等游戏资源,以及如何使用Asset Manager加载资源。 10. **多线程和异步处理**:在游戏开发中,多线程是保证游戏流畅运行的关键,学习如何处理UI线程和工作...

    cocos2d框架.pdf

    - asset-manager-builtins(内建资源管理器):这是一个单例模式的模块,负责管理游戏的内建资源。 - Bundle(资源包):作为一个资源容器,它允许加载和释放资源,提供了一种组织资源的方式。 - Cache(缓存):...

    android游戏开发-抓住疯狂猫

    7. **资源管理**: 游戏的图像、音频和动画等资源需要有效地管理和加载,以确保游戏流畅运行。这可能涉及到使用Android的Asset Manager或者自定义的资源加载机制。 8. **用户界面(UI)设计**: 游戏的UI设计是吸引...

    接苹果Android小游戏源码

    5. **资源管理**:游戏中的图片、音频等资源需要正确加载和管理。Android提供了Asset Manager来访问这些非本地资源。 6. **性能优化**:为了保证游戏在不同设备上的流畅运行,开发者可能对代码进行了优化,如避免...

    Android SDK开发范例大全(第3版)

    - **配置Android虚拟设备(AVD)**:使用Android Studio的AVD Manager来创建和管理虚拟设备,用于模拟运行Android应用。 ### 开发环境搭建 1. **安装Java Development Kit (JDK)**:确保安装了最新版本的JDK,因为...

    Android开发SDK文档

    在SDK中,`build-tools`目录下的工具则用于构建和打包应用,例如`aapt`(Android Asset Packaging Tool)处理资源文件,`dx`转换Java字节码为Dalvik格式,`apktool`用于反编译和重新打包APK,以及Gradle插件用于自动...

    安卓Android源码——游戏源码——忍者快跑.zip

    查看源码可以让我们看到如何使用Android的Asset Manager加载资源,以及如何优化资源加载以减少内存消耗。 5. **触摸事件处理**: 在移动设备上,触摸事件是游戏交互的主要方式。分析源码可以让我们理解如何使用...

    Android游戏源码高仿植物大战僵尸防守类游戏香蕉树之恋

    源码会展示如何组织和加载这些资源,包括使用Android的Asset Manager加载非本地资源,以及使用Sprite和Animation类来处理2D图形。 5. **碰撞检测**:在游戏交互中,碰撞检测是必不可少的。源码会包含物体间碰撞的...

    Android常用开发工具

    开发者可以使用SDK Manager来下载和管理不同版本的Android API和工具。 3. **AVD (Android Virtual Device)**: 用于模拟Android设备,帮助开发者在多种设备配置上测试应用,无需物理设备。 4. **Git**: 版本控制...

    安卓冒险游戏源码可直接运行类似于精灵快跑这种可做毕业设计.zip

    6. **资源管理**:游戏中的音效、图片、动画等资源的加载和管理是必不可少的,Android提供了Asset Manager和Resources API来处理这些。 7. **网络通信**:如果游戏有在线功能,如排行榜、成就系统,那么可能使用了...

    tankuang.rar

    Android提供了Asset Manager来加载非本地资源,有效的资源管理可以减少内存消耗并提高加载速度。 5. **用户交互**: - 游戏可能支持触摸屏控制,通过监听MotionEvent来实现玩家的操作。同时,可能会有游戏菜单和...

    fllapy bird 自己写的,效果和原app一样

    Android提供了Asset Manager和Resources类来加载和管理资源,确保游戏在不同设备上的表现一致。 7. **性能优化**:为了提供流畅的游戏体验,开发者需要关注性能优化,包括减少不必要的绘制、合理使用线程、避免内存...

    Unity3d中文手册

    7. **资源管理**:如何有效地导入、导出和打包资源,以及Asset Pipeline的工作原理。 8. **UI系统**:介绍Unity的UI系统,包括Canvas、Image、Text、Button等元素的创建和布局设计。 9. **移动设备适配**:针对iOS...

    Libgdx开发丛书之 Learning LibGDX Game Development, 2nd Edition

    8. **Asset Manager**:资产管理器帮助开发者高效地加载、管理和释放游戏资源,如音频、图像和字体。 9. **Extension库**:LibGDX还有一系列扩展库,如Scene2D UI、Ashley(实体组件系统)和Tiled Map Editor支持,...

    BattleCity:基于 Android 的坦克大战游戏开发

    Android的Asset Manager可以帮助开发者方便地访问和使用这些资源,同时需要考虑资源的优化,避免内存泄漏和性能问题。 7. **多线程编程**:为了保证游戏的流畅性,通常会将游戏逻辑和UI更新放在不同的线程中处理。...

    libgdx引擎开发的游戏

    7. **Asset Manager**: 资产管理器(AssetManager)是libgdx用来加载和管理资源的重要工具。在Cuboc中,它可能被用于加载纹理、音频文件等,确保资源的异步加载和释放,避免内存泄漏。 8. **Sound and Music**: ...

    NinjaTower:使用 libGDX 用 Ja​​va 制作的简单横向卷轴游戏,主要针对 Android

    4. **Asset Manager**:资源管理器,用于加载和管理游戏中的音效、图像、音乐等资产。 5. **Box2D**集成:提供了物理引擎,可以创建真实感的物理模拟效果。 二、NinjaTower游戏特点 1. **横向卷轴**:游戏以水平...

Global site tag (gtag.js) - Google Analytics