看到这个题目的时候,我想多少有人会觉得诧异。是的,当我在编程中需要通过代码的方式控制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文件中产生对应的内部类封装资源索引,本次我们只谈图片资源。如下图:

图片资源目录:

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游戏特效》篇来实践一下今天分享的内容。






更多相关文章

  1. 实现android上传多张图片和文字给php后台
  2. Android(安卓)将Activity打成jar包供第三方调用
  3. android的轮播图Banner之本地加载和网络加载图片
  4. Android使用Glide加载带图片列表时,快速上拉加载更多会闪烁
  5. 让你“过五关,斩六将”轻松入大厂。类比于微信,如何对Apk进行极限
  6. Android简易实战教程--第二十八话《加载大图片》
  7. android 将res内图片文件通过Bitmap对象存到手机本地中
  8. Android应用瘦身,从18MB到12.5MB
  9. 第三部分:Android(安卓)应用程序接口指南---第三节:应用程序资源--

随机推荐

  1. android task与back stack 开发文档翻译
  2. 说不懂Android系统构架,太亏了!
  3. Android(安卓)imageView图片按比例缩放
  4. Android(安卓)GWES之Android窗口管理
  5. Android学习 2 -建立模拟器
  6. Android(安卓)文件布局一些细节备忘
  7. Android(安卓)Support v4、v7、v13的区别
  8. 初涉Android蓝牙开发
  9. 让Android中的webview支持页面中的文件上
  10. Android4.4支持使用DevTools对原生Androi