SlideShare a Scribd company logo
1 of 23
Download to read offline
Работа с графической
подсистемой
Android
Дмитрий Колесников
Поддерживаемые форматы.
JPEG
PNG
GIF (только чтение, с некоторыми приседаниями можно запустить анимацию)
BMP (только чтение)
Остальные форматы.
Есть разные библиотеки
Есть C++ и NDK
Есть спецификации форматов
Как отображать
ImageView.
Любому View можно назначить фон (android:background).
Загрузить во встроенный браузер (WebView).
Отрисовывать через OpenGL и SurfaceView.
Отрисовывать вручную через Canvas.
Класс Bitmap.
Представление картинки в памяти.
Может быть mutable и immutable.
Создаётся или напрямую статическим методом createBitmap, или при чтении из источника
данных (файл, поток, ресурс и т. д.) статическими методами класса BitmapFactory
Можно узнать размеры изображения.
Можно скопировать/отмасштабировать изображение.
Можно закрасить пиксель/всё изображение/часть изображения.
Можно хапнуть горя с памятью.
Класс Bitmap.
Память под Bitmap выделяется 2 кусками:
До Android 3.0:
Метаданные и прочая Java-обёртка
Собственно данные о пикселях в нативной куче (которой Dalvik VM не управляет)
С Android 3.0:
Всё лежит в Dalvik (ART) heap.
Класс Bitmap.
Bitmap Занимает в памяти 4 * width * height.
Можно использовать RGB-565 и лишиться прозрачности.
Можно использовать ARGB-4444, который давно deprecated, и картинка не будет радовать
цветами.
Dalvik VM не дефрагментирует память, поэтому даже если в куче хватает места,
OutOfMemoryError следит за вами.
Класс Bitmap.
Bitmap освобождает память в 2 случаях:
при сборке мусора и вызове finalize()
при явном вызове метода recycle()
После вызова recycle() картинка не может быть использована — выбрасывается исключение.
В старых версиях Android (API <= 10) использование recycle() настоятельно рекомендуется, в
новых - не является обязательным, но хуже не будет
Итого
Делаем recycle(), как только картинка становится не нужна. В том числе, если в тот же
Bitmap загружаем новое изображение
Если нужно много изображений — выделяем память при старте приложения, создаём пул
картинок.
При создании через BitmapFactory ставим нужные флаги в BitmapFactory.Options.
Проверить размер картинки (BitmapOptions.inJustDecodeBounds).
Открыть картинку сразу с масштабированием.
Пробовать ловить OutOfMemoryError и в случае нехватки памяти грузить картинку с другой
цветовой палитрой или ещё уменьшить размер.
Класс Drawable.
Класс-обёртка для различных видов изображений. Может содержать внутри:
Bitmap
Геометрическую фигуру с закраской
9-patch изображение
Анимацию
Несколько слоёв
И кучу всего ещё (читайте про android.graphics.drawable)
Класс BitmapDrawable.
BitmapDrawable создаётся «вокруг» обычного Bitmap.
Он создаётся неявно, когда мы ставим картинку в ImageView через задание android:src.
Мы получаем весь тот же набор проблем с памятью.
Можно достать картинку через getBitmap() и удалить как раньше.
Обязательно не забудьте установить перед удалением callback для Drawable в null для
сборки памяти (по умолчанию ставится на вьюху-родитель)
Класс ImageView.
Мы можем задать, как масштабировать изображение.
Можем применить матрицу преобразования, обрезать или сжать/растянуть в зависимости
от размеров.
Подробнее о том, как что преобразуется
9-patch
Когда у нас есть кнопка/поле ввода/любой другой элемент, у которого мы не знаем размер
отображаемых данных — как ставить фон?
Можем растянуть, но тогда будет некрасиво или появятся артефакты по углам.
Можем замостить узором, но не всегда это приемлемо.
9-patch
State drawables.
У кнопки есть несколько состояний: обычное, нажатое, выделенное.
Возможно, понадобится отображать её разным цветом в зависимости от ситуации.
Придётся вешать обработчики на все события и менять фон/изображение?
State drawables.
Нас спасёт State Drawable!
1 <?xml version="1.0" encoding="utf-8"?>
2 <selector xmlns:android="http://schemas.android.com/apk/res/android">
3 <item android:drawable="@drawable/button_pressed"
4 android:state_pressed="true"/>
5 <item android:drawable="@drawable/button_default"/>
6 </selector>
Такой же трюк можно провернуть с цветами, установив их для текста.
Shape drawables
Простые графические примитивы не обязательно рисовать руками в любимом фотошопе.
Можно их задать через Shape Drawable в xml.
1 <shape xmlns:android="http://schemas.android.com/apk/res/android"
2 android:shape="rectangle">
3 <corners android:radius="5dip" />
4 <gradient
5 android:angle="270"
6 android:type="linear"
7 android:startColor="#000000"
8 android:endColor="#ffffff"/>
9 </shape>
Canvas.
Наследуемся от View, переопределяем onDraw() или используем SurfaceView
invalidate() и postInvalidate()
Можем рисовать геометрические примитивы напрямую руками.
Не стоит забывать о буферизации и не делать слишком часто перерисовку (быстрее 60
кадров в секунду не будет, а вот батарею скушать можно бодро).
Canvas.
.moveTo(), .lineTo() — и мы рисуем линии.
.drawBitmap(), drawRect(), drawText()
Drawable.draw(Canvas)
Используем класс Path, если нам надо нарисовать сложную ломаную или много
примитивов, тогда отрисовка будет проходить быстрее.
Класс Picture позволяет кэшировать запросы к Canvas (отрисовали раз, потом из него
воспроизводим гораздо быстрее) — но он не работает при аппаратном ускорении.
Класс Paint — настройки кисти. Не создавайте лишний раз, иногда лучше создать
статический объект или поле экземпляра.
Canvas.
Можно нарисовать тот же Bitmap.
Можно написать текст.
Можно «изогнуть» текст вдоль кривой или ломаной.
Можно применять матрицы преобразований.
Porter-Duff
Подробнее
Работа с сетью
http://square.github.io/picasso
Можно поставить URL в ImageView (.setImageUrl())
Руками.
Полезные ссылки.
http://developer.android.com/guide/topics/graphics/2d-graphics.html
http://developer.android.com/training/displaying-bitmaps/index.html
https://romannurik.github.io/AndroidAssetStudio/
http://androiddrawables.com

