Я погуглив, але не зміг знайти жодної статті, щоб описати різницю між Bitmap та Drawable в Android.
Я погуглив, але не зміг знайти жодної статті, щоб описати різницю між Bitmap та Drawable в Android.
Відповіді:
Бітмап - це зображення бітового зображення (щось на зразок java.awt.Image). Малюнок - це абстракція "того, що можна намалювати". Це може бути растрове зображення (загорнуте як a BitmapDrawable
), але це також може бути однотонний колір, колекція інших об’єктів, що малюються, або будь-яка кількість інших структур.
Більшість фреймворків інтерфейсу Android любить працювати з об’єктами, що малюються, а не з об’єктами Bitmap. View може прийняти будь-який малюнок як фон. ImageView може відображати передній план для малювання. Зображення, що зберігаються як ресурси, завантажуються як об’єкти, які можна малювати.
recycle()
, ви заважаєте цим стосункам. У кращому випадку малювальне нічого не намалює; швидше за все, якийсь виняток буде застосовано пізніше. Згідно з документами , recycle()
API11 + робить те саме, що і завжди: це дозволяє звільнити власні пікселі, як тільки ви дізнаєтесь, що закінчили з ними.
recycle()
все одно звільнить рідне растрове зображення; він також встановить для буфера-члена значення null
.
Малюнок - це те, що можна намалювати. Наприклад, макет, векторне зображення (лінія, коло), шрифт, зображення тощо
Бітмап - це певний тип малюваного зображення, який є зображенням, наприклад: PNG, JPEG тощо
Растрове зображення - це не зображення. Bitmap - це карта бітів (назва примітки: Bit-map). І ця карта представляє пікселі, на яких ви можете щось намалювати. Це може бути ваш власний растровий малюнок (не зображення), наприклад квадрат:
Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
або ви можете створити об'єкт Bitmap із зображення:
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.your_image);
Бітмап - це тримач пікселів. А Canvas використовується, щоб намалювати щось на вашому растровому зображенні (на растрових пікселях).
Все про Drawable добре описано вище.
TL; DR
Деякі люди пишуть, що ви малюєте на полотні. Ви не малюєте на полотні. Ви використовуєте растрові пікселі за допомогою допоміжного методу Canvas.
Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawColor(Color.RED) // now all bitmap pixels became red
Ресурс, який можна залучити
Drawable
Ресурс є загальне поняття для графіки , яка може бути звернено на екран , і які ви можете отримати з API , такі як getDrawable(int)
або застосувати до іншого XML - ресурс з атрибутами , такими як android:drawable
і android:icon
. Існує кілька різних типів висувних матеріалів:
Файл Bitmap, графічний файл Bitmap (.png, .jpg або .gif), створює файл BitmapDrawable
.
Файл Nine-Patch , PNG
файл із розтяжними областями, що дозволяє змінювати розмір зображення на основі вмісту (.9.png), створює файл NinePatchDrawable
.
Список шарів , A, Drawable
який управляє масивом інших Drawable
s. Вони малюються в порядку масивів, тому елемент з найбільшим індексом малюється зверху, створює a LayerDrawable
.
СписокXML
станів , файл, який посилається на різні растрові графічні зображення для різних станів (наприклад, для використання іншого зображення при натисканні кнопки), створює файл StateListDrawable
.
Список рівнів , XML
файл, який визначає a, Drawable
який управляє кількістю альтернативних Drawable
s, кожному з яких присвоєно максимальне числове значення, створює a LevelListDrawable
.
Перехідний Drawable , XML
файл, який визначає, Drawable
що може перехресно згасати між двома Drawable
ресурсами, створює файл TransitionDrawable
.
Inset Drawable , XML
файл, який визначає файл, який вставляєDrawable
інший Drawable
на певну відстань. Це корисно, коли View
потрібен фон Drawble
, менший за фактичні межі подання.
Clip Drawable , XML
файл, який визначає, Drawable
що відсікає інший Drawable
на основі Drawable
поточного значення цього рівня, створює файл ClipDrawable
.
Scale Drawable , XML
файл, який визначає a, Drawable
який змінює розмір іншого Drawable
на основі його поточного значення рівня, створює a ScaleDrawable
.
Shape Drawable , XML
файл, який визначає геометричну фігуру, включаючи кольори та градієнти, створює файл ShapeDrawable
.
Також див. Документ "Анімаційний ресурс" про те, як створити файл AnimationDrawable
.
Примітка: Колір ресурс також може бути використаний в якості Ddrawable
ін XML
. Наприклад, створюючи a StateListDrawable
, ви можете посилатися на кольоровий ресурс для android:drawable
атрибута ( android:drawable="@color/green"
).
Растрове зображення
Растрове зображення. Android підтримує растрові файли у трьох форматах: .png (бажано), .jpg (прийнятно), .gif (не рекомендується).
Ви можете посилатися на файл растрових зображень безпосередньо, використовуючи ім'я файлу як ідентифікатор ресурсу, або створити ідентифікатор псевдоніма в XML.
Примітка: Файли растрових зображень можуть автоматично оптимізуватися за допомогою стиснення зображень без втрат інструментом aapt під час процесу побудови. Наприклад, справжній колір PNG, для якого не потрібно більше 256 кольорів, може бути перетворений у 8-розрядний PNG із кольоровою палітрою. Це призведе до зображення однакової якості, але яке вимагає менше пам'яті. Тому майте на увазі, що двійкові файли зображень, розміщені в цьому каталозі, можуть змінюватися під час побудови. Якщо ви плануєте читати зображення як бітовий потік, щоб перетворити його у растрове зображення, розмістіть зображення в res/raw/
папці, де вони не будуть оптимізовані.