2013-11-16 3 views
2

В игре, которую я разрабатываю, мне нужно было изменить размеры чертежей, поэтому я нашел фрагмент кода, который делает то, что я хочу. Скажем, я хочу изменить все на 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 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); 
} 

Так что первым делом я полностью удалить метод, а просто вручную изменить размер каждой вытяжке, просто чтобы посмотреть, работает ли он. И это произошло. Код, который работает:

//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?

Примечание: Под «works» я подразумеваю «изменение размера». Я могу посмотреть на экране, если размер рисунка был изменен или нет.

+0

Java передает * ссылки по значению * so 'image = new BitmapDrawable (getResources(), resbit);' в вашем первом примере изменяет то, что делают * локальные * опорные точки, что делает ваш код по существу «ничего не делать». –

+0

О, спасибо. Поэтому, если я хочу изменить размер 20 рисунков, лучше сделать что-то, чем просто копировать один и тот же код 20 раз? – RandomUsername

+0

Передача массива, содержащего ваши Drawables для этого метода, а затем цикл должен работать. Что вызывает оператор возврата для утечки памяти? Я бы сказал, что это нечто другое, связанное с самими Drawables. –

ответ

0

Чтобы ответить на аргумент обходя вопрос о:

Ссылки в Java передаются по значению. Это означает, что если в методе, который принимает в качестве аргумента объекта и присвоение new объекта к этой ссылочной переменной, например, так:

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

Позвони doSomething (myObject);

myObject будет не быть изменен до точки на ваш new Object().

Смежные вопросы