广

android开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

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

    2018-05-03 14:17: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程序设计有所帮助。

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告