Android 有效的图像拖动切换

Android 有效的图像拖动切换,android,image,drag,Android,Image,Drag,我在SD卡上有200张图像,代表一帧一帧的对象的360视图。 我想让用户通过在图像上拖动手指来“旋转”对象 我在实现拖动事件方面没有问题,问题在于加载和在图像之间切换。在显示活动之前缓存所有图像是不可能的,因为进程的虚拟机内存有限(图像非常大,分辨率超过SVGA)。在拖动事件上加载图像是无效的,甚至远远不能接受 有人遇到过这样或类似的问题吗? 任何帮助都将不胜感激。最简单的解决方案是使用更少的照片和/或降低图像分辨率。 您可以在较低分辨率下使用较少的图像,然后当图像停止旋转时,加载高清照片。 2

我在SD卡上有200张图像,代表一帧一帧的对象的360视图。
我想让用户通过在图像上拖动手指来“旋转”对象

我在实现拖动事件方面没有问题,问题在于加载和在图像之间切换。在显示活动之前缓存所有图像是不可能的,因为进程的虚拟机内存有限(图像非常大,分辨率超过SVGA)。在拖动事件上加载图像是无效的,甚至远远不能接受

有人遇到过这样或类似的问题吗?

任何帮助都将不胜感激。

最简单的解决方案是使用更少的照片和/或降低图像分辨率。 您可以在较低分辨率下使用较少的图像,然后当图像停止旋转时,加载高清照片。
200张照片对于一张360度的照片来说太多了

您提到的有限VM内存,也称为VM堆大小,大约16Mb,只影响Java中分配的内存。您可以在本机代码中分配更多内存。在实际设备上,通常有数百兆字节的RAM

但是,如果您的应用程序使用了太多内存,它仍然可能会被系统杀死。因此,当您需要处理大内存时,最好的解决方案是使用带有Linux mmap()功能的内存文件映射。这相当聪明,可以作为交换。使用mmap()甚至可以映射比实际物理RAM大小更多的内存,内核将根据需要从底层文件加载/卸载内存页

但是,我不认为可以将mmapped内存与标准小部件(如ImageView)一起使用。另外,为了在您解释的内容中获得平滑的图像切换和滚动,我相信OpenGL是必需的


因此,我建议将图像加载并解码到mmaped内存区域中,以便有效地将其用作OpenGL纹理(有一个详细说明,请参阅和下面的内容)。

您可以跳过一些图像并对最近的图像进行变形/插值2,以提供跳过的图像

旋转停止后,加载正确的图像。这样,即使是轻微的旋转也是可以注意到的(因此,您可以使用更大的粒度进行旋转)


<>但是这对计算能力要求更高,所以它的贸易

我害怕……所以在纯java中没有办法做到这一点。我最后一次使用C++是几年前……而且我也不太喜欢OpenGL。无论如何,非常感谢Erresti可能是错误的,但是我没有看到在纯java中这样做的方法。此外,如果没有硬件图形加速(如OpenGL),它看起来也可以在你的设备上,但我怀疑它在其他一些设备上是否平滑。我的意思是像在视频中一样平滑,即:高帧速率。我认为本机部分实际上可能非常小,只有一些例程来处理繁重的工作,你可以用Java编写所有其余的代码,调用一些本机方法。不幸的是,既不使用较少的照片,也不降低成本分辨率是一种选择。我会尝试一下,但即使使用这种解决方案,我也必须创建图像的缩影并将其保存在内存中-不确定需要消耗多少。