Холст растрового рисунка и плотности экрана - PullRequest
1 голос
/ 02 ноября 2011

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

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

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

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

суа EffDee

Ответы [ 2 ]

1 голос
/ 05 апреля 2013

Лучше всего помещать изображения в папку 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 или более копий одного и того же изображения.

1 голос
/ 02 ноября 2011

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

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

...