我有一个应用程序供我自己使用,用于与 arduino 通信。有自定义形状的按钮,所以我在 PNG 中将它们绘制为单一背景,添加了 Buttons
和 android:background="@android:color/transparent"
使它们透明顶部几乎是自定义按钮的大小。
在此图像中,您可以看到: 1. 背景 - 黑色背景和深蓝色按钮绘制为单个 png。 2. 橙色 png - 与背景大小相同,使用 match parrent
选项绘制。 3.隐形按钮-带透明选项,蓝色方 block ,一共有7个。
为了消除指示图像的错位,我在 PNG 透明背景中绘制了相同大小的背景。我将它们添加到 res/drawable
并在布局 XML 中作为 ImageView
和 android:visibility="gone"
,布局是 FrameLayout
。为了指示按钮被按下,我设置了橙色自定义按钮的 VISIBLE
,当 arduino 打开输出时,发回确认我让我离开并设置可见的另一个 PNG。它会消耗大量内存。图像尺寸为 1478x2623。在最坏的情况下,我必须一次只显示 8 张图像 + 永久背景。在 onCreate 方法中,我加载了所有 17 张图像。
为了避免 OOM - 内存不足错误,我必须调整图像大小,这让我看起来很糟糕......
如果 XML 中图像的可见性是 android:visibility="gone"
,它是否在 onCreate 中加载图像?如果是这样,我应该只在需要时创建、缩放和绘制它。如何实现?
编辑
做了一些改动。
- 图片缩小到 1920x1080
- 8 ImageView 保留在布局上,资源在方法中设置,而不是在 XML 中
这些更改使其速度更快并且不再出现 OOM 错误。目前我很忙,所以需要一些时间来测试答案中建议的方法。我会尽快尝试。
最佳答案
为什么你的图片这么大?这个分辨率(1478x2623)很大,内存中保持8确实会导致OOM异常。
如果确实需要,您可以执行以下任一操作:
- 廉价而讨厌的解决方案:使用大内存堆。由于此应用程序供您个人使用,这对您来说可能是最快的选择,并且可以在您的 list 中进行一行更改,但我不建议将其用于一般应用程序,除非它需要更多内存的真正原因。 (要实现这一点,请参阅:How to increase heap size of an android application?)
- 使用 UniversalImageLoadr ( https://github.com/nostra13/Android-Universal-Image-Loader ) 并确保您不会一次加载所有图像。例如,仅当且仅当需要显示图像时才加载图像叠加层。您可以通过在需要时设置图像源并将不可见图像的图像源设置为空来实现。此外,请确保回收未积极使用的位图。不过,其中大部分已经由图像加载程序库处理。
- (我认为将此与 2 一起使用):您确实不需要指定的分辨率。它太大了。您应该查看 Android 指南 (http://developer.android.com/training/displaying-bitmaps/index.html),或者使用图像加载器并指定较小的尺寸并加载缩放图像。
要回答您的确切问题: 如果 XML 中图像的可见性是 android:visibility="gone",它是否在 onCreate 中加载图像?如果是这样,我应该只在需要时创建、缩放和绘制它。如何实现?
是的,它仍然会加载图像,因为它需要在接到通知后立即显示它,是的,您应该只在需要时解码位图。关于如何实现这一点,请参阅上面的第 2 点和第 3 点。
关于android - 处理许多全屏 png 以避免 OOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26673925/