Android中批处理drawable-xxx目录中图片资源的那些事儿
2015-08-05 13:19
417 查看
看到这个题目的时候,我想多少有人会觉得诧异。是的,当我在编程中需要通过代码的方式控制27张图片像幻灯片一样按固定时间顺序播放的时候,我想把自己是如何做的记录下来和大家一起分享,同时也是为了对抗自己的遗忘曲线吧。当我为这片文章起名的时候突然想到了之前看过的《明朝那些事儿》,《互联网的那点事》。想了想这些名字其实就是想告诉人们一些事,很有分享精神。索性起名《Android中批处理drawable-xxx目录中图片资源的那些事儿》,代表自己的一种分享态度。
在Android平台的技术学习或开发项目中,有时我们会遇到对图片的批量处理,比如依次播放图片,依次上传图片等。我先简单介绍一下图片拷贝到drawable-xxx目录后发生了些什么事?当我们把图片拷贝到drawable-xxx目录后,会在项目文件gen/项目包名/R.java中生成一个内部类 public static
final class drawable,这个类中封装了drawable-xxx目录下所有图片的索引。命名方式如: public static final int i1=0x7f020000; 这个索引一唯一的。Android之所以提供这样的索引目的当然是为了使用资源的方便,Android中还有其他类型资源,比如颜色资源,尺寸资源,样式资源,字符串资源,id资源,他们都会在定义之后自动在R.java文件中产生对应的内部类封装资源索引,本次我们只谈图片资源。如下图:
图片资源目录:
![](http://img.blog.csdn.net/20150805135414497?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
R.java文件中的图片资源索引内部类:
![](http://img.blog.csdn.net/20150805154916844?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
由上图不难发现一些规律,那就是图片在drawable-xxx目录中的排序并不是按先拷贝就排在前面,后拷贝的就排在后面,
而是以字母或数字的自然顺序进行的(自然顺序是a到z,0到9)。并且生成的R.java中的索引排序和drawable-xxx目录中图片的排序是一样的。索引类型是int型,每个索引的值都是一个按16进制表示的值,相邻的索引值之间的差值为1,也就是每一个索引的下一个索引值都比当前索引的值大1。知道这些规律有什么用呢?知道这些规律我们可以将要批量处理的图片名称按这样的规律命名,将会大大提高访问图片的便捷性。就拿我遇到的那个需求为例:
图片命名方式一:(从左到右)
i1, i10, i11, i12, i13, i14 , i15, i16, i17, i18, i19,
i2, i20 , i21, i22, i23, i24, i25, i26, i27, i28, i29,
i3, i30, i31, i32, i33
当图片如上命名时,drawable-xxx中的图片就会从i1到i33依次排序,R.java中drawable索引也会从i1到i33依次排序。
在代码中,定义一个长度为27的Drawable图片类型的数组:
Drawable [] pics = new Drawable[27];
循环通过图片索引会的图片资源对象,然后存入pics数组中:
for(int i=0;i<27;i++){
//红字体部分充分利用上述图片命名规律,才使得循环获取Drawable方便起来
pics[i] = getResource().getDrawable(R.drawable.i1+i);
}
图片命名方式二:(从左到右)
i1, i2, i3, i4, i5, i6 , i7, i8, i9, i10,
i11, i12, i13 , i14, i15, i16, i17, i18, i19, i20,
i21, i22, i23, i24, i25, i26, i27
我们希望可以从i1到i27这样的顺序批处理图片,但是当我们把这些图片拷贝到drawable-xxx目录中,
图片依然会按字母和数字的自然顺序排序,R.java中的drawable索引自然与drawable-xxx中图片的排序是一致的,
我们可以用如下方式处理:
在代码中,定义一个长度为27的Drawable图片类型的数组:
Drawable [] pics = new Drawable[27];
循环通过图片索引会的图片资源对象,然后存入pics数组中:
for(int i=0;i<27;i++){
//红字体部分充分利用上述图片命名规律,才使得循环获取Drawable方便起来
int id = getResources().getIdentifier("i" + (i + 1), "drawable","com.kedi.r_demo");
pics[i] = getResources().getDrawable(id);
}
最后要说的是,我们已经把所有的要批量处理的图片对象存放到名为pics的数值中了,至于要将这些图片用来做什么,就看大家自己的需求了,大家可以看我的博文《Android游戏特效》篇来实践一下今天分享的内容。
在Android平台的技术学习或开发项目中,有时我们会遇到对图片的批量处理,比如依次播放图片,依次上传图片等。我先简单介绍一下图片拷贝到drawable-xxx目录后发生了些什么事?当我们把图片拷贝到drawable-xxx目录后,会在项目文件gen/项目包名/R.java中生成一个内部类 public static
final class drawable,这个类中封装了drawable-xxx目录下所有图片的索引。命名方式如: public static final int i1=0x7f020000; 这个索引一唯一的。Android之所以提供这样的索引目的当然是为了使用资源的方便,Android中还有其他类型资源,比如颜色资源,尺寸资源,样式资源,字符串资源,id资源,他们都会在定义之后自动在R.java文件中产生对应的内部类封装资源索引,本次我们只谈图片资源。如下图:
图片资源目录:
R.java文件中的图片资源索引内部类:
由上图不难发现一些规律,那就是图片在drawable-xxx目录中的排序并不是按先拷贝就排在前面,后拷贝的就排在后面,
而是以字母或数字的自然顺序进行的(自然顺序是a到z,0到9)。并且生成的R.java中的索引排序和drawable-xxx目录中图片的排序是一样的。索引类型是int型,每个索引的值都是一个按16进制表示的值,相邻的索引值之间的差值为1,也就是每一个索引的下一个索引值都比当前索引的值大1。知道这些规律有什么用呢?知道这些规律我们可以将要批量处理的图片名称按这样的规律命名,将会大大提高访问图片的便捷性。就拿我遇到的那个需求为例:
图片命名方式一:(从左到右)
i1, i10, i11, i12, i13, i14 , i15, i16, i17, i18, i19,
i2, i20 , i21, i22, i23, i24, i25, i26, i27, i28, i29,
i3, i30, i31, i32, i33
当图片如上命名时,drawable-xxx中的图片就会从i1到i33依次排序,R.java中drawable索引也会从i1到i33依次排序。
在代码中,定义一个长度为27的Drawable图片类型的数组:
Drawable [] pics = new Drawable[27];
循环通过图片索引会的图片资源对象,然后存入pics数组中:
for(int i=0;i<27;i++){
//红字体部分充分利用上述图片命名规律,才使得循环获取Drawable方便起来
pics[i] = getResource().getDrawable(R.drawable.i1+i);
}
图片命名方式二:(从左到右)
i1, i2, i3, i4, i5, i6 , i7, i8, i9, i10,
i11, i12, i13 , i14, i15, i16, i17, i18, i19, i20,
i21, i22, i23, i24, i25, i26, i27
我们希望可以从i1到i27这样的顺序批处理图片,但是当我们把这些图片拷贝到drawable-xxx目录中,
图片依然会按字母和数字的自然顺序排序,R.java中的drawable索引自然与drawable-xxx中图片的排序是一致的,
我们可以用如下方式处理:
在代码中,定义一个长度为27的Drawable图片类型的数组:
Drawable [] pics = new Drawable[27];
循环通过图片索引会的图片资源对象,然后存入pics数组中:
for(int i=0;i<27;i++){
//红字体部分充分利用上述图片命名规律,才使得循环获取Drawable方便起来
int id = getResources().getIdentifier("i" + (i + 1), "drawable","com.kedi.r_demo");
pics[i] = getResources().getDrawable(id);
}
最后要说的是,我们已经把所有的要批量处理的图片对象存放到名为pics的数值中了,至于要将这些图片用来做什么,就看大家自己的需求了,大家可以看我的博文《Android游戏特效》篇来实践一下今天分享的内容。
相关文章推荐
- Android Wifi锁之WifiLock
- Android中ListView包含CheckBox时滑动丢失选中状态的解决
- Android进程与内存及内存泄露
- android应用中去掉标题栏的方法
- android.os.NetworkOnMainThreadException 异常处理
- Android(java)学习笔记140:SpannableString类的使用
- Android 绘制计时器
- 界面布局(1)
- VS2015 VisualStudio Emulator for Android 模拟器目录
- 分享一些大牛的Android博客
- Android基础之结束所有Activity通用方法
- Android Studio的复制一行快捷键与Windows7屏幕旋转快捷键冲突
- Android开发中,那些让你觉得相见恨晚的方法、类或接口
- 菜鸟学Android第一天
- Android基础之使用inflater来实现动态加载布局
- Android SDK NDK API文档等下载地址
- Android开发笔记----简单的方法实现打电话和浏览网页
- SSH服务器与Android通信(2)--Android客户端接收数据
- 【Android应用开发技术:媒体开发】打印
- 【Android应用开发技术:动画开发】章节目录