本章介绍了 assets。assets 是有别于 resources 的另一种资源打包方式,可以被看作随应用打包的微型文件系统,支持任意层次的文件目录结构。因为这个优点,类似游戏这样需要加载大量图片和声音资源的应用通常都会使用它。
GitHub 地址:
完成18章
这章需要用到一个 RecyclerView,其中每个 ViewHolder 对应一个音频文件。如果使用 resources 来管理声音文件,那么 Android 一个一个处理效率将极其低下(毕竟声音是时间敏感的),所以我们使用 Assets 来处理。
1 导入 Assets
在模块的根目录下新建 assets 文件(或者右键点击模块的根目录新建),然后建立需要的资源文件夹并放入资源。
2 处理 Assets
assets 导入后,我们还要能在应用中进行定位、管理记录以及播放。这需要新建一个名为 BeatBox 的资源管理类,代码和相应注释如下:
1 | public class BeatBox { |
3 使用 Assets
获取到资源文件名之后,要将其展示给用户,最终还需要播放这些声音文件。所以,我们得创建一个对象,让它管理资源文件名、用户应该看到的文件名以及其他一些相关信息。在这里,我们创建了一个叫 Sound 的类用来管理一个声音:
1 | public class Sound { |
然后在 BeatBox 类中获取所有的 Sound 对象,这样我们就有了 RecyclerView 的数据集,然后就能够绑定声音和 ViewHolder 了。
4 访问 Assets
Sound 对象定义了 assets 文件路径。但是尝试使用 File 对象打开资源文件是行不通的;
正确的方式是使用 AssetManager:
1 | String assetPath = sound.getAssetPath(); |
这样才能得到标准的 InputStream 数据流。随后,和 Java 中的其他 InputStream 一样,该怎么用就怎么用。
不过,有些 API 可能还会需要 FileDescriptor。(下一章的 SoundPool 类会用到。)这也好办, 如下列代码所示,改调用 AssetManager.openFd(String)方法就行了。
1 | String assetPath = sound.getAssetPath(); |
GitHub Page: kniost.github.io
简书:http://www.jianshu.com/u/723da691aa42