15

我正在android上构建一个非常基本的画廊,它显示相机文件夹中的最后一张图片,用户可以向左滑动查看前一张。

我完成了一个使用 viewpager 的实现,以及一个使用 sampleSize 缩放图像的 pagerAdapter。我的问题是,该实现远不如默认图库应用程序高效,每次滑动图像时,您都必须等待大约 200 毫秒才能加载下一个图像。所以基本上我关于如何实现它的想法是行不通的。

我怎样才能有效地做到这一点,如果可能的话,使用允许稍后放大和缩小的实现?


这看起来很有希望,但我不知道如何用文件而不是可绘制文件来实现它 http://www.androidviews.net/2012/11/photoview/


编辑:

我已经设法使用photoview(一个被黑的viewpager)提高了一点速度,但是将文件路径转换为位图或drawables需要太多时间。

我已经尝试了 dilix 和 iDroid Explorer 建议的这两种方法:

// Method A
Drawable d = Drawable.createFromPath(imagePath);
imageView.setImageDrawable(d);

// Method B
Bitmap myBitmap = BitmapFactory.decodeFile(imagePath);
imageView.setImageBitmap(myBitmap);

但两者都会产生错误Bitmap too large to be uploaded into a texture。我需要尽快将图像获取到 imageView 并以某种方式绕过此错误,也许我会获得不错的速度。现在我正在缩放图像并将它们转换为可绘制的,但它不是很有效。

4

4 回答 4

3

检查这个很棒的网站:http ://www.androidviews.net/ ,也许这就是你想要的:http ://www.androidviews.net/2012/11/photoview/

它有你需要的页面滚动、缩放和平移我已经在我的项目中使用了它,并进行了一些修改和延迟图像加载。它完全按照您的需要工作。

于 2013-01-22T05:16:59.910 回答
1

1)

这看起来很有希望,但我不知道如何用文件而不是可绘制文件来实现它http://www.androidviews.net/2012/11/photoview/

您不必在适配器中存储可绘制对象列表,而是存储指向 sd 卡上文件的链接,然后加载它。

2)但我可以想象文件而不是drawables不会那么有效,因为要从文件加载你必须从sd卡解析它。

我认为您可以通过同时在内存中加载多个图像(压缩)来节省时间,当您滑动到其他图像时,您已经拥有图像和内存,并且在滑动时您可以开始在内存中加载其他图像。

翻阅画廊时,您可能无法加载图像并在几乎停止后加载它。

这是主要问题:内存消耗与性能。

更新

我认为比自己探索更好的是探索谷歌画廊的现有代码:https ://github.com/CyanogenMod/android_packages_apps_Gallery

正如我所检查的那样——它们存储缓存(几乎就像我所说的加载多个位图)并且只存储调整大小的图像——似乎很有效。

于 2013-01-29T13:42:04.310 回答
1

我不确定你是否得到了正确的解决方案。但是,如果您想使用给定的链接继续您自己的实现,那么:

http://www.androidviews.net/2012/11/photoview/   //this link is given in your question

您可以查看此 SO,了解如何将文件路径转换为可绘制对象。现在,您可以绘制指定文件并在您提供的链接上实现。

我认为该链接会很好用。

随意发表评论。

于 2013-01-30T04:02:13.330 回答
1

请参阅官方文档以获取一个很好的示例,该示例将引导您有效地使用带有 viewpager 的位图。您应该使用已经加载的图像的缓存,并且图像应该在 UI 线程之外加载。您还希望将图像缩放到显示所需的最小尺寸(通常是 2 的幂 - 请注意,图像不会总是按您的要求缩放!) ViewPager 还会在后台加载图像以准备下一个slide,用 setOffScreenPageLimit 方法设置的(默认通常是好的,我觉得是 2)

https://developer.android.com/training/displaying-bitmaps/index.html

于 2013-01-29T13:45:13.573 回答