Android读取assets目录下的所有图片并显示的方法
程序员文章站
2022-04-12 12:32:26
本文实例讲述了android读取assets目录下的所有图片并显示的方法。分享给大家供大家参考。具体方法分析如下:
在assets文件夹里面的文件都是保持原始的文件格式,...
本文实例讲述了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();
}
}
}
}
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;
}
});
@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.....
}
{
//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设置全屏代码分享