Малювання із застосуванням Canvas (полотна) в Android додатку

Тепер, коли ми вивчили, як віджети отримують екранний простір, на якому отрісовиваємих, ми можемо написати кілька віджетів, в яких здійснюється малювання

Фреймворк користувача інтерфейсу Android обробляє операції отрисовки таким способом, який вже повинен здатися вам знайомим – після того, як ми поговорили про вимірах і впорядкування Коли небудь компонент додатка визначає, що зображення, що знаходиться на екрані в даний момент, застаріло, оскільки той чи інший стан змінилося, цей компонент викликає метод и rival и date класу View У результаті такого виклику в загальну чергу подій додається подія перемальовування (redraw event)

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

Метод draw викликає метод onDraw, переобумовленої кожним подклассом для реалізації власного варіанту відображення Коли викликаний метод onDraw вашого віджета, цей віджет повинен відобразитися відповідно з актуальним станом додатки і повернути управління До речі, виявляється, що ні Viewdraw, ні ViewGroup dispatchDraw (що відповідають за обхід вершин дерева) не є фінальними Але їх перевизначення залишається на ваш страх і ризик

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

Перш ніж перейти до специфічних проблем малювання, знову розглянемо цю тему в контексті патерну однопоточному архітектури MVC, застосовуваного в Android Тут існує два важливих правила

Код малювання повинен міститися в методі onDraw При виклику onDraw віджет повинен повністю отрісовиваться, відображаючи стан програми

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

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

Canvas (підклас androidgraphics Canvas) – у Canvas (з англ – «Полотно») немає адекватного аналога в реальному світі Його можна вважати складним мольбертом, який здатний орієнтувати, згинати і навіть комкать папір, на якій ви малюєте, причому найцікавішими способами Він зберігає інформацію про прямокутнику відсікання, тому трафареті, через який ви малюєте Крім того, у міру малювання полотно може масштабувати зявляються на ньому зображення, подібно Фотозбільшувачі Він може виробляти та інші перетворення, для яких складніше підібрати аналоги з реального життя: наприклад, перетворювати кольори і малювати текст вздовж заданих ліній

Paint (підклас androidgraphicsPaint) – це засіб, за допомогою якого ви малюєте Воно відповідає за колір, прозорість і розмір кисті при малюванні обєктів на полотні Крім того, при малюванні тексту даний інструмент відповідає за підбір гарнітури, розміру і оформлення шрифту

Bitmap (підклас android Graphics Bitmap) – це «папір», на якій ви малюєте Вона зберігає пікселі намальованого зображення

Drawablе (майже підклас androidgraphicsdrawablеDrawable) – цей підклас описує те, що ви хочете намалювати: прямокутник або зображення Хоча не все, що ви малюєте, відноситься до Drawable (наприклад, текст), багато обєктів, особливо порівняно складні, – відносяться

Всі малювання в прикладі 91 проводиться тільки за допомогою Canvas, переданого як параметр до onDraw Щоб вийшло щось більш цікаве, нам як мінімум знадобиться Раіnt Він забезпечує контроль над кольором і прозорістю (альфа-каналом) графіки, яка малюється із застосуванням цього підкласу При використанні разом з методами малювання тексту цей підклас управляє гарнітурою, розмірами і оформленням тексту Paint пропонує також чимало інших можливостей Але приклад 92 вже дозволяє приступити до роботи з Paint Тут задаються два з багатьох параметрів елементів управління Paint (колір і ширина лінії) Після цього малюється жирна вертикальна лінія, а за нею – серія горизонтальних ліній Альфа-значення (що грає ту ж роль, що і четверте значення в системі квітів RGB для Веба) знижується у кожній наступній зеленої лінії, і вона виходить більш прозорою, ніж попередня Радимо детальніше ознайомитися з документацією по цьому класу і вивчити інші повязані з ним корисні атрибути

Приклад 92 Використання Paint

Картинка, створювана за допомогою даного коду, показана на рис 91

Рис 91 Висновок в програмі Paint

Тепер, додавши до нашого арсеналу Paint, ми зможемо розібратися і з більшістю інших інструментів, необхідних для того, щоб намалювати хороший віджет Наприклад, код з прикладу 93 – це віджет, з яким ми працювали в прикладі 77 Він все ще не так складний, але володіє всіма компонентами повнофункціонального віджету Він працює з компонуванням, використовує підсвічування (що показує, чи знаходиться віджет у фокусі, тобто працює користувач в даний момент саме з ним) і відображає стан моделі, до якої прикріплений Віджет малює серію крапок, інформація про які зберігається в закритому масиві Кожна точка вказує власні координати по осях X і F, а також власні діаметр і колір Функція onDraw встановлює колір в Раіnt для кожної точки окремо і використовує інші параметри визначення окружності, яка малюється методом dray / Сіrcle, що належать до полотна

Приклад 93 Віджет з точками

Як і у випадку з Paint, у нас тепер якраз достатньо місця, щоб приступити до досліджень методів Canvas Функції можна умовно розділити на дві групи, і обидві ці групи варто обговорити окремо

Джерело: Android Програмування на Java для нового покоління мобільних пристроїв

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


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

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

Ваш отзыв

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

*

*