SlideShare a Scribd company logo
Работа с графической
подсистемой
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

PDF
Android - 10 - Graphics
PDF
Podlodka i os crew 8
PDF
UI, сделай мне хорошо
PPT
Знакомство с ГР Gimp
PDF
PDF
Toolbar (Lecture 16 – toolbar)
PDF
Push Notifications (Lecture 22 – push notifications)
PDF
Fragments (Lecture 09 – Fragments)
Android - 10 - Graphics
Podlodka i os crew 8
UI, сделай мне хорошо
Знакомство с ГР Gimp
Toolbar (Lecture 16 – toolbar)
Push Notifications (Lecture 22 – push notifications)
Fragments (Lecture 09 – Fragments)

Viewers also liked (20)

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

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

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

More from Noveo (18)

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