More Related Content

Viewers also liked

Webinar: Использование UWP/WinRT Contracts и Notification в Windows 10
Webinar: Использование UWP/WinRT Contracts и Notification в Windows 10Webinar: Использование UWP/WinRT Contracts и Notification в Windows 10
Webinar: Использование UWP/WinRT Contracts и Notification в Windows 10Denis Vasilyev
 
Android - 05 - Android basics
Android - 05 - Android basicsAndroid - 05 - Android basics
Android - 05 - Android basicsNoveo
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)Noveo
 
Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Noveo
 
Seminar: Установка и настройка рабочего стенда разработчика Android-приложени...
Seminar: Установка и настройка рабочего стенда разработчика Android-приложени...Seminar: Установка и настройка рабочего стенда разработчика Android-приложени...
Seminar: Установка и настройка рабочего стенда разработчика Android-приложени...Denis Vasilyev
 
Webinar: Разработка мобильного приложения для заучивания стихов в Delphi
Webinar: Разработка мобильного приложения для заучивания стихов в DelphiWebinar: Разработка мобильного приложения для заучивания стихов в Delphi
Webinar: Разработка мобильного приложения для заучивания стихов в DelphiDenis Vasilyev
 
Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)Noveo
 
Seminar: Эффективное использование среды разработки и компилятора C++
Seminar: Эффективное использование среды разработки и компилятора C++Seminar: Эффективное использование среды разработки и компилятора C++
Seminar: Эффективное использование среды разработки и компилятора C++Denis Vasilyev
 
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Noveo
 
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)Noveo
 
Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)Noveo
 
Системы автоматизированной сборки (Lecture 05 – gradle)
Системы автоматизированной сборки (Lecture 05 – gradle)Системы автоматизированной сборки (Lecture 05 – gradle)
Системы автоматизированной сборки (Lecture 05 – gradle)Noveo
 
Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)Noveo
 
