zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Android读取assets目录下的所有图片并显示的方法

Android方法 图片 显示 目录 所有 读取 assets
2023-06-13 09:15:30 时间

本文实例讲述了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程序设计有所帮助。