Матричні перетворення в Android додатку

&nbsp

Друга цікава група методів Canvas – матричні перетворення Matriх і їх допоміжні методи rotate, seal е і skew Ці методи повинен відразу дізнатися будь-який фахівець, якому доводилося працювати з тривимірною графікою в інших оточеннях Такі методи дозволяють відображати окремо взятий малюнок так, як якби глядач рухався щодо змальованих обєктів

Невелике додаток для прикладу 96 демонструє можливості координатних перетворень, властивих Canvas

Приклад 96 Використання перетворень при роботі з полотном

Результат виконання цього розлогого коду показаний на рис 93

Рис 93 Перетворені види

Деякі фрагменти коду відзначені цифрами

Це визначення нового віджету 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 для нового покоління мобільних пристроїв

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


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

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

Ваш отзыв

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

*

*