DIOR-DNA, Anton Zvonov, Part 1, Activities (жизненный цикл)
DIOR-DNA, Anton Zvonov, Part 1, Activities (жизненный цикл)DIOR-DNA, Anton Zvonov, Part 1, Activities (жизненный цикл)
DIOR-DNA, Anton Zvonov, Part 1, Activities (жизненный цикл)Антон Звонов
 
Введение в Android-разработку (Lecture 06 – basics)
Введение в Android-разработку (Lecture 06 – basics)Введение в Android-разработку (Lecture 06 – basics)
Введение в Android-разработку (Lecture 06 – basics)Noveo
 

Viewers also liked (20)

Lec 9
Lec 9Lec 9
Lec 9
 
Webinar: Использование UWP/WinRT Contracts и Notification в Windows 10
Webinar: Использование UWP/WinRT Contracts и Notification в Windows 10Webinar: Использование UWP/WinRT Contracts и Notification в Windows 10
Webinar: Использование UWP/WinRT Contracts и Notification в Windows 10
 
Lec 13
Lec 13Lec 13
Lec 13
 
Android - 05 - Android basics
Android - 05 - Android basicsAndroid - 05 - Android basics
Android - 05 - Android basics
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)
 
Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)
 
Seminar: Установка и настройка рабочего стенда разработчика Android-приложени...
Seminar: Установка и настройка рабочего стенда разработчика Android-приложени...Seminar: Установка и настройка рабочего стенда разработчика Android-приложени...
Seminar: Установка и настройка рабочего стенда разработчика Android-приложени...
 
Webinar: Разработка мобильного приложения для заучивания стихов в Delphi
Webinar: Разработка мобильного приложения для заучивания стихов в DelphiWebinar: Разработка мобильного приложения для заучивания стихов в Delphi
Webinar: Разработка мобильного приложения для заучивания стихов в Delphi
 
Canvas
CanvasCanvas
Canvas
 
Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)
 
Seminar: Эффективное использование среды разработки и компилятора C++
Seminar: Эффективное использование среды разработки и компилятора C++Seminar: Эффективное использование среды разработки и компилятора C++
Seminar: Эффективное использование среды разработки и компилятора C++
 
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
 
Lec 10
Lec 10Lec 10
Lec 10
 
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
 
Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)
 
Thread
ThreadThread
Thread
 
Системы автоматизированной сборки (Lecture 05 – gradle)
Системы автоматизированной сборки (Lecture 05 – gradle)Системы автоматизированной сборки (Lecture 05 – gradle)
Системы автоматизированной сборки (Lecture 05 – gradle)
 
Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)
 
DIOR-DNA, Anton Zvonov, Part 1, Activities (жизненный цикл)
DIOR-DNA, Anton Zvonov, Part 1, Activities (жизненный цикл)DIOR-DNA, Anton Zvonov, Part 1, Activities (жизненный цикл)
DIOR-DNA, Anton Zvonov, Part 1, Activities (жизненный цикл)
 
Введение в Android-разработку (Lecture 06 – basics)
Введение в Android-разработку (Lecture 06 – basics)Введение в Android-разработку (Lecture 06 – basics)
Введение в Android-разработку (Lecture 06 – basics)
 

Similar to Работа с графической подсистемой (Lecture 10 – Graphics)

расчетная работа(исправлен)
расчетная работа(исправлен)расчетная работа(исправлен)
расчетная работа(исправлен)Евгений Белов
 
белогорцев глеб белогорцев
белогорцев глеб белогорцевбелогорцев глеб белогорцев
белогорцев глеб белогорцевrit2010
 
Живые обои для Android. Как создать. Тонкости. Продвижение
Живые обои для Android. Как создать. Тонкости. ПродвижениеЖивые обои для Android. Как создать. Тонкости. Продвижение
Живые обои для Android. Как создать. Тонкости. ПродвижениеSergey Mikhaylov
 
Особенности тестирования мобильных приложений (Android, iOS)
Особенности тестирования мобильных приложений (Android, iOS)Особенности тестирования мобильных приложений (Android, iOS)
Особенности тестирования мобильных приложений (Android, iOS)Эльвина Сакаева
 
Расчетная работа
Расчетная работаРасчетная работа
Расчетная работаMestniy
 
