Android 如何使图像占用更少的内存?

Android 如何使图像占用更少的内存?,android,Android,我正在开发一个游戏,我正在和图形一起工作,我遇到了一些压力。所以我的问题是:在安卓系统中,我们如何使图像消耗更少的内存? 我会解释我的游戏,这是一个逻辑游戏,有一些小图片和背景。我正在galaxy note、1GB内存中测试该应用程序,我认为它可以获得高分辨率,但如果我使用大图像作为背景,它会在进入暂停布局并返回后强制关闭 因此,我降低了图形,并没有用力关闭。无论如何,有什么方法可以避免这个内存问题吗?我直接在xml上设置图像,这不对吗 解决了的 多亏了Durairaj Packirisamy

我正在开发一个游戏,我正在和图形一起工作,我遇到了一些压力。所以我的问题是:在安卓系统中,我们如何使图像消耗更少的内存?

我会解释我的游戏,这是一个逻辑游戏,有一些小图片和背景。我正在galaxy note、1GB内存中测试该应用程序,我认为它可以获得高分辨率,但如果我使用大图像作为背景,它会在进入暂停布局并返回后强制关闭

因此,我降低了图形,并没有用力关闭。无论如何,有什么方法可以避免这个内存问题吗?我直接在xml上设置图像,这不对吗


解决了的 多亏了Durairaj Packirisamy的回答,我决定采用这种方法

这是我的密码:

        Bitmap unscaledimgswitch = BitmapFactory.decodeResource(getResources(), R.drawable.switch1on);
    ImageView switch1 = (ImageView) findViewById(R.id.switch1);
    
    
    int viewheight =  screenheight / 10;
    int imgheight = unscaledimgswitch.getHeight();
    switch1.getLayoutParams().height = viewheight;


    

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    options.inSampleSize = ScaledFactor.getScaleFactor(imgheight ,viewheight); // de esta forma cargo la imagen del tamaño exacto necesario
    options.inJustDecodeBounds = false; 
    imgswitch = BitmapFactory.decodeResource(getResources(), R.drawable.switch1on, options);
    switch1.setImageBitmap(imgswitch);
在另一节课上

    static int getScaleFactor(int imgheight, int viewheight) { 
    int result;
    
result = imgheight / viewheight ;
    
    

    return result;
}

您需要使用适当的BitmapFactory.options.inSampleSize值,如果设置为大于1的值,则请求解码器对原始图像进行子采样,并返回较小的图像以节省内存

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
Bitmap bitmap = BitmapFactory.decodeStream(stream, null, options);
请看这里:


您需要使用正确的BitmapFactory.options.inSampleSize值,如果设置为值>1,则请求解码器对原始图像进行二次采样,返回较小的图像以节省内存

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
Bitmap bitmap = BitmapFactory.decodeStream(stream, null, options);
请看这里:


所以我应该找到布局视图和背景图像(位图)(我不是舒尔,这是代码,但这是想法)?并设置BitmapFactory.decodeResource(getResources(),R.id.myimage,选项)?drawable上的mdpi、hdpi、ldpi文件夹不是也有同样的功能吗?谢谢,经过一些研究,我终于按照你的方式完成了。为今天编写一些代码,但为明天编写的问题更少。我真的很感激你的回答。我不得不修改了一半的代码,但现在效果非常好。所以我应该找到布局视图和背景图像(位图)(我不是舒尔,这是代码,但这是想法)?并设置BitmapFactory.decodeResource(getResources(),R.id.myimage,选项)?drawable上的mdpi、hdpi、ldpi文件夹不是也有同样的功能吗?谢谢,经过一些研究,我终于按照你的方式完成了。为今天编写一些代码,但为明天编写的问题更少。我真的很感激你的回答。我不得不修改了一半的代码,但它现在工作得很好。虽然分辨率很高,但我认为对于每个ldpi、mdpi、hdpi和xhdpi,或者更高的密度,您应该只包含所需大小的图像。例如,1280x800 galaxy note(xhdpi)不需要1600×900的图像,我知道,但这不是我想要的你要问的是如何避免内存问题,不将过大的位图设置为不必要的密度是一个答案,因为分辨率很高,我认为对于每个ldpi、mdpi、hdpi和xhdpi,或者更高的密度,你应该只包含你需要的大小的图像。例如,1280x800 galaxy note(xhdpi)不需要1600×900的图像,我知道,但这不是我想要的您要问的是如何避免内存问题,答案之一是不要将过大的位图设置为不必要的密度