Главная » Разработка для Android » Матричные преобразования в Android приложении

0

 

Вторая интересная группа методов Canvas – матричные преобразования Matriх и их вспомогательные методы rotate, seal е и skew. Эти методы должен сразу узнать любой специалист, которому приходилось работать с трехмерной графикой в других окружениях. Такие методы позволяют отображать отдельно взятый рисунок так, как если бы зритель двигался относительно рисуемых объектов.

Небольшое приложение для примера 9.6 демонстрирует возможности координатных преобразований, присущих Canvas.

Пример 9.6. Использование преобразований при работе с холстом

Результат выполнения этого пространного кода показан на рис. 9.3.

Рис. 9.3. Преобразованные виды

Некоторые фрагменты кода отмечены цифрами.

Это определение нового виджета TransformedViewWidget.

Из второго аргумента конструктора код получает информацию о том, какое именно преобразование следует произвести.

Это метод onDraw класса TransformedViewWidget.

Код помещает актуальное состояние рисования в стек, используя save перед осуществлением каких-либо преобразований.

Выполнение преобразования, переданного в качестве второго аргумента конструктора.

Восстановление прежнего состояния, сохраненного на этапе 4, приготовление к рисованию ограничивающей рамки и метки.

Это метод onCreate, относящийся к активности Activity.

Создание контейнерного вида для левого столбца с виджетами.

Здесь происходит инстанцирование TransformedViewWidget, добавляемых в левый столбец.

Создание преобразования, входящего в список параметров, которые передаются конструктору TransformedViewWidget. ф Создание контейнерного вида для виджетов, входящих в правый столбец, фИнстанцирование TransformedViewWidget, добавляемых в правый столбец.

Это небольшое приложение подсказывает нам ряд новых идей. Что касается видов и виджетов, данное приложение определяет единственный виджет, Transf ormedViewWidget, и создает восемь его экземпляров. Что касается компоновки, приложение создает два вида, которые называются vl и v2, получая их параметры из ресурсов. Затем программа добавляет по четыре экземпляра Trans formedViewWidget к каждому виду LinearLayout. На этом примере видно, как в приложении можно комбинировать динамические виды и виды, основанные на ресурсах. Обратите внимание: создание контейнерных видов, а также создание новых виджетов происходит в методе onCreate, относящемся к активности.

Кроме того, данное приложение обеспечивает значительную гибкость виджета, поскольку решаемые задачи умело распределяются между самим виджётом и родительским видом. Рисование нескольких простых объектов определено в методе onDraw класса Transf ormedViewWidget:

белый фон;

слово Неllо зеленым шрифтом (12-й кегль);

слово Android красным шрифтом (16-й кегль);

черная рамка;

голубая метка.

В центре всего этого метод onDraw осуществляет преобразование, указываемое вызывающей стороной. Приложение определяет собственный интерфейс, названный Transformation, а конструктор TransformedViewWidget принимает Transformation в качестве параметра. Рассмотрим детально, как именно задается преобразование.

Сначала изучим, как onDraw сохраняет собственный текст, также допуская при этом преобразование. В данном примере нам необходимо убедиться, что и рамка, и метка рисуются поверх любых других элементов, отрисовываемых виджетом, даже если рамка или метка накладываются на эти элементы. Мы же не хотим, чтобы преобразование затронуло рамку или метку.

Удобно, что Canvas поддерживает внутренний стек, в который можно записать, а потом и восстановить матрицу преобразования, прямоугольник отсечения, а также любые другие элементы изменяемого состояния Canvas. Пользуясь преимуществами этого стека, onDraw вызывает Canvas .save для сохранения своего состояния перед преобразованием, a Canvas. restore – после, для восстановления сохраненного состояния.

Оставшаяся часть приложения контролирует преобразование, применяемое к каждому из восьми экземпляров TransformedViewWidget. Каждый новый экземпляр виджета создается с собственным анонимным экземпляром Transformation. К изображению в области, помеченной identity (дословно – «сущность»), никакого преобразования не применяется. Остальные семь областей помечены названиями тех преобразований, которые в них демонстрируются.

Базовые методы преобразования в Canvas – это setMatrix и concatMatrix. Два данных метода позволяют строить всевозможные преобразования. Метод getMatri х дает возможность восстанавливать динамически созданную матрицу для последующего использования. Методы, показанные в примере, – translate, rotate, scale и skew – являются вспомогательными и образуют на основе конкретных специфических матриц, с каждой из которых связаны собственные ограничения, актуальное состояние Canvas.

Хотя на первый взгляд это и неочевидно, такие функции преобразования могут быть исключительно полезны. Допустим, они позволяют изменить ракурс, под которым мы видим окно приложения, относительно трехмерного объекта! Например, не нужно особого воображения, чтобы понять, что сцена в квадрате sealе(. 5,. 8) – та же, что и в квадрате identity, но первая сцена показана чуть издалека. Приложим еще немного воображения – и изображение в квадрате skew( .1, .3) может показаться неизмененной картинкой, но на этот раз показанной сверху и чуть сбоку. Масштабирование или преобразование объекта может создать у пользователя такое впечатление, как будто этот объект сдвинулся, а при наклоне и вращении – как будто объект повернулся.

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

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

По теме:

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