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

时间:2012-01-31 14:04:36

标签: android imageview

我正在使用Android中的360度图像旋转器,如以下链接所示: http://developer.apple.com/safaridemos/showcase/threesixty/

对于这个用例,当用户水平滚动时,我只是使用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度旋转的平滑问题。

2 个答案:

答案 0 :(得分:0)

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

说实话甚至可能不是GC。使用setImageResource会导致在UI线程上读取和解码位图,这可能会导致延迟问题。这在文档here中有说明。

答案 1 :(得分:0)

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