Android读取assets目录下的所有图片并显示的方法
本文实例讲述了Android读取assets目录下的所有图片并显示的方法。分享给大家供大家参考。具体方法分析如下:
在assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件。
1.先在Activity里面调用getAssets()来获取AssetManager引用。
2.再用AssetManager的open(StringfileName,intaccessMode)方法则指定读取的文件以及访问模式就能得到输入流InputStream。
3.然后就是用已经openfile的inputStream读取文件,读取完成后记得inputStream.close()。
4.调用AssetManager.close()关闭AssetManager。
需要注意的是,来自Resources和Assets中的文件只可以读取而不能进行写的操作。
下面看一下在Activity中使用的示例代码:
List<Map<String,Object>>cateList=newArrayList<Map<String,Object>>(); String[]list_image=null; try{ //得到assets/processedimages/目录下的所有文件的文件名,以便后面打开操作时使用 list_image=context.getAssets().list("processedimages"); }catch(IOExceptione1){ //TODOAuto-generatedcatchblock e1.printStackTrace(); } for(inti=0;i<list_image.length;++i) { InputStreamopen=null; try{ Stringtemp="processedimages/"+list_image[i]; open=context.getAssets().open(temp); Bitmapbitmap=BitmapFactory.decodeStream(open); Map<String,Object>map=newHashMap<String,Object>(); map.put("name",list_image[i]); map.put("iv",bitmap); map.put("bg",R.drawable.phone_vip_yes); map.put("cate_id",i); cateList.add(map); //AssignthebitmaptoanImageViewinthislayout }catch(IOExceptione){ e.printStackTrace(); }finally{ if(open!=null){ try{ open.close(); }catch(IOExceptione){ e.printStackTrace(); } } } }
这样所有的map中的关键字“iv"处理论上就保存了我们读取的bitmap,可以结果并非如此,大家应该注意到了在”bg“关键字处我们也保存了一个图片,只不过它是通过R.drawable.方式获取的,实验证明这种方式是可以成功读取并显示的。为什么从assets中读取的bitmap不能显示呢?
解决办法是:
实现ViewBinder接口,对两种的资源id和bitmap情况进行说明:
adapter.setViewBinder(newViewBinder(){ @Override publicbooleansetViewValue( Viewview, Objectdata, StringtextRepresentation){ //TODOAuto-generatedmethodstub if((viewinstanceofImageView)&&(datainstanceofBitmap)){ ImageViewimageView=(ImageView)view; Bitmapbmp=(Bitmap)data; imageView.setImageBitmap(bmp); returntrue; } returnfalse; } });
这样就可以了。
还有一种情况是,我们在非Activity类中读取assets文件下的内容,这个时候就得把调用者(Activity类)的context传递过去,然后在这个非Activity类中使用context.getAssets()方式调用就行了。
举个简单例子:
我们有一个HomeActivity,然后我们它里面调用GetData.initdata(HomeActivity.this).
在GetData类的initdata方法肯定是这样定义的:
publicvoidinitdata(Contextcontext) { //othercodes... String[]list_image=null; try{ //得到assets/processedimages/目录下的所有文件的文件名,以便后面打开操作时使用 list_image=context.getAssets().list("processedimages");//attentionthisline }catch(IOExceptione1) { e1.printStackTrace(); } //othercodes..... }
因为getAssets方法是Context下的方法,在非Activity类中是不能直接使用的。
希望本文所述对大家的Android程序设计有所帮助。