Android中批处理drawable-xxx目录中图片资源的那些事儿

来源:互联网 发布:巴西经济现状数据 编辑:程序博客网 时间:2024/05/16 11:23

          看到这个题目的时候,我想多少有人会觉得诧异。是的,当我在编程中需要通过代码的方式控制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游戏特效》篇来实践一下今天分享的内容。






0 0
原创粉丝点击