调整可绘制问题的大小(未传递引用?)

时间:2013-11-16 01:23:18

标签: java android drawable

在我正在开发的游戏中,我需要调整drawables的大小,所以我发现了一段能够满足我想要的代码。假设为了简单起见,我想将所有内容调整为ButtonWidth / 2,ButtonHeight / 2。这是代码:

Drawable ResizeDrawable(Drawable image)
{
     Bitmap temp = ((BitmapDrawable)image).getBitmap();
     Bitmap resbit = Bitmap.createScaledBitmap(temp, ButtonWidth/2, ButtonHeight/2, true);
     Drawable ret = new BitmapDrawable(getResources(), resbit );
     return ret;
}

后来,我发现这个程序泄漏了内存(具体是“返回”行)所以我将此方法更改为void:

void ResizeDrawable(Drawable image)
{
     temp = ((BitmapDrawable)image).getBitmap();
     resbit = Bitmap.createScaledBitmap(temp, ButtonWidth/2, ButtonHeight/2, true);
     image = new BitmapDrawable(getResources(), resbit );
}

我知道Java传递了引用,所以这应该可行,但事实并非如此。完整的代码不起作用:

//Variables are declared globally
Bitmap temp;
Bitmap resbit;
int ButtonWidth=100, ButtonHeight=100;

void TakeCareOfButtons() //I call this from OnCreate()
{
   MyDrawable = context.getResources().getDrawable(R.drawable.mydrawableresource);
   ResizeDrawable(MyDrawable);
}
void ResizeDrawable(Drawable image)
{
     temp = ((BitmapDrawable)image).getBitmap();
     resbit = Bitmap.createScaledBitmap(temp, ButtonWidth/2, ButtonHeight/2, true);
     image = new BitmapDrawable(getResources(), resbit );
}

所以我做的第一件事就是完全删除方法,只需手动调整每个drawable,只是为了查看它是否有效。它确实如此。有效的代码:

//Variables are declared globally
Bitmap temp;
Bitmap resbit;
int ButtonWidth=100, ButtonHeight=100;//not the real values, but it's irrelevant now


    void TakeCareOfButtons() //I call this from OnCreate()
    {
         MyDrawable = context.getResources().getDrawable(R.drawable.mydrawableresource);
         temp = ((BitmapDrawable) MyDrawable).getBitmap();
         resbit = Bitmap.createScaledBitmap(temp, ButtonWidth/2, ButtonHeight/2, true);
         MyDrawable = new BitmapDrawable(getResources(), resbit );
    }

问题是:这两个代码不相同吗?他们不应该在Java中做同样的事情吗?

注意:“作品”我的意思是“调整大小”。我可以在屏幕上查看是否已调整drawable大小。

1 个答案:

答案 0 :(得分:0)

回答论证传递问题:

Java中的引用按值传递。这意味着,如果在一个接受Object参数的方法中,并将new对象分配给该引用变量,就像这样:

public void doSomething (Object bar){
  bar = new Object();
}

并致电doSomething (myObject);

myObject修改为指向您的new Object ()