图像的连续交叉淡入淡出和内存不足

时间:2015-02-16 12:56:38

标签: android image

我有一个活动,在交叉渐变中显示一些全屏图像。总共有6张图片。为此,我使用了2个ImageViews和2个同时播放的动画,一个淡出第一个图像,另一个淡化第二个图像。我将此视频用作参考https://www.youtube.com/watch?v=9XbKMUtVnJA

因为我需要连续运行,所以我使用计时器每4秒安排一次动画。一切正常,但它使用了大量的内存。要加载我尝试的图像:

  • 视频中使用的基本不推荐方式,即以可绘制数组加载所有图像
  • 使用imageview.setImageResource
  • 设置图像
  • 使用Picasso
  • 从资源加载图像

所有这些方法都是内存密集型的,导致旧设备(例如Galaxy S2)出现内存不足异常。毕加索的方法不能正常运作。

我确定有更好的方法可以做到这一点,但我不知道,有什么建议吗?

以下是相关代码:

private void animateImageview(){
    prevImageView.animate().alpha(0);
    nextImageView.animate().alpha(1).setListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            mCurrentDrawable =
                    (mCurrentDrawable + 1) % imagesToShow.length;
            int nextDrawableIndex =
                    (mCurrentDrawable + 1) % imagesToShow.length;
            prevImageView.setImageResource(imagesToShow[mCurrentDrawable]);

            nextImageView.setImageResource(imagesToShow[nextDrawableIndex]);

            nextImageView.setAlpha(0f);
            prevImageView.setAlpha(1f);
        }
    });

protected void onCreate(Bundle savedInstanceState) {

    ...

prevImageView.setImageResource(imagesToShow[0]);
nextImageView.setImageResource(imagesToShow[1]);

    new Timer().scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            animateImageview();
        }
    }, 5000, 4000);

}

修改 清单中的largeHeap选项似乎解决了这个问题,但我还是不相信我无论如何都做对了。

EDIT2: 我使用https://gist.github.com/alexmazza/003e3449c02fe58848a9

的解决方案的要点

1 个答案:

答案 0 :(得分:0)

请从清单中删除largeHeap选项。它并没有解决问题,它正在解决问题。

这是问题

  

图像是1536x2048加载在imageview

你不应该只是尝试以最大分辨率加载图像,因为正如你所说,例如在S2中,显示为800 x 480,这是什么意思?

一般来说,您应该做的是将位图加载到您需要的内存中(在您的情况下,它应该与ImageView一样大)。您可以在the official docs中按照非常好的教程进行操作。

  

为了避免java.lang.OutOfMemory异常,请在解码之前检查位图的尺寸,除非您完全信任该源为您提供可预测大小的图像数据,这些数据可以轻松地放入可用内存中。

[...]

  

例如,如果最终将在ImageView中以128x96像素的缩略图显示,则不值得将1024x768像素图像加载到内存中。

希望这有帮助。