我正在尝试学习如何在网格视图中显示存储在android手机上的所有图像(我的目标是让用户选择他们想要处理的图像)。
我正在调整教程:
http://developer.android.com/resources/tutorials/views/hello-gridview.html http://pastie.org/2504664上面是我修改过的ImageAdapter类的链接(我认为唯一需要更改的东西)。
在其中,我有一个媒体文件位置的字符串数组,而不是资源id的整数数组,并将它们转换为像这样的位图:
imageView.setImageBitmap(BitmapFactory.decodeFile(picture_paths[position]));
我首先通过:
获取文件位置 public void populateArray(){
Log.v("Jenny","Populating array");
picture_paths = new String[getCount()];
cursor.moveToFirst();
int count = 0;
while(!cursor.isLast() ){
count ++;
picture_paths[cursor.getPosition()] = cursor.getString(0);
cursor.moveToNext();
}
}
只要我的图片少于9张(三列三列),它就像宝石一样好用。
超过这个数,程序就会崩溃,并出现"内存不足"的错误。如果我只是按照教程和使用资源图像,我可以有尽可能多的我喜欢,似乎。
所以:我是不是走错路了?将其作为位图加载到密集型吗?还有其他选择吗?
显示存储在手机上的图像似乎是一项非常微不足道的基本任务。做这件事的"正确"方式是什么?我是否可以让这种方式发挥作用?
编辑:在我的第二部手机(Galaxy)上测试使事情工作得很好(可以显示任何数量的图像,尽管有时光标检索的文件路径似乎是'null')。在我最初的测试手机(myTouch)上,无论我如何尝试显示图像(可绘制的,位图,等等),我都会得到内存错误。为什么我在两部手机上得到不同的表现?
编辑:嗯,可能会发生的一件事是我的myTouch上有更多的图片?我用我的Galaxy拍了更多的照片,现在它也出现了内存错误....网格视图不用于显示照片(如果不是,它有什么用?)在myTouch上仍然限制为9,但在Galaxy上可以达到11
当旋转(即视图重绘)时,两者都崩溃并出现内存不足错误。(虽然不是少量的图片(可能少于6 ?)
试着把你的图片大小调整到原来的一半。
BitmapFactory.Options o = new BitmapFactory.Options();
o.inSampleSize = 5;
Bitmap previewBitmap = Bitmap.createScaledBitmap(
BitmapFactory.decodeFile(picLocation, o),
85,
85,
false);
imageView.setImageBitmap(previewBitmap);
根据文档,这应该将图像大小的数量减少1/5和1/25像素数。提高或降低o.inSampleSize
到其他值取决于你想要什么。此外,在createScaledBitmap
中,您可以通过将85
更改为您想要的任何尺寸来更改位图的大小。
如果没有,其他资源可能会有所帮助:
android -创建位图时内存不足异常
加载图像到位图对象时出现奇怪的内存不足问题
位图大小过大导致内存不足