【问题标题】:Android how to do image screen slide?Android怎么做图片屏幕滑动?
【发布时间】:2013-01-05 01:14:03
【问题描述】:

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

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

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


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


编辑:

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

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 并以某种方式绕过此错误,也许我会获得不错的速度。现在我正在缩放图像并将它们转换为可绘制的,但它不是很有效。

【问题讨论】:

标签: java android image-processing


【解决方案1】:

1)

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

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

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

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

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

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

更新

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

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

【讨论】:

  • 也许我误解了你的第一点,我的适配器中有一个文件列表,但我必须将它们转换为可绘制对象,因为我不知道有任何其他方法可以将它们添加到图像视图中像这样的东西(imageView.setImageDrawable(GetDrawable(imagePath, 150, 150));)。有没有办法在不进行这种转换的情况下显示图像?它可能会节省大量资源
  • 您可以加载位图(压缩后,您可以一次加载例如 3 个 - 当前、上一个和下一个)并将此位图加载到视图中,如下所示:stackoverflow.com/questions/4181774/…
  • 我刚刚尝试了另一个问题的实现,但我得到了错误:Bitmap too large to be uploaded into a texture (2560x1920, max=2048x2048) 虽然看起来很接近。这与压缩有关吗?我不知道如何加载它们压缩,你知道如何绕过这个错误吗?
  • 我还不能确定,但​​如果这可行,我就不必将图像转换为可绘制对象,也许我会节省几毫秒。顺便说一句,我想我已经一次加载了 3 张图像,因为 viewpager 会自动预加载同级屏幕
  • "位图太大,无法上传到纹理中 (2560x1920, max=2048x2048)" - 对于这种分辨率,您设备的屏幕太小 - 调整位图大小会更有效:stackoverflow.com/questions/4837715/… BTW不要忘记回收位图以避免内存泄漏。
【解决方案2】:

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

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

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

我认为这个链接会很好用。

欢迎使用 cmets。

【讨论】:

  • 我刚刚尝试了你的想法(位图的文件路径和可绘制的文件路径),但都返回相同的错误:W/OpenGLRenderer(20913): Bitmap too large to be uploaded into a texture
  • 此时我正在使用 photoview 结合 aa 功能,该功能在使用之前缩放位图,但我认为该功能效率不高,我需要更快地将文件获取到 imageview
  • 图片来自网络吗?
  • 没有图片来自 SD 卡
【解决方案3】:

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

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

【讨论】:

  • 起初我认为这个例子很糟糕,但它确实允许快速滑动。不过,这需要永远开始。我看看能不能实现
  • 我一直试图让图像文件动态加载,但似乎不可能将它们放入最终和静态的 imageUrls 中。请检查我的尝试,也许您可​​以找到解决方案:pastebin.com/raw.php?i=LDAwU7Mx
  • 你的意思是调用pathsList、imageList吗?然后由于 imageUrls 是最终变量,因此您只能分配一次。你可以使用public final static String[] imageUrls = imageList.toArray(new String[imageList.size()])
【解决方案4】:

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

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

【讨论】:

  • 我刚刚测试过,效果很好。但我一直在研究代码,但没有看到任何用图像文件而不是可绘制文件来实现它的方法。我将开始检查是否可以将它与我的实现结合起来,但我认为它不会起作用。
  • 我正在使用结合imageView.setImageDrawable(GetDrawable(imagePath, 150, 150)); 的photoview 实现将SD 卡文件路径转换为drawables。但是,它仍然非常低效。也许有一种方法可以使用文件路径查看.setImage? (无需转换)
  • 这引导我走上正确的道路。我必须弄清楚如何进行延迟图像加载,如果可能的话,也许如何更改 viewpager 动画
  • 你知道如何禁用捏开/关闭缩放吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
相关资源
最近更新 更多