Upload
noveo
View
250
Download
1
Embed Size (px)
DESCRIPTION
Introduction to Android graphic subsystem
Citation preview
Работа с графической подсистемой
Олег Годовых
Поддерживаемые форматы
I JPEG (без цветовых пространств)I PNGI GIF (только чтение, без анимации)I BMP (только чтение)I А мой любимый *назови формат по вкусу*?
2 Работа с графической подсистемой
Поддерживаемые форматы
I Есть разные библиотекиI Есть C++ и NDKI Есть спецификации форматов
3 Работа с графической подсистемой
Как отображать
I ImageViewI Любому View можно назначить фон (android:background).I Можно загрузить во встроенный браузер (WebView).I Можно отрисовывать через OpenGL и SurfaceView.I Всегда можно отрисовывать вручную через Canvas.
4 Работа с графической подсистемой
Класс Bitmap
I Представление картинки в памяти.I Может быть mutable и immutable.I Создаётся или напрямую статическим методомcreateBitmap, или при чтении из источника данных (файл,поток, ресурс и т. д.) статическими методами классаBitmapFactory
I До Android API 11 (Android 3.0+) нельзя было считатькартинку в mutable bitmap. Печалька
5 Работа с графической подсистемой
Класс Bitmap
I Можно узнать размеры изображения.I Можно скопировать/отмасштабировать изображение.I Можно закрасить пиксель/всё изображение/частьизображения.
I Можно хапнуть горя с памятью.
6 Работа с графической подсистемой
Класс Bitmap
I Память под Bitmap выделяется 2 кусками:I До Android 3.0:
I Метаданные и прочая Java-обёрткаI Собственно данные о пикселях в нативной куче (которойDalvik VM не управляет).
I С Android 3.0:I Всё лежит в Dalvik heap.
7 Работа с графической подсистемой
Класс Bitmap
I Занимает в памяти 4 * width * heightI Можно использовать RGB-565 и лишиться прозрачностиI Можно использовать ARGB-4444, который давноdeprecated, и картинка не будет радовать цветами.
I Dalvik VM не дефрагментирует память, поэтому даже еслив куче хватает места, OutOfMemoryError следит за вами.
8 Работа с графической подсистемой
Класс Bitmap
I Bitmap освобождает память в 2 случаях:I при сборке мусора и вызове finalize()I при явном вызове метода recycle()
I После вызова recycle() картинка не может бытьиспользована — выбрасывается исключение.
I В новых версиях не рекомендуется использовать recycle()
9 Работа с графической подсистемой
Класс Bitmap
I Делаем recycle(), как только картинка становится не нужна.I Если нужно много изображений — выделяем память пристарте приложения, создаём пул картинок.
I При создании через BitmapFactory ставим нужные флаги вBitmapFactory .Options.
I Bitmap bitmap = BitmapFactory.decodeFile(new File("sample.png"));
I Проверить размер картинки(BitmapOptions.inJustDecodeBounds)
I Открыть картинку сразу с масштабированием.I Пробовать ловить OutOfMemoryError и в случае нехваткипамяти грузить картинку с другой цветовой палитрой илиещё уменьшить размер.
10 Работа с графической подсистемой
Класс Bitmap
I Делаем recycle(), как только картинка становится не нужна.I Если нужно много изображений — выделяем память пристарте приложения, создаём пул картинок.
I При создании через BitmapFactory ставим нужные флаги вBitmapFactory .Options.
I Bitmap bitmap = BitmapFactory.decodeFile(new File("sample.png"));
I Проверить размер картинки(BitmapOptions.inJustDecodeBounds)
I Открыть картинку сразу с масштабированием.I Пробовать ловить OutOfMemoryError и в случае нехваткипамяти грузить картинку с другой цветовой палитрой илиещё уменьшить размер.
11 Работа с графической подсистемой
Класс Drawable
Класс-обёртка для различных видов изображений. Можетсодержать внутри:
I BitmapI Геометрическую фигуру с закраскойI 9-patch изображениеI АнимациюI Несколько слоёвI Комбинацию разных DrawableI И кучу всего ещё (читайте про android.graphics.drawable)
12 Работа с графической подсистемой
Класс Drawable
I BitmapDrawable создаётся «вокруг» обычного Bitmap.I Он создаётся неявно, когда мы ставим картинку вImageView через задание android:src.
I Мы получаем весь тот же набор проблем с памятью.I Можно достать картинку через getBitmap() и удалить какраньше.
I Обязательно не забудьте установить перед удалениемcallback для Drawable в null для сборки памяти (поумолчанию ставится на вьюху-родитель).
13 Работа с графической подсистемой
Класс ImageView
I Мы можем задать, как масштабировать изображение.I Можем применить матрицу преобразования, обрезать илисжать/растянуть в зависимости от размеров.
I Подробнее о том, как что преобразуется — здесь:http://etcodehome.blogspot.com/2011/05/android-imageview-scaletype-samples.html.
14 Работа с графической подсистемой
9-patch
Когда у нас есть кнопка/поле ввода/любой другой элемент, укоторого мы не знаем размер отображаемых данных — какставить фон?
I Можем растянуть, но тогда будет некрасиво или появятсяартефакты по углам.
I Можем замостить узором, но не всегда это приемлемо
15 Работа с графической подсистемой
9-patch
16 Работа с графической подсистемой
Ресурсы
Папкам для 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 Работа с графической подсистемой
State drawables
I У кнопки есть несколько состояний: обычное, нажатое,выделенное.
I Возможно, понадобится отображать её разным цветом взависимости от ситуации.
I Придётся вешать обработчики на все события и менятьфон/изображение?
18 Работа с графической подсистемой
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 Работа с графической подсистемой
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 Работа с графической подсистемой
Canvas
I Наследуемся от View, переопределяем onDraw().I Можем рисовать геометрические примитивы напрямуюруками.
I Не стоит забывать о буферизации и не делать слишкомчасто перерисовку (быстрее 60 кадров в секунду не будет,а вот батарею скушать можно бодро).
21 Работа с графической подсистемой
Canvas
I .moveTo(), .lineTo() — и мы рисуем линии.I Используем класс Path, если нам надо нарисоватьсложную ломаную или много примитивов, тогда отрисовкабудет проходить быстрее.
I Класс Picture позволяет кэшировать запросы к Canvas(отрисовали раз, потом из него воспроизводим гораздобыстрее) — но он не работает при аппаратном ускорении.
I Класс Paint — настройки кисти. Не создавайте лишний раз,иногда лучше создать статический объект или полеэкземпляра.
22 Работа с графической подсистемой
Canvas
I Можно нарисовать тот же Bitmap.I Можно написать текст.I Можно «изогнуть» текст вдоль кривой или ломаной.I Можно применять матрицы преобразований.I Можно сохранять и восстанавливать матрицу — OpenGLдля бедных.
23 Работа с графической подсистемой
Загрузка из сети
I https://github.com/nostra13/Android-Universal-Image-Loader
I http://square.github.io/picassoI В составе некоторых сетевых библиотек есть своизагрузчики картинок (в Volley точно есть).
I Есть в составе комбинированных библиотек (AQuery)I В конце концов, можно поставить URL в ImageView(.setImageUrl())
24 Работа с графической подсистемой
Полезные ссылки
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 Работа с графической подсистемой