我遇到了很多问题,都是相关的。有些我已经解决了,但我找到的解决方案可能会阻止我完成最终产品。我将在这里提到所有问题和解决方案,因为我相信这将是许多人会遇到的一个相当普遍的问题。
最终结果我有一个基础图像,顶部有 3 层(透明 png)。显示的图层取决于用户。每一层都向基础图像添加更多信息。在我的情况下,基本图像是星星的图像。当用户添加额外的图层时,他们可以看到星座边界、星名和网格。用户还需要能够放大某个区域以获得更清晰的天空部分图片。
第一个问题图像大小是两个大(1324 × 1872),导致 OutOfMemory 错误。
通过使用缩放图像解决
/**
* This method scales an image in the assets directory and returns a
* BitmapDrawable object that can be passed to an images setImageBitmap or a
* views setBackgroundDrawable by passing this method into the constructor
* of BitmapDrawable.
* eg ViewGroup.setBackgroundDrawable(
* new BitmapDrawable(getScaledBitMap(this, imagePath, 2)));
*
* @param context
* @param imgFullPath
* @param imageSize
* @return
* @throws IOException
*/
public static Bitmap getScaledBitMap(Context context, String imgFullPath,
int imageSize) throws IOException
{
InputStream instream;
instream = context.getAssets().open(imgFullPath);
BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize = imageSize;
Bitmap bitmap=BitmapFactory.decodeStream(instream, null, options);
return bitmap;
}
尽管此代码有所帮助,但在加载 3 层时,我仍然收到 OutOfMemory 错误。我还认为缩放图像在缩放时会成为一个问题,因为质量已经降低。
第二题。据我发现,您不能在其中一张图像不透明的情况下对 png 进行分层。不会显示透明图像,仅显示不透明的图像(基本图像)。
通过将 FrameLayout 的背景设置为基础图像并仅将 3 层作为该布局的子层来解决此问题。
第三期放大图像。我在这里找到了解决方案如何获得图像的缩放功能?,但尚未对其进行测试,因为模拟器没有多点触控,而且当我游泳时我的设备不喜欢它。我目前没有其他设备可以测试。
什么是加载所有 4 张图像(基础 + 3 层)而不出现 outOfMemoryError 并具有缩放图像的功能的最佳方法。