html5中文学习网

您的位置: 首页 > android » 正文

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

[ ] 已经帮助:人解决问题

本文实例讲述了Android读取assets目录下的所有图片并显示的方法。分享给大家供大家参考。具体方法分析如下:3xcHTML5中文学习网 - HTML5先行者学习网

在assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件。3xcHTML5中文学习网 - HTML5先行者学习网
1. 先在Activity里面调用getAssets() 来获取AssetManager引用。3xcHTML5中文学习网 - HTML5先行者学习网
2. 再用AssetManager的open(String fileName, int accessMode) 方法则指定读取的文件以及访问模式就能得到输入流InputStream。 3xcHTML5中文学习网 - HTML5先行者学习网
3. 然后就是用已经open file 的inputStream读取文件,读取完成后记得inputStream.close() 。3xcHTML5中文学习网 - HTML5先行者学习网
4.调用AssetManager.close() 关闭AssetManager。3xcHTML5中文学习网 - HTML5先行者学习网
需要注意的是,来自Resources和Assets 中的文件只可以读取而不能进行写的操作。3xcHTML5中文学习网 - HTML5先行者学习网
下面看一下在Activity中使用的示例代码:3xcHTML5中文学习网 - HTML5先行者学习网

复制代码 代码如下:
List<Map<String, Object>> cateList = new ArrayList<Map<String, Object>>();  3xcHTML5中文学习网 - HTML5先行者学习网
String[] list_image = null;  3xcHTML5中文学习网 - HTML5先行者学习网
try {  3xcHTML5中文学习网 - HTML5先行者学习网
//得到assets/processedimages/目录下的所有文件的文件名,以便后面打开操作时使用  3xcHTML5中文学习网 - HTML5先行者学习网
    list_image = context.getAssets().list("processedimages");  3xcHTML5中文学习网 - HTML5先行者学习网
} catch (IOException e1) {  3xcHTML5中文学习网 - HTML5先行者学习网
    // TODO Auto-generated catch block  3xcHTML5中文学习网 - HTML5先行者学习网
    e1.printStackTrace();  3xcHTML5中文学习网 - HTML5先行者学习网
3xcHTML5中文学习网 - HTML5先行者学习网
for(int i=0;i<list_image.length;++i)  3xcHTML5中文学习网 - HTML5先行者学习网
3xcHTML5中文学习网 - HTML5先行者学习网
    InputStream open = null;  3xcHTML5中文学习网 - HTML5先行者学习网
    try {  3xcHTML5中文学习网 - HTML5先行者学习网
  String temp = "processedimages/"+list_image[i];  3xcHTML5中文学习网 - HTML5先行者学习网
  open = context.getAssets().open(temp);  3xcHTML5中文学习网 - HTML5先行者学习网
  Bitmap bitmap = BitmapFactory.decodeStream(open);  3xcHTML5中文学习网 - HTML5先行者学习网
  Map<String, Object> map = new HashMap<String, Object>();  3xcHTML5中文学习网 - HTML5先行者学习网
  map.put("name", list_image[i]);  3xcHTML5中文学习网 - HTML5先行者学习网
  map.put("iv", bitmap);  3xcHTML5中文学习网 - HTML5先行者学习网
  map.put("bg", R.drawable.phone_vip_yes);  3xcHTML5中文学习网 - HTML5先行者学习网
  map.put("cate_id",i);  3xcHTML5中文学习网 - HTML5先行者学习网
  cateList.add(map);  3xcHTML5中文学习网 - HTML5先行者学习网
  // Assign the bitmap to an ImageView in this layout  3xcHTML5中文学习网 - HTML5先行者学习网
    } catch (IOException e) {  3xcHTML5中文学习网 - HTML5先行者学习网
  e.printStackTrace();  3xcHTML5中文学习网 - HTML5先行者学习网
      } finally {  3xcHTML5中文学习网 - HTML5先行者学习网
  if (open != null) {  3xcHTML5中文学习网 - HTML5先行者学习网
    try {  3xcHTML5中文学习网 - HTML5先行者学习网
      open.close();  3xcHTML5中文学习网 - HTML5先行者学习网
    } catch (IOException e) {  3xcHTML5中文学习网 - HTML5先行者学习网
      e.printStackTrace();  3xcHTML5中文学习网 - HTML5先行者学习网
    }  3xcHTML5中文学习网 - HTML5先行者学习网
  }  3xcHTML5中文学习网 - HTML5先行者学习网
       }  3xcHTML5中文学习网 - HTML5先行者学习网
}
3xcHTML5中文学习网 - HTML5先行者学习网
这样所有的map中的关键字“iv"处理论上就保存了我们读取的bitmap,可以结果并非如此,大家应该注意到了在”bg“关键字处我们也保存了一个图片,只不过它是通过R.drawable.方式获取的,实验证明这种方式是可以成功读取并显示的。为什么从assets中读取的bitmap不能显示呢?3xcHTML5中文学习网 - HTML5先行者学习网

