25
Работа с графической подсистемой Олег Годовых

Android - 10 - Graphics

  • Upload
    noveo

  • View
    250

  • Download
    1

Embed Size (px)

DESCRIPTION

Introduction to Android graphic subsystem

Citation preview

Page 1: Android - 10 - Graphics

Работа с графической подсистемой

Олег Годовых

Page 2: Android - 10 - Graphics

Поддерживаемые форматы

I JPEG (без цветовых пространств)I PNGI GIF (только чтение, без анимации)I BMP (только чтение)I А мой любимый *назови формат по вкусу*?

2 Работа с графической подсистемой

Page 3: Android - 10 - Graphics

Поддерживаемые форматы

I Есть разные библиотекиI Есть C++ и NDKI Есть спецификации форматов

3 Работа с графической подсистемой

Page 4: Android - 10 - Graphics

Как отображать

I ImageViewI Любому View можно назначить фон (android:background).I Можно загрузить во встроенный браузер (WebView).I Можно отрисовывать через OpenGL и SurfaceView.I Всегда можно отрисовывать вручную через Canvas.

4 Работа с графической подсистемой

Page 5: Android - 10 - Graphics

Класс Bitmap

I Представление картинки в памяти.I Может быть mutable и immutable.I Создаётся или напрямую статическим методомcreateBitmap, или при чтении из источника данных (файл,поток, ресурс и т. д.) статическими методами классаBitmapFactory

I До Android API 11 (Android 3.0+) нельзя было считатькартинку в mutable bitmap. Печалька

5 Работа с графической подсистемой

Page 6: Android - 10 - Graphics

Класс Bitmap

I Можно узнать размеры изображения.I Можно скопировать/отмасштабировать изображение.I Можно закрасить пиксель/всё изображение/частьизображения.

I Можно хапнуть горя с памятью.

6 Работа с графической подсистемой

Page 7: Android - 10 - Graphics

Класс Bitmap

I Память под Bitmap выделяется 2 кусками:I До Android 3.0:

I Метаданные и прочая Java-обёрткаI Собственно данные о пикселях в нативной куче (которойDalvik VM не управляет).

I С Android 3.0:I Всё лежит в Dalvik heap.

7 Работа с графической подсистемой

Page 8: Android - 10 - Graphics

Класс Bitmap

I Занимает в памяти 4 * width * heightI Можно использовать RGB-565 и лишиться прозрачностиI Можно использовать ARGB-4444, который давноdeprecated, и картинка не будет радовать цветами.

I Dalvik VM не дефрагментирует память, поэтому даже еслив куче хватает места, OutOfMemoryError следит за вами.

8 Работа с графической подсистемой

Page 9: Android - 10 - Graphics

Класс Bitmap

I Bitmap освобождает память в 2 случаях:I при сборке мусора и вызове finalize()I при явном вызове метода recycle()

I После вызова recycle() картинка не может бытьиспользована — выбрасывается исключение.

I В новых версиях не рекомендуется использовать recycle()

9 Работа с графической подсистемой

Page 10: Android - 10 - Graphics

Класс Bitmap

I Делаем recycle(), как только картинка становится не нужна.I Если нужно много изображений — выделяем память пристарте приложения, создаём пул картинок.

I При создании через BitmapFactory ставим нужные флаги вBitmapFactory .Options.

I Bitmap bitmap = BitmapFactory.decodeFile(new File("sample.png"));

I Проверить размер картинки(BitmapOptions.inJustDecodeBounds)

I Открыть картинку сразу с масштабированием.I Пробовать ловить OutOfMemoryError и в случае нехваткипамяти грузить картинку с другой цветовой палитрой илиещё уменьшить размер.

10 Работа с графической подсистемой

Page 11: Android - 10 - Graphics

Класс Bitmap

I Делаем recycle(), как только картинка становится не нужна.I Если нужно много изображений — выделяем память пристарте приложения, создаём пул картинок.

I При создании через BitmapFactory ставим нужные флаги вBitmapFactory .Options.

I Bitmap bitmap = BitmapFactory.decodeFile(new File("sample.png"));

I Проверить размер картинки(BitmapOptions.inJustDecodeBounds)

I Открыть картинку сразу с масштабированием.I Пробовать ловить OutOfMemoryError и в случае нехваткипамяти грузить картинку с другой цветовой палитрой илиещё уменьшить размер.

11 Работа с графической подсистемой

Page 12: Android - 10 - Graphics

Класс Drawable

Класс-обёртка для различных видов изображений. Можетсодержать внутри:

I BitmapI Геометрическую фигуру с закраскойI 9-patch изображениеI АнимациюI Несколько слоёвI Комбинацию разных DrawableI И кучу всего ещё (читайте про android.graphics.drawable)

12 Работа с графической подсистемой

Page 13: Android - 10 - Graphics

Класс Drawable

I BitmapDrawable создаётся «вокруг» обычного Bitmap.I Он создаётся неявно, когда мы ставим картинку вImageView через задание android:src.