форматы графических файлов
форматы графических файловформаты графических файлов
форматы графических файловs__ravil
 
2.5D игры и особенности разработки многопользовательских игр
2.5D игры и особенности разработки многопользовательских игр2.5D игры и особенности разработки многопользовательских игр
2.5D игры и особенности разработки многопользовательских игрGleb Polushkin
 
Урок 3Ds Max - полустационар "Компьютерная графика и дизайн" в КА "ШАГ"
Урок 3Ds Max - полустационар "Компьютерная графика и дизайн" в КА "ШАГ"Урок 3Ds Max - полустационар "Компьютерная графика и дизайн" в КА "ШАГ"
Урок 3Ds Max - полустационар "Компьютерная графика и дизайн" в КА "ШАГ"STEP Computer Academy (Zaporozhye)
 
Компьютерная графика
Компьютерная графикаКомпьютерная графика
Компьютерная графикаstudpro
 
Антон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в androidАнтон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в androidDataArt
 
компьютерная графика (павлюченко)
компьютерная графика (павлюченко)компьютерная графика (павлюченко)
компьютерная графика (павлюченко)svedorf
 
Как создать фотокнигу
Как создать фотокнигуКак создать фотокнигу
Как создать фотокнигуCrazyPhoto
 
Расчетная работа Цифровой коллаж
Расчетная работа Цифровой коллажРасчетная работа Цифровой коллаж
Расчетная работа Цифровой коллажsheplyakov
 

Similar to Работа с графической подсистемой (Lecture 10 – Graphics) (20)

Grafika 9
Grafika 9Grafika 9
Grafika 9
 
расчетная работа(исправлен)
расчетная работа(исправлен)расчетная работа(исправлен)
расчетная работа(исправлен)
 
белогорцев глеб белогорцев
белогорцев глеб белогорцевбелогорцев глеб белогорцев
белогорцев глеб белогорцев
 
Grafika 9klass
Grafika 9klassGrafika 9klass
Grafika 9klass
 
Живые обои для Android. Как создать. Тонкости. Продвижение
Живые обои для Android. Как создать. Тонкости. ПродвижениеЖивые обои для Android. Как создать. Тонкости. Продвижение
Живые обои для Android. Как создать. Тонкости. Продвижение
 
Uchebnik po gimp
Uchebnik po gimpUchebnik po gimp
Uchebnik po gimp
 
Практикум 3
Практикум 3Практикум 3
Практикум 3
 
Особенности тестирования мобильных приложений (Android, iOS)
Особенности тестирования мобильных приложений (Android, iOS)Особенности тестирования мобильных приложений (Android, iOS)
Особенности тестирования мобильных приложений (Android, iOS)
 
Расчетная работа
Расчетная работаРасчетная работа
Расчетная работа
 
рр
рррр
рр
 
форматы графических файлов
форматы графических файловформаты графических файлов
форматы графических файлов
 
2.5D игры и особенности разработки многопользовательских игр
2.5D игры и особенности разработки многопользовательских игр2.5D игры и особенности разработки многопользовательских игр
2.5D игры и особенности разработки многопользовательских игр
 
Lime.JS
Lime.JSLime.JS
Lime.JS
 
Урок 3Ds Max - полустационар "Компьютерная графика и дизайн" в КА "ШАГ"
Урок 3Ds Max - полустационар "Компьютерная графика и дизайн" в КА "ШАГ"Урок 3Ds Max - полустационар "Компьютерная графика и дизайн" в КА "ШАГ"
Урок 3Ds Max - полустационар "Компьютерная графика и дизайн" в КА "ШАГ"
 
Компьютерная графика
Компьютерная графикаКомпьютерная графика
Компьютерная графика
 
Lekctr
LekctrLekctr
Lekctr
 
Антон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в androidАнтон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в android
 
компьютерная графика (павлюченко)
компьютерная графика (павлюченко)компьютерная графика (павлюченко)
компьютерная графика (павлюченко)
 
Как создать фотокнигу
Как создать фотокнигуКак создать фотокнигу
Как создать фотокнигу
 
Расчетная работа Цифровой коллаж
Расчетная работа Цифровой коллажРасчетная работа Цифровой коллаж
Расчетная работа Цифровой коллаж
 