解决办法是:3xcHTML5中文学习网 - HTML5先行者学习网

实现 ViewBinder接口,对两种的资源id和bitmap 情况进行说明:3xcHTML5中文学习网 - HTML5先行者学习网

复制代码 代码如下:
adapter.setViewBinder(new ViewBinder() {  3xcHTML5中文学习网 - HTML5先行者学习网
              3xcHTML5中文学习网 - HTML5先行者学习网
    @Override  3xcHTML5中文学习网 - HTML5先行者学习网
    public boolean setViewValue(  3xcHTML5中文学习网 - HTML5先行者学习网
     View view,  3xcHTML5中文学习网 - HTML5先行者学习网
     Object data,  3xcHTML5中文学习网 - HTML5先行者学习网
     String textRepresentation) {  3xcHTML5中文学习网 - HTML5先行者学习网
 // TODO Auto-generated method stub  3xcHTML5中文学习网 - HTML5先行者学习网
  if((view instanceof ImageView) && (data instanceof Bitmap)) {    3xcHTML5中文学习网 - HTML5先行者学习网
  ImageView imageView = (ImageView) view;    3xcHTML5中文学习网 - HTML5先行者学习网
  Bitmap bmp = (Bitmap) data;    3xcHTML5中文学习网 - HTML5先行者学习网
  imageView.setImageBitmap(bmp);    3xcHTML5中文学习网 - HTML5先行者学习网
  return true;    3xcHTML5中文学习网 - HTML5先行者学习网
     }    3xcHTML5中文学习网 - HTML5先行者学习网
 return false;  3xcHTML5中文学习网 - HTML5先行者学习网
    }  3xcHTML5中文学习网 - HTML5先行者学习网
});
3xcHTML5中文学习网 - HTML5先行者学习网
这样就可以了。3xcHTML5中文学习网 - HTML5先行者学习网
还有一种情况是,我们在非Activity类中读取assets文件下的内容,这个时候就得把调用者(Activity类)的context传递过去,然后在这个非Activity类中使用context.getAssets()方式调用就行了。3xcHTML5中文学习网 - HTML5先行者学习网

举个简单例子:3xcHTML5中文学习网 - HTML5先行者学习网
我们有一个HomeActivity,然后我们它里面调用GetData.initdata(HomeActivity.this).3xcHTML5中文学习网 - HTML5先行者学习网
在GetData类的initdata方法肯定是这样定义的:3xcHTML5中文学习网 - HTML5先行者学习网

复制代码 代码如下:
public void initdata(Context context)3xcHTML5中文学习网 - HTML5先行者学习网
{3xcHTML5中文学习网 - HTML5先行者学习网
//other codes...3xcHTML5中文学习网 - HTML5先行者学习网
      String[] list_image = null;3xcHTML5中文学习网 - HTML5先行者学习网
     try {3xcHTML5中文学习网 - HTML5先行者学习网
     //得到assets/processedimages/目录下的所有文件的文件名,以便后面打开操作时使用3xcHTML5中文学习网 - HTML5先行者学习网
                list_image = context.getAssets().list("processedimages");//attention this line3xcHTML5中文学习网 - HTML5先行者学习网
          } catch (IOException e1)3xcHTML5中文学习网 - HTML5先行者学习网
            {3xcHTML5中文学习网 - HTML5先行者学习网
                e1.printStackTrace();3xcHTML5中文学习网 - HTML5先行者学习网
            }3xcHTML5中文学习网 - HTML5先行者学习网
      //other codes.....3xcHTML5中文学习网 - HTML5先行者学习网
}
3xcHTML5中文学习网 - HTML5先行者学习网

因为getAssets方法是Context下的方法,在非Activity类中是不能直接使用的。3xcHTML5中文学习网 - HTML5先行者学习网

希望本文所述对大家的Android程序设计有所帮助。3xcHTML5中文学习网 - HTML5先行者学习网

(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助