Рисование растрового изображения на холсте и плотность экрана

Я разрабатываю игру для Android на основе класса SurfaceView. В настоящее время я застрял, пытаясь оптимизировать вид для разных размеров экрана.

Проблема 1: у меня есть PNG-файлы в моей папке res, и я рисую их с помощью Canvas.drawBitmap. Прочитав эту статью ( http://developer.android.com/guide/practices/screens_support.html ), я думал, что Android изменяет размеры растровых изображений, если экран больше. К сожалению, я не обнаружил масштабирования (или каких-либо изменений) при запуске моего приложения на планшете по сравнению с запуском его на телефоне. Итак, как это делается? Должен ли я придумать какую-нибудь причудливую стратегию для вычисления доступного пространства и рисования моих растровых изображений с использованием исходного и целевого прямоугольника? Было бы неплохо, если бы у кого-то была лучшая практика или несколько советов, как рисовать растровые изображения на холсте. Я уже читал темы о преобразовании пикселей‹->dip, но должен сказать, что не знаю, как использовать это «решение» в своем приложении. Так что любая помощь приветствуется...

Проблема 2: у меня есть 3 PNG в моей папке res. Один ldpi, один mdpi и один hdpi. Изображение Ldpi имеет размер 50 пикселей * 50 пикселей, mdpi - 75 пикселей * 75 пикселей, а hdpi - 100 пикселей * 100 пикселей. Когда я загружаю приложение в эмулятор (800*480), оно использует png 100*100. Когда я загружаю приложение на вкладку Acer Iconia, оно использует изображение 75*75. Я думал, что hdpi предназначен для больших экранов (= вкладка), а mdpi или ldpi будут использоваться для экрана эмулятора. По крайней мере, я думал, что Android будет использовать изображение hdpi также на вкладке, но я был удивлен ... Любое объяснение для этого также высоко ценится

Извините, 4 длинного текста, просто пытаюсь быть ясным...

Циа ЭффДи


person Effdee    schedule 02.11.2011    source источник


Ответы (2)


Для расчета размера вашего рисунка вы можете использовать Canvas.getDensity().

Значение DPI экрана зависит от количества пикселей и размера экрана. Планшеты имеют высокое разрешение, но большинство из них также довольно большие. Это приводит к более низкому значению DPI. Для получения дополнительной информации см. http://developer.android.com/guide/practices/screens_support.html

person Thomas    schedule 02.11.2011
comment
Спасибо за ваш комментарий. я пробовал работать с плотностью, но не повезло... я все еще немного запутался... я получил растровое изображение с шириной (= w) и высотой (= h) и вместо рисования растрового изображения, как в моем прототипе до точки 10,10 с drawBitmap(myBitmap, 10, 10, null) вы предлагаете мне сделать что-то вроде drawBitmap(myBitmap, wholeBitmapRect, new Rect(10, 10, w*densityFactor, h*densityFactor), null) это сводит меня с ума! спасибо за прояснение этого значения dpi ... теперь это имеет смысл;) - person Effdee; 02.11.2011
comment
Этот пост может быть вам полезен: stackoverflow.com/questions/5014882/ - person Thomas; 02.11.2011

Лучше всего помещать изображения в папку mdpi (соотношение пикселей 1), а затем использовать плотность со всеми горизонтальными размерами. Например:

src.left = offsetX * density; 
src.top = 0; 
src.right = (offsetX + width - 1) * density; 
src.bottom = height - 1;
dst.left = x * density; 
dst.top = y; 
dst.right = (x + width - 1) * density; 
dst.bottom = height - 1;
canvas.drawBitmap(myImageStrip, src, dst, null);

Для плотности mdpi 1,0, плотности ldpi=0,75 и для плотности hdpi=1,5. Вы можете получить эти и другие значения, используя

density = getResources().getDisplayMetrics().density;

Есть еще одно решение: вы можете поместить одно и то же изображение во все папки. Система примет правильное, поэтому вам не нужно умножать значения на плотность. Но в этом случае вам понадобится 3 или более копий одного и того же изображения.

person Elvis Popovic    schedule 04.04.2013