我有一个活动,在交叉渐变中显示一些全屏图像。总共有6张图片。为此,我使用了2个ImageViews和2个同时播放的动画,一个淡出第一个图像,另一个淡化第二个图像。我将此视频用作参考https://www.youtube.com/watch?v=9XbKMUtVnJA
因为我需要连续运行,所以我使用计时器每4秒安排一次动画。一切正常,但它使用了大量的内存。要加载我尝试的图像:
所有这些方法都是内存密集型的,导致旧设备(例如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
的解决方案的要点答案 0 :(得分:0)
请从清单中删除largeHeap
选项。它并没有解决问题,它正在解决问题。
这是问题
图像是1536x2048加载在imageview
中
你不应该只是尝试以最大分辨率加载图像,因为正如你所说,例如在S2中,显示为800 x 480,这是什么意思?
一般来说,您应该做的是将位图加载到您需要的内存中(在您的情况下,它应该与ImageView一样大)。您可以在the official docs中按照非常好的教程进行操作。
为了避免java.lang.OutOfMemory异常,请在解码之前检查位图的尺寸,除非您完全信任该源为您提供可预测大小的图像数据,这些数据可以轻松地放入可用内存中。
[...]
例如,如果最终将在ImageView中以128x96像素的缩略图显示,则不值得将1024x768像素图像加载到内存中。
希望这有帮助。