воскресенье, 27 февраля 2011 г.

"bitmap size exceeds VM budget" и что с этим делать.

Многие, наверное, встречались с подобной ошибкой в процессе разработки своих приложений. Дело в том, что под битмэпы Dalvik (виртуальная машина Java в Android) выделяет всего лишь несколько сот килобайт. В случае, когда работать нужно с внутренними ресурсами приложения это не проблема - можно просто уменьшить размер\разрешение изображений и дело в шляпе.

Но что делать, когда нужно подгрузить картинками\фотографиями из галереи пользователя?
На выручку приходят Options из BitmapFactory.

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(getPath(selectedImageUri), options);

В итоге получим пустой Bitmap, размеры которого соответствуют указанному файлу. Далее все просто:

// обычно нет смысла работать с изображением, большим чем размер экрана
scaleWidth = imageWidth/screenWidth;
scaleHeight = imageHeight/screenHeight;
options.inSampleSize = scaleWidth > scaleHeight ? scaleHeight : scaleWidth;

options.inJustDecodeBounds = false;
bmp = BitmapFactory.decodeFile(getPath(selectedImageUri), options);

Не забываем выставить inJustDecodeBounds в false.

пятница, 25 февраля 2011 г.

Мой первый шаг в мир Android: Slizzle

Идея, что называется, витала в воздухе. Собирать кубик Рубика (далее КР) на плоском экране занятие, мягко говоря, некомфортное. Из множества вариаций так и не удалось найти приемлемого по качеству управления приложения. Тут и родилась идея Slizzle.

Захотелось сделать игру, аналогичную КР по идее, но адаптированную к управлению тачем. "Сказано - сделано" (с). Это не про мой случай. Разработка была весьма продолжительной хотя и не менее занимательной. Являясь профессиональным J2EE разработчиком многое показалось странным. Вот, например, моя первая ошибка: "bitmap size exceeds VM budget". Никогда бы не подумал, что 1,5мб битмэп - это много :). Но, этот пост про игру. Все тонкости решения проблем опишу позже.

Основная идея игры - восстановить разбитое на ячейки изображение путем вращения столбцов и строк на плоскости.  Под вращением подразумеваю "что ушло за край, то появилось с другой стороны". Лучшего определения не придумал, сори. В общем - можете посмотреть сами (игра бесплатная).