More from Noveo

Гуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрииГуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрииNoveo
 
Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)Noveo
 
Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)Noveo
 
Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)Noveo
 
Yii2
Yii2Yii2
Yii2Noveo
 
Сессии и авторизация
Сессии и авторизацияСессии и авторизация
Сессии и авторизацияNoveo
 
Rest
RestRest
RestNoveo
 
PHP basic
PHP basicPHP basic
PHP basicNoveo
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP AdvancedNoveo
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQLNoveo
 
MySQL
MySQLMySQL
MySQLNoveo
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)Noveo
 
Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)Noveo
 
Material Design (Lecture 15 – material design)
Material Design (Lecture 15 – material design)Material Design (Lecture 15 – material design)
Material Design (Lecture 15 – material design)Noveo
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Noveo
 
XML, JSON (Lecture 11 – XML, JSON)
XML, JSON (Lecture 11 – XML, JSON)XML, JSON (Lecture 11 – XML, JSON)
XML, JSON (Lecture 11 – XML, JSON)Noveo
 
Android - 16 - QR
Android - 16 - QRAndroid - 16 - QR
Android - 16 - QRNoveo
 
03 коллекции
03   коллекции03   коллекции
03 коллекцииNoveo
 

More from Noveo (18)

Гуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрииГуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрии
 
Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)
 
Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)
 
Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)
 
Yii2
Yii2Yii2
Yii2
 
Сессии и авторизация
Сессии и авторизацияСессии и авторизация
Сессии и авторизация
 
Rest
RestRest
Rest
 
PHP basic
PHP basicPHP basic
PHP basic
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP Advanced
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQL
 
MySQL
MySQLMySQL
MySQL
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)
 
Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)
 
Material Design (Lecture 15 – material design)
Material Design (Lecture 15 – material design)Material Design (Lecture 15 – material design)
Material Design (Lecture 15 – material design)
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
 
XML, JSON (Lecture 11 – XML, JSON)
XML, JSON (Lecture 11 – XML, JSON)XML, JSON (Lecture 11 – XML, JSON)
XML, JSON (Lecture 11 – XML, JSON)
 
Android - 16 - QR
Android - 16 - QRAndroid - 16 - QR
Android - 16 - QR
 
03 коллекции
03   коллекции03   коллекции
03 коллекции
 

