如何在同一ImageView中频繁而平稳地更改大量图像?

问题描述:

我在Android的360度的图像旋转器的工作如本链接: http://developer.apple.com/safaridemos/showcase/threesixty/如何在同一ImageView中频繁而平稳地更改大量图像?

对于该使用情况,我简单地使用多于40个图像以不同的角度被显示当用户水平滚动。使用 此代码:

public boolean onScroll 
     (MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) 
{  
    Log.i(TAG, "distanceX = "+distanceX); 
    if(distanceX > 3){ 
     if(imageCounter < imgArr.length - 1){ 
      imageCounter++;    
     }else{ 
      imageCounter = 0;    
     } 
     imageSwitcher.setImageResource(imgArr[imageCounter]); 

    }else if(distanceX < -3){ 
     if(imageCounter > 0){ 
      imageCounter--; 
     }else{ 
      imageCounter = imgArr.length - 1; 
     } 
     imageSwitcher.setImageResource(imgArr[imageCounter]); 
    } 
    return true; 
} 

我的问题是,在图像的切换不够光滑。看看Logcat可以看出,在图像中每2-3次切换一次,垃圾收集器就会完成其工作,每次完成作业需要大约20毫秒的时间。这几毫秒导致实现360度平滑旋转的问题。

+0

考虑使用SurfaceView,然后您可以更好地控制绘图/加载并可以手动缓冲您的数据。 – Jave 2012-01-31 14:14:48

您可以尝试将imgArr更改为位图数组,然后使用setImageBitmap而不是setImageResource。如果你只使用40张图片,你应该能够适应所有内存。启动时会有轻微的延迟(在新手机上应为< 1秒)以加载所有位图,但应使其平滑,GC将不会收集位图(如果它们仍被引用)。

它可能不是真正的GC。使用setImageResource会导致位图在UI线程上被读取和解码,这可能会导致延迟问题。这在文档here中注明。

setImageResource()不是一个快速的方法。根据图像的大小,这可能是延误的主要原因。每次调用时,Android都需要解压缩PNG图像文件,这可能需要很长时间。如果不占用太多内存,请考虑将资源预加载到位图中。如果将图像设置为ImageView也是延迟的原因,可以考虑直接在画布上绘图。我已经测试过这个功能,甚至在慢速设备上,全屏的位图绘制也可以至少每秒发生30次。

+0

谢谢,使用这些提示,我现在能够顺利旋转。 – param 2012-02-02 06:20:21