android – 如何实现图库(本地图片)

android – 如何实现图库(本地图片),第1张

概述目前我正在制作一个应用程序来显示SD卡的图像.基本上你可以制作一张相册并添加图片,无论是来自MediaStore选择器的相机. 我试过实现2种方法: >标准图库应用程序,带有自定义BaseAdapter以返回视图 >具有自定义PagerAdapter的viewpager 我不想显示网格视图,所以它应该立即全屏.之后,我想禁用向左和向右滑动,只听取点击次数. Atm这两种方法都在纵向模式下工作.当我 目前我正在制作一个应用程序来显示SD卡的图像.基本上你可以制作一张相册并添加图片,无论是来自MediaStore选择器的相机.

我试过实现2种方法:

>标准图库应用程序,带有自定义BaseAdapter以返回视图
>具有自定义PagerAdapter的vIEwpager

我不想显示网格视图,所以它应该立即全屏.之后,我想禁用向左和向右滑动,只听取点击次数.

Atm这两种方法都在纵向模式下工作.当我切换到横向时,一些图像就会掉落

03-20 12:20:56.515: W/Openglrenderer(17398): Bitmap too large to be uploaded into a texture

然后是内存不足错误.堆栈溢出如果有关于OOM和库的问题,你应该回收视图使它们工作,因为convertVIEw在来自BaseAdapter的getVIEw中总是为null.

所以我使用回收器来查看视图,我将其限制为2个视图,并且纵向模式适用于方法1(使用库).景观仍然给我同样的问题.

对于方法2(vIEwflipper),它处理视图

@OverrIDepublic voID destroyItem(VIEwGroup container,int position,Object object) {

从来没有被称为btw …但肖像模式在这里工作.景观仍然崩溃.

获取位图的方法:

public static Bitmap getBitmap(Context ctx,int imageID,ImageVIEw target) {    String file = getPath(ctx,imageID);    BitmapFactory.Options bmOptions = new BitmapFactory.Options();    bmOptions.inJustDecodeBounds = true;    BitmapFactory.decodefile(file,bmOptions);    WindowManager mgr = (WindowManager)         ctx.getSystemService(Context.WINDOW_SERVICE);    int scaleFactor = 1;    if (mgr != null) {        // Get the dimensions of the VIEw        int targetW = mgr.getDefaultdisplay().getWIDth();        int targetH = mgr.getDefaultdisplay().getHeight();        Log.d(TAG,"Image wIDth + height=" + targetW + "," + targetH);        int photoW = bmOptions.outWIDth;        int photoH = bmOptions.outHeight;        // Determine how much to scale down the image        scaleFactor = Math.min(photoW / targetW,photoH / targetH);    } else {        Log.d(TAG,"Target is null");    }    // Get the dimensions of the bitmap    // Decode the image file into a Bitmap sized to fill the VIEw    bmOptions.inJustDecodeBounds = false;    bmOptions.inSampleSize = scaleFactor;    bmOptions.inPurgeable = true;    logHeap(ImageHelper.class);    Bitmap bm = BitmapFactory.decodefile(file,bmOptions);    if (target != null) {        target.setimageBitmap(bm);    }    return bm;}

工作正常,我知道我使用窗口管理器来获取屏幕大小,但这是因为当我给它充气时,我的ImageVIEw仍然是大小(0,0).然后我打电话

imgVIEw.setLayoutParams(new gallery.LayoutParams(            gallery.LayoutParams.FILL_PARENT,gallery.LayoutParams.FILL_PARENT));    imgVIEw.setScaleType(ImageVIEw.ScaleType.CENTER_INSIDE);

似乎什么都行不通……

请注意,我不使用APK中包含的drawable或任何其他资源.
这个画廊应该能够从SD卡或相机中加载任何质量的图片.很明显,图库应该能够处理目录中的图像.

有人可以帮我解决以下问题吗?

>有没有办法让默认的gallery立即全屏显示并阻挡网格视图?这样我只需要一个适配器来提供图像而不是自己创建视图. (也许这解决了OOM崩溃)
>我的Bitmap解码功能好吗?我是否需要建立一些黑客来捕捉景观变化?
>什么是使用vIEwpager或画廊制作我需要的画廊的最佳方式?
>有没有人有一些不会崩溃的全屏画廊的示例代码?

解决方法 这是我过去曾经遇到过几次的问题. @R_404_5561@实际上发布了一篇关于此的文章.

问题在于用于解码图像的inSampleSize.由于不同的设备具有不同的屏幕和内存大小(VM堆大小可能从12到64或更多Mb),因此您无法以相同的方式对所有图像进行解码.例如,具有12Mb堆内存的320×240设备中的图像应该是inSampleSize,而1280×720 64Mb堆内存设备应该使用另一个inSampleSize(更大的一个).

我攻击的文章显示了一种有效的方式来渲染给定高度和宽度的图像.特别注意最后一个代码段,它们“预先打开”文件并计算inSampleSize以便稍后进行“完全解码”.

我还想补充一下这些建议.

>以异步方式使用“getBitmap”函数,调用新线程或asyncTask(这样做是因为使用SD需要时间,这会导致应用程序挂起,速度慢并且在低中期给人留下不好的印象终端设备.>尝试始终使用相同的Bitmap对象.避免创建多个“Bitmap bitmap = new Bitmap()”.您必须意识到加载的位图存储在ram中,一旦分配给视图,垃圾收集器就越难以获取它们.>完成使用Bitmap后,将其设为null.这样,想象你有12Mb最大堆RAM.你的应用现在正在使用8Mb.垃圾收集器启动并且无法获得更多未使用的RAM.在将数据分配给ImageVIEw并以某种方式保留其引用之后,10位图快速永远不会使它们为空.假设每个位图占用500Kb的Ram你的应用程序将崩溃.使用后始终将Bitmaps设为null.>最后使用@R_404_5561@ platform-tools中提供的DDMS(你可以通过eclipse访问它来调试并查看你的内存使用情况,你也可以强制垃圾收集来查看你的应用程序的行为).

总结

以上是内存溢出为你收集整理的android – 如何实现图库(本地图片)全部内容,希望文章能够帮你解决android – 如何实现图库(本地图片)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1124471.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存