Невелика тестова активність, демонструє всі методи виведення графіки – РОЗРОБКА ІГОР ДЛЯ ОС ANDROID

Напишемо невелику тестову активність, демонструє всі перераховані вище методи Я хочу, щоб ви спочатку проаналізували код в лістингу 413 Уявіть, що ми використовуємо екран з роздільною здатністю 480 х 800 в портретному режимі, на якому будуть малюватися різні фігури При програмуванні графіки дуже важливо уявляти собі результат виконання команд Це вимагає деякої практики, але воно того варто

Лістинг 413 ShapeTestJava Божевільне малювання фігур package combadlogi сandroi dgames

Ви вже намалювали в уяві картинку Тоді давайте швидко проаналізуємо метод RenderViewonDraw Все інше не змінилося з минулого прикладу

Починаємо з заповнення екрану білим кольором Далі малюємо лінію від початку до правого нижнього пікселя екрана Ми використовуємо Paint, чий колір встановлений в червоний, тому лінія буде такого ж кольору

Потім трохи змінюємо Paint, встановлюючи його стиль як Sty 1 е STROKE, колір – зелений і значення альфа – 255 У центрі екрана малюється коло з радіусом 40 пікселів (що використовує Paint, який ми тільки що змінили) Через встановленого стилю окружність буде незаповненою

Останній блок починається з ще однієї модифікації Pai nt Ми встановлюємо його стиль Sty 1 е FILL, а колір – синій Зверніть увагу – я задав альфа рівний 0x77 в цей раз, що дорівнює 119 в десятковому численні Це означає, що фігура, яку ми малюємо, буде приблизно на 50% прозорою

Малюнок 413 показує підсумок роботи тестової активності в портретному режимі в дозволах 480 х 800 і 320 х 480

Боже, що сталося Те, що трапляється при малюванні з абсолютними координатами і розмірами на різних дозволах Єдиний елемент, що залишився незмінним на обох картинках, – червона лінія через весь екран (вона реалізована способом, не залежних від дозволу)

Прямокутнику встановлено положення (100 100) Залежно від дозволу дисплея відстані до центру екрану буде різним Крім того, розмір прямокутника заданий рівним 100 х 100 пікселів Чим більше дисплей, тим менше фігура буде займати місця щодо його площі

Позиція центру кола задана не залежних від дозволу способом, а от її радіус – ні Тому він теж займає на правому екрані більше місця, ніж на лівому

Ми вже бачили, що підтримка різних дозволів дисплея може бути проблемою Справи стають ще гірше, коли ми стикаємося з різними фізичними розмірами дисплеїв

Поки ж памятаєте, що означають дозвіл екрану і його фізичний розмір

Рис 413 Висновок ShapeTest на екрані 480×800 (ліворуч) і 320 х 480 (праворуч) (чорна рамка додана пізніше)

ПРИМІТКА

Класи Canvas і Paint пропонують набагато більше, ніж ми щойно обговорили Насправді всі стандартні View в Android використовують для промальовування цей API, так що можете уявити, скільки там всього Як завжди, читайте Android Developers для більш докладної інформації

Використання бітових зображень

Хоча створення ігор, що складаються лише з базових фігур, має право на життя, це не те, чого всім хочеться Нам потрібен геніальний художник для створення спрайтів і фонових зображень, які потім зможемо завантажувати з PNG-або JPEG файлів В Android все це робиться легко

Завантаження і перевірка зображень Клас Bi tmap стане нашим кращим другом Ми завантажуємо бітове зображення з файлу за допомогою елемента BitmapFactory Оскільки ми зберігаємо зображення у вигляді ресурсів, подивимося, як ми можемо завантажувати їх з каталогу assets /:

Клас Bitmap містить кілька корисних для нас методів Для початку ми хочемо дізнатися його ширину і висоту в пікселах:

Потім нам корисно буде отримати колірну схему, в якій збережений Bitmap:

BitmapConfig – перерахування з наступними значеннями:

