1

我现在正在编写一个应用程序,它使用占据大部分屏幕的四个主要按钮。每一个都有三个动画:一个 12 帧的介绍性动画,一个 33 帧的循环动画,以及一个基于当前帧单击循环关闭的动画。

图像高度约为 250 250 到 450 250。事实证明,在应用程序加载时加载所有这些不仅会导致初始加载缓慢,而且还会导致可用内存较小的设备上出现内存不足异常。

问题是,当我尝试加载动画而不预加载它们时,它会在加载之前跳过并挂起一秒钟。此外,我注意到即使只是在每次点击侦听器需要它们时运行活动动画,内存使用量似乎也从 20mb 到 40mb 堆大小。

我并没有真正做任何奇怪的事情来实现它们。我使用标准

AnimationDrawable animation = (AnimationDrawable)getResources().getDrawable(R.drawable.blah);
imageView.setImageDrawable(animation);
animation start;

但是随后根据需要加载单个动画而不进行预加载会产生轻微的延迟。有没有办法预加载它们(如果这有任何意义)或就我如何在代码中实现它们做其他事情?我目前正在将动画切割成不同的部分,因此唯一改变的帧是动画对象的实际部分。

除此之外,我还能如何处理 AnimationDrawable 和内存?看起来动画对 Android 来说是如此的基础,必须有更好、更专业的方式来处理动画资源,这样它们就不会破坏内存库并且仍然是流动的。请让我知道我这样做是愚蠢的。我应该使用不同的动画类,还是手动将更改分配给基于计时器的动画视图,以便我一次加载一个?

我想这是一个混乱的问题——似乎必须有一种标准的方法来处理这类问题。帧数少?不同格式的图像?(jpg和png是一样的)

4

2 回答 2

1

您可以做几件事来最大程度地减少内存消耗。

  • 将图像重新调整为精确的按钮大小。你不需要更大的图像
  • 将图像大小调整为屏幕分辨率。如果你的屏幕很小,他们没有理由加载更大的图像。
  • 按照 android 设计指南提供各种分辨率的图像。
  • 保留大部分图像修复,仅加载/更改动画部分

避免碰撞

  • 在将图像加载到内存链接之前检查总堆内存大小
  • 确保垃圾收集正常工作。位图垃圾收集与常规垃圾收集略有不同,并且取决于 Android 版本。
  • 尝试 Java 参考。
于 2013-06-05T05:58:16.323 回答
0

您可以使用 DiskLruCache 缓存位图。它可以帮助您解决内存问题并以相同质量显示图像。参考https://github.com/JakeWharton/DiskLruCache

您只需缓存一次。之后它从缓存文件夹加载图像。

     int count = 0;
         Runnable runnable = new Runnable() {

            @Override
            public void run() {
                count++;
                if (count < TOTAL_IMAGES) {
                   loadBitmap(count);
                   handler.postDelayed(runnable, 0);
            }
        }
    };
    handler.postDelayed(runnable, 0);


  // method for loading bitmap from cache folder
  private void loadBitmap(int id) {
            String filePath = Environment.getExternalStorageDirectory()+ "Folder Name/ Image Name " + id ;
            BitmapFactory.Options options = new BitmapFactory.Options();

            Bitmap b = BitmapFactory.decodeFile(filePath, options);
            if (b != null) {
                img.setImageBitmap(b);
                }
        }
于 2013-06-05T06:32:32.227 回答