В игре, которую я разрабатываю, мне нужно было изменить размеры чертежей, поэтому я нашел фрагмент кода, который делает то, что я хочу. Скажем, я хочу изменить все на 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» я подразумеваю «изменение размера». Я могу посмотреть на экране, если размер рисунка был изменен или нет.
Java передает * ссылки по значению * so 'image = new BitmapDrawable (getResources(), resbit);' в вашем первом примере изменяет то, что делают * локальные * опорные точки, что делает ваш код по существу «ничего не делать». –
О, спасибо. Поэтому, если я хочу изменить размер 20 рисунков, лучше сделать что-то, чем просто копировать один и тот же код 20 раз? – RandomUsername
Передача массива, содержащего ваши Drawables для этого метода, а затем цикл должен работать. Что вызывает оператор возврата для утечки памяти? Я бы сказал, что это нечто другое, связанное с самими Drawables. –