Ви повинні памятати, що означають ці варіанти

Цікаво, що в перерахуванні відсутній формат RGB888 Формат PNG, у свою чергу, підтримує тільки схеми ARGB8888, RGB888 і палітри У якій цифровий формат буде завантажений PNG типу RGB888

Відповідь – BitmapConf i g RGB 565 Це відбувається автоматично для будь-якого RGB888 PNG-файла, що завантажується через Bi tmapFactory Причина – справжній фреймбуфер більшості пристроїв Android працює з цим колірним форматом Завантаження зображення з більшою глибиною може бути порожньою тратою памяті – все одно ці пікселі будуть перетворені в RGB565 при фінальному рендеринге

Тоді навіщо присутній Conf i g ARGB 8888 Справа в тому, що створення зображення може бути здійснено процесором до його промальовування під фреймбуфер При використанні альфа-компоненти у нас також буде трохи більша глибина, ніж при використанні Conf i g ARGB 4444, що може бути необхідно для деяких випадків високоякісної обробки зображення

ARGB8888 PNG-файл може бути завантажений в Bitmap з конфігурацією Config ARGB 8888 Решта два формату використовуються рідко Однак ми можемо вказати Bi tmapFactory спробувати завантажити зображення в певному колірному форматі, навіть якщо його вихідний формат відрізняється від нього

Ми використовуємо перевантажений метод Bi tmapFactory DecodeStreamC для передачі вказівки у вигляді примірника ВitmapFactory Options декодувальнику зображення Ми можемо визначити бажаний колірний формат примірника Bitmap через Bi tmapFactory Opti ons i nPref erredConfig, як показано раніше У цьому гіпотетичному прикладі формат файлу bob png буде ARGB8888 PNG, і ми хочемо змусити

BitmapFactory завантажити його і конвертувати в ARGB4444 Проте наше вказівку може бути проігноровано

Ви також можете створити порожній Bitmap наступним статичним методом:

Цілком імовірно, що ви захочете вручну попрацювати з зображенням, що називається, на льоту Клас Canvas працює з растровими зображеннями теж:

Тепер ви можете змінювати ваші зображення тим же способом, яким ви модифікували вміст View

Знищення Bitmap BitmapFactory може допомогти нам зменшити витрату памяті при завантаженні зображення Як говорилося растри займають багато місця в памяті Зменшення кількості бітів на піксель за рахунок використання іншого колірного формату допомагає, але при завантаженні одного зображення за іншим ми в кінцевому підсумку займемо всю память Тому ми повинні знищувати екземпляри Bitmap після втрати необхідності в них з допомогою цього методу:

Малювання Bitmap Після завантаження наших зображень ми можемо малювати їх за допомогою Canvas Найпростіший спосіб це зробити виглядає так:

Перший аргумент повинен бути очевидний Аргументи topLeftX і topLeftY визначають координати розміщення на екрані лівого верхнього кута зображення Останній аргумент може приймати значення null Ми могли б визначити додаткові параметри малювання в класі Paint, але необхідності в цьому немає

Існує інша версія цього методу:

Це дуже класний метод Він дозволяє нам визначити через другий параметр частину зображення Bitmap, яку необхідно малювати Клас Rect зберігає координати верхнього лівого і нижнього правого кутів прямокутника Коли ми визначаємо частину зображення через змінну src, то робимо це в системі координат обєкту Bitmap Якщо ми вкажемо значення null, буде використаний весь обєкт Bitmap Третій параметр задає частину обєкта Bitmap, в який повинна відбуватися промальовування, також у вигляді примірника Rect Проте в даному випадку координати задані щодо цільового обєкта Canvas (або View або іншого Bitmap) Великий сюрприз полягає в тому, що два цих прямокутника не обовязково повинні мати однакові розміри Якщо ми визначимо цільової прямокутник з меншим розміром, ніж вихідний, Canvas автоматично масштабує його (те ж саме відноситься до випадку, коли цільовий прямокутник більше вихідного) Останній параметр також зазвичай встановлюється в null Хочу лише зауважити, що операція масштабування – Вельми дороге з точки зору ресурсів задоволення Використовувати його варто тільки при крайній необхідності

