Главная » Разработка для Android » Рисование с применением Canvas (холста) в Android приложении

0

Теперь, когда мы изучили, как виджеты получают экранное пространство, на котором отрисовываются, мы можем написать несколько виджетов, в которых осуществляется рисование.

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

Когда рано или поздно программа переходит к обработке этого события, фреймворк вызывает метод draw в верхней точке дерева видов. На этот раз вызов распространяется в прямом порядке, то есть каждый вид сначала отрисовывается, а потом делает вызовы к своим дочерним видам. Это означает, что «листовые» виды рисуются после своих родительских видов, которые, в свою очередь, рисуются после своих родительских элементов. Получается, что виды, находящиеся выше по дереву, рисуются раньше, чем те, которые находятся ближе к корню дерева.

Метод draw вызывает метод onDraw, переопределяемый каждым подклассом для реализации собственного варианта отображения. Когда вызван метод onDraw вашего виджета, этот виджет должен отобразиться в соответствии с актуальным состоянием приложения и вернуть управление. Кстати, оказывается, что ни View.draw, ни ViewGroup. dispatchDraw (отвечающие за обход вершин дерева) не являются финальными. Но их переопределение остается на ваш страх и риск!

Чтобы не приходилось чрезмерно много всего рисовать, фреймворк пользовательского интерфейса Android сохраняет определенную информацию о состоянии вида. Данная информация называется прямоугольником отсечения. Он является одной из ключевых концепций фреймворка и входит в состав информации о состоянии, которая передается в вызовах к методам графического отображения компонента. Расположение и размер этого прямоугольника можно получить и откорректировать при помощи соответствующих методов холста. Данный прямоугольник действует как трафарет, через который компонент выполняет все рисование: это означает, что компонент может рисовать только на тех участках холста, которые видны через прямоугольник отсечения. Правильно задавая размер, контуры и положение прикладываемого прямоугольника отсечения, фреймворк не позволяет компоненту ничего рисовать вне отведенных ему границ либо перерисовывать области, которые уже отрисованы правильно.

Прежде чем перейти к специфическим проблемам рисования, снова рассмотрим эту тему в контексте паттерна однопоточной архитектуры MVC, применяемого в Android. Здесь существует два важных правила.

Код рисования должен содержаться в методе onDraw. При вызове onDraw виджет должен полностью отрисовываться, отражая состояние программы.

При активации onDraw виджет должен отрисовываться максимально быстро. В ходе запроса к onDraw нет времени выполнять сложный запрос к базе данных или определять состояние какой-нибудь удаленной сетевой службы. Все состояние, которое вам необходимо отрисовать, должно быть кэшировано и готово к использованию прямо во время рисования. Информация о состоянии модели, кэшируемая в виде, иногда называется моделью вида.

При рисовании во фреймворке пользовательского интерфейса Android применяются четыре основных класса. Если вы собираетесь реализовывать пользовательские виджеты и выполнять собственные операции отрисовки, вам нужно досконально познакомиться с этими классами.

Canvas (подкласс android.graphics .Canvas) – у Canvas (с англ. – «холст») нет адекватного аналога в реальном мире. Его можно считать сложным мольбертом, который способен ориентировать, сгибать и даже комкать бумагу, на которой вы рисуете, причем самыми интересными способами. Он сохраняет информацию о прямоугольнике отсечения, том трафарете, через который вы рисуете. Кроме того, по мере рисования холст может масштабировать появляющиеся на нем изображения, подобно фотоувеличителю. Он может производить и другие преобразования, для которых сложнее подобрать аналоги из реальной жизни: например, преобразовывать цвета и рисовать текст вдоль заданных линий.

Paint (подкласс android.graphics.Paint) – это средство, при помощи которого вы рисуете. Оно отвечает за цвет, прозрачность и размер кисти при рисовании объектов на холсте. Кроме того, при рисовании текста данный инструмент отвечает за подбор гарнитуры, размера и оформления шрифта.

Bitmap (подкласс android. graphics. Bitmap) – это «бумага», на которой вы рисуете. Она хранит пикселы нарисованного изображения.

Drawablе (почти подкласс android.graphics.drawablе.Drawable) – этот подкласс описывает то, что вы хотите нарисовать: прямоугольник или изображение. Хотя не все, что вы рисуете, относится к Drawable (например, текст), многие объекты, особенно сравнительно сложные, – относятся.

Все рисование в примере 9.1 производится только при помощи Canvas, передаваемого в качестве параметра к onDraw. Чтобы получилось что-нибудь более интересное, нам как минимум понадобится Раіnt. Он обеспечивает контроль над цветом и прозрачностью (альфа-каналом) графики, которая рисуется с применением этого подкласса. При использовании вместе с методами рисования текста этот подкласс управляет гарнитурой, размерами и оформлением текста. Paint предлагает также немало других возможностей. Но пример 9.2 уже позволяет приступить к работе с Paint. Здесь задаются два из многих параметров элементов управления Paint (цвет и ширина линии). После этого рисуется жирная вертикальная линия, а за ней – серия горизонтальных линий. Альфа-значение (играющее ту же роль, что и четвертое значение в системе цветов RGB для Веба) снижается в каждой последующей зеленой линии, и она получается более прозрачной, чем предыдущая. Советуем подробнее ознакомиться с документацией по этому классу и изучить другие связанные с ним полезные атрибуты.

Пример 9.2. Использование Paint

Картинка, создаваемая с помощью данного кода, показана на рис. 9.1.

Рис. 9.1. Вывод в программе Paint

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

Пример 9.3. Виджет с точками

Как и в случае с Paint, у нас теперь как раз достаточно места, чтобы приступить к исследованиям методов Canvas. Функции можно условно разделить на две группы, и обе эти группы стоит обсудить отдельно.

Источник: Android. Программирование на Java для нового поколения мобильных устройств

По теме:

  • Комментарии