Работа с графической подсистемой (Lecture 10 – Graphics)

  • 2. Поддерживаемые форматы. JPEG PNG GIF (только чтение, с некоторыми приседаниями можно запустить анимацию) BMP (только чтение)
  • 3. Остальные форматы. Есть разные библиотеки Есть C++ и NDK Есть спецификации форматов
  • 4. Как отображать ImageView. Любому View можно назначить фон (android:background). Загрузить во встроенный браузер (WebView). Отрисовывать через OpenGL и SurfaceView. Отрисовывать вручную через Canvas.
  • 5. Класс Bitmap. Представление картинки в памяти. Может быть mutable и immutable. Создаётся или напрямую статическим методом createBitmap, или при чтении из источника данных (файл, поток, ресурс и т. д.) статическими методами класса BitmapFactory Можно узнать размеры изображения. Можно скопировать/отмасштабировать изображение. Можно закрасить пиксель/всё изображение/часть изображения. Можно хапнуть горя с памятью.
  • 6. Класс Bitmap. Память под Bitmap выделяется 2 кусками: До Android 3.0: Метаданные и прочая Java-обёртка Собственно данные о пикселях в нативной куче (которой Dalvik VM не управляет) С Android 3.0: Всё лежит в Dalvik (ART) heap.
  • 7. Класс Bitmap. Bitmap Занимает в памяти 4 * width * height. Можно использовать RGB-565 и лишиться прозрачности. Можно использовать ARGB-4444, который давно deprecated, и картинка не будет радовать цветами. Dalvik VM не дефрагментирует память, поэтому даже если в куче хватает места, OutOfMemoryError следит за вами.
  • 8. Класс Bitmap. Bitmap освобождает память в 2 случаях: при сборке мусора и вызове finalize() при явном вызове метода recycle() После вызова recycle() картинка не может быть использована — выбрасывается исключение. В старых версиях Android (API <= 10) использование recycle() настоятельно рекомендуется, в новых - не является обязательным, но хуже не будет
  • 9. Итого Делаем recycle(), как только картинка становится не нужна. В том числе, если в тот же Bitmap загружаем новое изображение Если нужно много изображений — выделяем память при старте приложения, создаём пул картинок. При создании через BitmapFactory ставим нужные флаги в BitmapFactory.Options. Проверить размер картинки (BitmapOptions.inJustDecodeBounds). Открыть картинку сразу с масштабированием. Пробовать ловить OutOfMemoryError и в случае нехватки памяти грузить картинку с другой цветовой палитрой или ещё уменьшить размер.
  • 10. Класс Drawable. Класс-обёртка для различных видов изображений. Может содержать внутри: Bitmap Геометрическую фигуру с закраской 9-patch изображение Анимацию Несколько слоёв И кучу всего ещё (читайте про android.graphics.drawable)
  • 11. Класс BitmapDrawable. BitmapDrawable создаётся «вокруг» обычного Bitmap. Он создаётся неявно, когда мы ставим картинку в ImageView через задание android:src. Мы получаем весь тот же набор проблем с памятью. Можно достать картинку через getBitmap() и удалить как раньше. Обязательно не забудьте установить перед удалением callback для Drawable в null для сборки памяти (по умолчанию ставится на вьюху-родитель)
  • 12. Класс ImageView. Мы можем задать, как масштабировать изображение. Можем применить матрицу преобразования, обрезать или сжать/растянуть в зависимости от размеров. Подробнее о том, как что преобразуется
  • 13. 9-patch Когда у нас есть кнопка/поле ввода/любой другой элемент, у которого мы не знаем размер отображаемых данных — как ставить фон? Можем растянуть, но тогда будет некрасиво или появятся артефакты по углам. Можем замостить узором, но не всегда это приемлемо.
  • 15. State drawables. У кнопки есть несколько состояний: обычное, нажатое, выделенное. Возможно, понадобится отображать её разным цветом в зависимости от ситуации. Придётся вешать обработчики на все события и менять фон/изображение?
  • 16. State drawables. Нас спасёт State Drawable! 1 <?xml version="1.0" encoding="utf-8"?> 2 <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 <item android:drawable="@drawable/button_pressed" 4 android:state_pressed="true"/> 5 <item android:drawable="@drawable/button_default"/> 6 </selector> Такой же трюк можно провернуть с цветами, установив их для текста.
  • 17. Shape drawables Простые графические примитивы не обязательно рисовать руками в любимом фотошопе. Можно их задать через Shape Drawable в xml. 1 <shape xmlns:android="http://schemas.android.com/apk/res/android" 2 android:shape="rectangle"> 3 <corners android:radius="5dip" /> 4 <gradient 5 android:angle="270" 6 android:type="linear" 7 android:startColor="#000000" 8 android:endColor="#ffffff"/> 9 </shape>
  • 18. Canvas. Наследуемся от View, переопределяем onDraw() или используем SurfaceView invalidate() и postInvalidate() Можем рисовать геометрические примитивы напрямую руками. Не стоит забывать о буферизации и не делать слишком часто перерисовку (быстрее 60 кадров в секунду не будет, а вот батарею скушать можно бодро).
  • 19. Canvas. .moveTo(), .lineTo() — и мы рисуем линии. .drawBitmap(), drawRect(), drawText() Drawable.draw(Canvas) Используем класс Path, если нам надо нарисовать сложную ломаную или много примитивов, тогда отрисовка будет проходить быстрее. Класс Picture позволяет кэшировать запросы к Canvas (отрисовали раз, потом из него воспроизводим гораздо быстрее) — но он не работает при аппаратном ускорении. Класс Paint — настройки кисти. Не создавайте лишний раз, иногда лучше создать статический объект или поле экземпляра.
  • 20. Canvas. Можно нарисовать тот же Bitmap. Можно написать текст. Можно «изогнуть» текст вдоль кривой или ломаной. Можно применять матрицы преобразований.
  • 22. Работа с сетью http://square.github.io/picasso Можно поставить URL в ImageView (.setImageUrl()) Руками.