gpt4 book ai didi

java - 如何实时清除位图内存?

转载 作者:行者123 更新时间:2023-11-29 21:42:49 25 4
gpt4 key购买 nike

我像这样创建 14 个位图对象:

bmp[0]=BitmapFactory.decodeResource(getResources(), R.drawable.a0000);
bmp[1]=BitmapFactory.decodeResource(getResources(), R.drawable.a0001);
bmp[2]=BitmapFactory.decodeResource(getResources(), R.drawable.a0002);
bmp[3]=BitmapFactory.decodeResource(getResources(), R.drawable.a0003);
bmp[4]=BitmapFactory.decodeResource(getResources(), R.drawable.a0004);
bmp[5]=BitmapFactory.decodeResource(getResources(), R.drawable.a0005);
bmp[6]=BitmapFactory.decodeResource(getResources(), R.drawable.a0006);
bmp[7]=BitmapFactory.decodeResource(getResources(), R.drawable.a0007);
bmp[8]=BitmapFactory.decodeResource(getResources(), R.drawable.a0008);
bmp[9]=BitmapFactory.decodeResource(getResources(), R.drawable.a0009);
bmp[10]=BitmapFactory.decodeResource(getResources(), R.drawable.a0010);
bmp[11]=BitmapFactory.decodeResource(getResources(), R.drawable.a0011);
bmp[12]=BitmapFactory.decodeResource(getResources(), R.drawable.a0012);
bmp[13]=BitmapFactory.decodeResource(getResources(), R.drawable.a0013);

这些Bitmap是用来制作背景动画的,资源是14张320x480像素的jpj图片。所以我创建了一个自定义 View ,然后在 onDraw 方法中调用位图。然后我在我的手机上测试与我的图像具有相同分辨率的应用程序,它运行流畅,然后我尝试在具有更大分辨率(如 1280x720)的平板电脑上使用该应用程序,但我的背景不适合整个屏幕, 所以我研究了如何根据设备分辨率制作一个具有不同分辨率的新位图来填充整个屏幕,结果是这样的:

newWidth= context.getResources().getDisplayMetrics().widthPixels;
newHeight= context.getResources().getDisplayMetrics().heightPixels;

int contador=0;

do{
bmp[contador]= Bitmap.createScaledBitmap(bmp[contador], newWidth, newHeight,true);
contador++;
}while(contador<13);

然后我简单地将这些行放在我的 onDraw 方法上。

   canvas.drawBitmap(bmp[i], 0, 0, null);
i++;

如果我在我的手机上测试该应用程序,它运行良好,但当我在我的平板电脑上测试它时,会抛出“位图大小超过 VM 预算”错误...所以我进行了更多调查,并得到了以下解决方案:创建原始的 14 bmp Bitmap 对象并制作第二个位图数组 bmp2 ,然后仅在我需要时分配位图,然后在我的 onDraw 方法中像这样清除它:

   bmp2[i]= Bitmap.createScaledBitmap(bmp[i], newWidth, newHeight,true);
canvas.drawBitmap(bmp2[i], 0, 0, null);
bmp2[i].recycle();
bmp2[i]=null;

它可以在我的平板电脑和手机上运行,​​但性能非常糟糕,我认为是因为我实时分配图像(在 onDraw 方法上)但是如果我使用回收方法并且不再分配 bmp2 那里不会是新的 bmp2...

所以最后我真正的问题是:如何在显示我的图像后清除一些内存,然后当我再次需要它时我可以使用它。谢谢!

最佳答案

其他人提到了如何放大小位图以填充大屏幕不会产生高质量的结果。但无论如何,为了回答您的具体问题,这就是您如何绘制按比例放大以填满屏幕而不会出现内存错误的低分辨率位图。

您需要使用一种替代的 Canvas.drawBitmap() 方法,它可以在绘图时将您的位图缩放到正确的大小。

例如:

public void drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint)

来自 the Javadoc :

Draw the specified bitmap, scaling/translating automatically to fill the destination rectangle.

dst 矩形设置为您之前计算的屏幕尺寸。然后,您不需要在内存中创建单独的缩放位图,这样您的问题就消失了。

关于java - 如何实时清除位图内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16645297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com