Вас може зацікавити ще одне питання Якщо у нас є екземпляри Bitmap з різними колірними форматами, чи необхідно нам конвертувати їх в якій-небудь стандартний формат перед промальовуванням в Canvas Ні, Canvas зробить це автоматично Звичайно, використовувати колірні формати, близькі до рідних форматам фреймбуфер, буде трохи швидше Проте зазвичай ми просто ігноруємо цей крок

Змішування також за умовчанням включено, так що якщо наші зображення містять для своїх пікселів альфа-компоненти, вони будуть оброблятися

Всі разом

З усією отриманою інформацією ми тепер можемо завантажувати і промальовувати кілька Бобов Лістинг 414 містить вихідний код активності BitmapTest, який я написав для демонстрації

Лістинг 414 Активність BitmapTest package combadogi сandroi dgames

Метод onCreateO вивчений нами вздовж і поперек, тому зосередимося на нашій реалізації View Цей клас містить два члени типу Bitmap: один з них зберігає картинку Боба у форматі RGB565, інший – Боба ж у форматі ARGB4444 Крім того, у нас є член типу Rect, в якому зберігаються параметри цільового прямокутника для візуалізації

У конструкторі класу RenderView ми для початку завантажуємо Боба в обєкт ЬоЬ565 Зверніть увагу – зображення завантажується з RGB888 PNG-файла, Bi tmapFactory автоматично конвертує його в формат RGB565 Щоб у цьому переконатися, ми також виводимо вміст BitmapConfig в LogCat RGB888-Bepcnn Боба має прозорий білий фон, тому немає необхідності проводити змішування

Далі ми завантажуємо Боба з ARGB8888 PNG-файлу, що знаходиться в каталозі assets / Для економії памяті ми також даємо Bi tmapFactory команду перетворити це зображення у формат ARGB4444 Нагадую – factory може не підкоритися цій команді (з незрозумілих причин) Щоб побачити, чи пройшла операція, ми також виводимо вміст Bitmap Config в LogCat

Метод onDraw дуже короткий Все, що ми в ньому робимо, – малюємо вміст ЬоЬ565, розтягнуте до 250 х 250 пікселів (оригінальний розмір – 160 х 183 пікселя), а поверх нього малюємо ЬоЬ4444, що не масштабуючи, але змішуючи (це робиться автоматично обєктом Canvas) Малюнок 414 демонструє нам Боба у всій красі

Рис 414 Два Боба: один поверх іншого (при дозволі 480 х 800)

LogCat повідомляє, що ЬоЬ565 дійсно має формат Conf i g RGB 565, a bob4444 конвертований в ConfigARGB 444 – BitmapFactory не схибив

Ось кілька моментів, на які ви повинні звернути увагу

Використовуйте мінімально допустимий формат кольору для збереження памяті, але памятайте, що ціною цієї економії може стати гіршу якість візуалізації та деяке зменшення швидкості перемальовування

Без крайньої необхідності не вдавайтеся до масштабування зображень Якщо вам відомий необхідний розмір картинки, змініть вихідне зображення заздалегідь

Завжди викликайте метод Bitmap recycl е, якщо зображення вам більше не потрібно Інакше можете отримати витоку памяті і її брак

Використання LogCat для виведення тексту досить утомливо Вивчимо можливості промальовування тексту за допомогою Canvas

ПРИМІТКА

Як і у випадку з іншими класами, в Bitmap міститься набагато більше, ніж я зміг описати на цих кількох сторінках Я дав вам необхідний для написання Містера Нома мінімум Якщо хочете більшого, добро просимо на Android Developers

Джерело: Mario Zechner / Маріо Цехнер, «Програмування ігор під Android», пров Єгор Сидорович, Євген зазноби, Видавництво «Пітер»

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*