当前位置: 首页 > 知识库问答 >
问题:

一幅320KB的背景图像大约占用30MB的内存空间

梁烨烨
2023-03-14

应用程序启动

02-08 20:35:12.105:D/DalvikVM(27962):GC_FOR_ALLOC释放8804K,18%释放53293K/64775K,暂停31ms,总计31ms

02-08 20:35:12.110:I/dalvikvm-heap(27962):将堆(frag大小写)增长到61.693MB,用于9000016字节分配

02-08 20:35:12.330:I/dalvikvm-heap(27962):将堆(frag大小写)增长到61.643MB,用于36000016字节分配

02-08 20:35:12.350:D/DalvikVM(27962):GC_CONCURRENT释放0k,5%释放62031k/64775k,暂停11ms+3ms,总计23ms

教程中的函数:

public static int calculateInSampleSize(
        BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;

if (height > reqHeight || width > reqWidth) {

    // Calculate ratios of height and width to requested height and width
    final int heightRatio = Math.round((float) height / (float) reqHeight);
    final int widthRatio = Math.round((float) width / (float) reqWidth);

    // Choose the smallest ratio as inSampleSize value, this will guarantee
    // a final image with both dimensions larger than or equal to the
    // requested height and width.
    inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}

return inSampleSize;
}

 public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
        int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res, resId, options);
 }
final FrameLayout fr = (FrameLayout) findViewById(R.id.mainmenu_background);
//fr.setBackgroundResource(R.drawable.background_main_menu);
Display display = getWindowManager().getDefaultDisplay();
//Point size = new Point();
//display.getSize(size);
fr.setBackgroundDrawable(new BitmapDrawable(getResources(), decodeSampledBitmapFromResource(getResources(), R.drawable.background_main_menu, 2000, 1250)));
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/mainmenu_background"
>

共有1个答案

汪博艺
2023-03-14

原因很简单,一个映像需要4x2000x1250字节的内存。每个像素都有一部分红、绿、蓝和阿尔法通道信息。

30 MB有点奇怪,但9MB是正常的:4x2000x1250=10000000字节->9.5MB

你确定你不偷看什么地方的记忆吗?

 类似资料:
  • 上面有一个包含滑块的内容框。内容框的纵横比为1/.52。我的目标是在每张幻灯片上有一个不同的背景图像,内容覆盖在图像上。背景图像还必须通过web访问,所以设置背景图像css属性似乎不起作用。#LargeCarouselContent中的每个div都是一个幻灯片。当前的解决方案不起作用,因为canvas1.jpeg覆盖所有幻灯片。我被难住了,有什么主意吗?

  • 我想在Android中创建不同分辨率的背景图像。所以我需要ldpi,mdpi,hdpi,xhdpi和xxhdpi的值(以像素为单位)。重要的是图像不会模糊。 我已经阅读了有关多屏幕支持的文档,但dp中的尺寸而不是像素。

  • 我有一个简单的LineChart,按下按钮就会在一个新窗口中打开。此LineChart使用存储在硬盘上的图像作为背景。如果关闭提示LineChart的窗口,更改(或删除)图像文件并重新打开窗口,则会再次加载旧图像。我在场景构建器和代码中禁用了LineChart的缓存,但这没有帮助。 下面是我用于测试的LineChart-Controller的一个简单代码片段: 谢了! ----更新----目前我使

  • 我有一个带有背景图像的HTML5画布元素。用户被允许在图像上绘制,然后需要保存完整的画布元素与背景。我使用下面的代码保存部分,但它只得到画布绘图,而不是背景图像。我还可以做什么来获得背景图像? 更新: 我的HTML 我有上面的div在我的HTML页面。然后我动态地创建画布并在其上绘制。这是一个有点长的代码。

  • 下面的外部CSS页面示例中的快速简单问题; 我知道它们会影响不同的元素选择器,我的问题是使用背景和背景图像有什么区别?一方可以访问另一方的特定属性吗?谢谢你。

  • 我想在我的应用程序中使用背景图像。但是我对不同的屏幕大小感到困惑。我发现了这个问题: Android:支持所有设备的背景图像大小(以像素为单位) 但在回答中他说但Lg G3是和屏幕分辨率: 我需要一个路线图。所有屏幕的图像尺寸应该是多少?(mdpi、hdpi、xhdpi等)