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

作者:shichen2014 时间:2023-03-09 22:06:30 

本文实例讲述了Android读取assets目录下的所有图片并显示的方法。分享给大家供大家参考。具体方法分析如下:

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

List<Map<String, Object>> cateList = new ArrayList<Map<String, Object>>(); 
String[] list_image = null; 
try { 
//得到assets/processedimages/目录下的所有文件的文件名,以便后面打开操作时使用 
    list_image = context.getAssets().list("processedimages"); 
} catch (IOException e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 

for(int i=0;i<list_image.length;++i) 

    InputStream open = null; 
    try { 
  String temp = "processedimages/"+list_image[i]; 
  open = context.getAssets().open(temp); 
  Bitmap bitmap = BitmapFactory.decodeStream(open); 
  Map<String, Object> map = new HashMap<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); 
  // Assign the bitmap to an ImageView in this layout 
    } catch (IOException e) { 
  e.printStackTrace(); 
      } finally { 
  if (open != null) { 
    try { 
      open.close(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
  } 
       } 
}


这样所有的map中的关键字“iv"处理论上就保存了我们读取的bitmap,可以结果并非如此,大家应该注意到了在”bg“关键字处我们也保存了一个图片,只不过它是通过R.drawable.方式获取的,实验证明这种方式是可以成功读取并显示的。为什么从assets中读取的bitmap不能显示呢?

解决办法是:

实现 ViewBinder接口,对两种的资源id和bitmap 情况进行说明:

adapter.setViewBinder(new ViewBinder() { 
             
    @Override 
    public boolean setViewValue( 
     View view, 
     Object data, 
     String textRepresentation) { 
 // TODO Auto-generated method stub 
  if((view instanceof ImageView) && (data instanceof Bitmap)) {   
  ImageView imageView = (ImageView) view;   
  Bitmap bmp = (Bitmap) data;   
  imageView.setImageBitmap(bmp);   
  return true;   
     }   
 return false; 
    } 
});


这样就可以了。
还有一种情况是,我们在非Activity类中读取assets文件下的内容,这个时候就得把调用者(Activity类)的context传递过去,然后在这个非Activity类中使用context.getAssets()方式调用就行了。

举个简单例子:
我们有一个HomeActivity,然后我们它里面调用GetData.initdata(HomeActivity.this).
在GetData类的initdata方法肯定是这样定义的:

public void initdata(Context context)
{
//other codes...
      String[] list_image = null;
     try {
     //得到assets/processedimages/目录下的所有文件的文件名,以便后面打开操作时使用
                list_image = context.getAssets().list("processedimages");//attention this line
          } catch (IOException e1)
            {
                e1.printStackTrace();
            }
      //other codes.....
}

因为getAssets方法是Context下的方法,在非Activity类中是不能直接使用的。

希望本文所述对大家的Android程序设计有所帮助。

标签:Android,读取,assets
0
投稿

猜你喜欢

  • SpringBoot访问windows共享文件的方法

    2023-11-08 13:37:13
  • SpringBoot登录验证码实现过程详解

    2023-04-26 12:24:05
  • Android实现计时与倒计时的方法汇总

    2023-11-09 19:29:28
  • springboot多模块化整合mybatis,mapper自动注入失败问题及解决

    2022-02-20 08:06:29
  • java微信企业号开发之通讯录

    2022-04-28 12:51:40
  • Android仿微信之界面导航篇(1)

    2022-07-06 06:59:50
  • MyBatis逆向⼯程的生成过程

    2023-11-28 17:29:22
  • Springboot基础学习之初识SpringBoot

    2022-08-18 08:48:59
  • Unity实现俄罗斯方块(一)

    2021-06-07 15:30:24
  • Spring中的注解之@Override和@Autowired

    2022-08-07 19:56:47
  • Springboot RestTemplate设置超时时间的简单方法

    2022-06-12 23:40:24
  • MyBatis-Plus自动填充功能失效导致的原因及解决

    2023-05-11 13:16:08
  • C#采用递归实现阶乘的方法

    2022-12-09 09:24:56
  • 高吞吐、线程安全的LRU缓存详解

    2021-10-01 01:40:28
  • WPF实现3D翻牌式倒计时特效

    2021-11-11 16:08:21
  • 一篇文章教你如何用多种迭代写法实现二叉树遍历

    2023-12-23 04:03:29
  • 完整详解Java开发学习路线指南

    2023-05-13 08:34:35
  • Java实现动态获取图片验证码的示例代码

    2023-07-24 22:32:05
  • Android 高仿微信支付数字键盘功能

    2021-08-10 09:36:19
  • Java Bean转Map的那些踩坑实战

    2022-12-26 05:42:23
  • asp之家 软件编程 m.aspxhome.com