I Мы получаем весь тот же набор проблем с памятью.I Можно достать картинку через getBitmap() и удалить какраньше.

I Обязательно не забудьте установить перед удалениемcallback для Drawable в null для сборки памяти (поумолчанию ставится на вьюху-родитель).

13 Работа с графической подсистемой

Page 14: Android - 10 - Graphics

Класс ImageView

I Мы можем задать, как масштабировать изображение.I Можем применить матрицу преобразования, обрезать илисжать/растянуть в зависимости от размеров.

I Подробнее о том, как что преобразуется — здесь:http://etcodehome.blogspot.com/2011/05/android-imageview-scaletype-samples.html.

14 Работа с графической подсистемой

Page 15: Android - 10 - Graphics

9-patch

Когда у нас есть кнопка/поле ввода/любой другой элемент, укоторого мы не знаем размер отображаемых данных — какставить фон?

I Можем растянуть, но тогда будет некрасиво или появятсяартефакты по углам.

I Можем замостить узором, но не всегда это приемлемо

15 Работа с графической подсистемой

Page 16: Android - 10 - Graphics

9-patch

16 Работа с графической подсистемой

Page 17: Android - 10 - Graphics

Ресурсы

Папкам для drawable мы можем ставить квалификаторыI по разрешению (-*dpi)I по размеру (-small, -normal, -large, -xlarge)

Комбинируя эти квалификаторы, можно сделать абсолютноразный набор графики для телефонов и планшетов.Если одна и та же картинка совпадает для разных размеровэкрана, кладём её в drawable-nodpi, а в соответствующихпапках ставим на неё ссылку через xml:<?xml version="1.0" encoding="utf-8"?><bitmap xmlns:android=http://schemas.android.com/apk/res/androidandroid:src="@drawable/im_bkg_help_control_normal" />

17 Работа с графической подсистемой

Page 18: Android - 10 - Graphics

State drawables

I У кнопки есть несколько состояний: обычное, нажатое,выделенное.

I Возможно, понадобится отображать её разным цветом взависимости от ситуации.

I Придётся вешать обработчики на все события и менятьфон/изображение?

18 Работа с графической подсистемой

Page 19: Android - 10 - Graphics

State drawables

Нас спасёт State Drawable!<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:drawable="@drawable/button_pressed" android:state_pressed="true"/><item android:drawable="@drawable/button_default"/>

</selector>

Такой же трюк можно провернуть с цветами, установив их длятекста.

19 Работа с графической подсистемой

Page 20: Android - 10 - Graphics

Shape drawables

Простые графические примитивы не обязательно рисоватьруками в любимом фотошопе. Можно их задать через ShapeDrawable в xml.<shape xmlns:android="http://schemas.android.com/apk/res/android"

android:shape="rectangle"><corners android:radius="5dip" /><gradient

android:angle="270"android:type="linear"android:startColor="#000000"android:endColor="#ffffff"/>

</shape>

20 Работа с графической подсистемой

Page 21: Android - 10 - Graphics

Canvas

I Наследуемся от View, переопределяем onDraw().I Можем рисовать геометрические примитивы напрямуюруками.

I Не стоит забывать о буферизации и не делать слишкомчасто перерисовку (быстрее 60 кадров в секунду не будет,а вот батарею скушать можно бодро).

21 Работа с графической подсистемой

Page 22: Android - 10 - Graphics

Canvas

I .moveTo(), .lineTo() — и мы рисуем линии.I Используем класс Path, если нам надо нарисоватьсложную ломаную или много примитивов, тогда отрисовкабудет проходить быстрее.

I Класс Picture позволяет кэшировать запросы к Canvas(отрисовали раз, потом из него воспроизводим гораздобыстрее) — но он не работает при аппаратном ускорении.

I Класс Paint — настройки кисти. Не создавайте лишний раз,иногда лучше создать статический объект или полеэкземпляра.

22 Работа с графической подсистемой

Page 23: Android - 10 - Graphics

Canvas

I Можно нарисовать тот же Bitmap.I Можно написать текст.I Можно «изогнуть» текст вдоль кривой или ломаной.I Можно применять матрицы преобразований.I Можно сохранять и восстанавливать матрицу — OpenGLдля бедных.

23 Работа с графической подсистемой

Page 24: Android - 10 - Graphics

Загрузка из сети

I https://github.com/nostra13/Android-Universal-Image-Loader

I http://square.github.io/picassoI В составе некоторых сетевых библиотек есть своизагрузчики картинок (в Volley точно есть).

I Есть в составе комбинированных библиотек (AQuery)I В конце концов, можно поставить URL в ImageView(.setImageUrl())

24 Работа с графической подсистемой

Page 25: Android - 10 - Graphics

Полезные ссылки

I http://developer.android.com/guide/topics/graphics/2d-graphics.html

I http://developer.android.com/training/displaying-bitmaps/index.html

I http://androiddrawables.com

25 Работа с графической подсистемой