Ресурси зображень

Андроїд генерує ідентифікатори ресурсів для файлів зображень, що розташовані в підкаталозі /res/drawable. Підтримуються файли у форматі PNG (бажано), GIF, JPG . Для кожного файлу зображення, який знаходиться в цьому каталозі, генерується унікальний ідентифікатор на основі імені файлу без розширення. Наприклад, якщо ім'я файлу "cat.jpg", то для нього буде створено ідентифікатор ресурсу R.drawable.cat. Потрібно стежити за унікальністю імен, тому якщо у вас будуть два файла "cat.jpg" і "cat.png", то виникне помилка. Крім того, не потрібно створювати додаткові підкаталоги в папці /res/drawable, так як файли звідти не будуть зчитуватися.

Можна адаптувати зображення для різних дозволів і розмірів екранів. Для цього потрібно створити спеціальні папки і складати там потрібні картинки. Наприклад, для різних дозволів екрану використовуються папки drawable-hdpi, drawable-mdpi, drawable-ldpi і так далі... Існує аналогічний поділ для розмірів екрану: drawable-normal, drawable-large і тому подібні... Можна поєднувати ці способи і створювати папки типу drawable-normal-hdpi. Для зображень, які повинні залишатися незмінними незалежно від дозволу екрану, слід створити папку drawable-nodpi.

Щоб послатися на зображення з res/drawable у XML-файлі розмітки, використовуйте наступний синтаксис:

<Button

android:id="@+id/button1"

...

android:background="@drawable/cat"

</Button>

Зверніть увагу, що в будь-якому разі ми звертаємося до ресурсу як drawable, а не drawable-hdpi чи ще якось.

Програмним способом можна достукатися до зображення наступним чином:

// викликаємо getDrawable для отримання зображення

BitmapDrawable bd = activity.getResources().getDrawable(R.drawable.cat);

// Потім можна використовувати отриманий об'єкт, щоб встановити фон

button.setBackgroundDrawable(bd);

// або можна встановити фон безпосередньо по ідентифікатору ресурса

button.setBackgroundResource(R.drawable.icon);

Android включає прості ресурси для малювання, які можна повністю описати в форматі XML. Це стосується класів ColorDrawable, ShapeDrawable і GradientDrawable. Дані ресурси зберігаються в каталозі res/drawable і можуть бути ідентифіковані в коді програми по іменах файлів, записаних у нижньому регістрі.

Якщо описувати ці ресурси у форматі XML та вказувати атрибути для них за допомогою апаратно-незалежних пікселів (density-independent pixels), система зможе їх плавно масштабувати. Як і у випадку з векторною графікою, ці ресурси можуть динамічно масштабуватися, відображаючись коректно і без артефактів при будь-яких розмірах та дозволах екрану, незалежно від щільності пікселів. Виняток — ресурс GradientDrawable, радіус якого повинен бути вказаний в пікселях.

Отримати ім'я ресурсу

Іноді потрібно отримати не сам ідентифікатор, а його ім'я у вигляді R.drawable.cat, щоб зберегти його, скажімо, в базі даних. Скористайтеся наступним прийомом :

getResources().getIdentifier("image_name","drawable", getPackageName())

getResources().getIdentifier("your.full.package.name:drawable/image_name", null, null);

Буває і зворотна задача - з імені отримати ідентифікатор ресурсу. Принцип той самий.

String mDrawableName = "cat1"; // файл cat1.png в папці drawable

int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());

Строго кажучи, це відноситься не лише до типу drawable, але зазвичай доводиться зустрічатися з проблемою саме для них.

<animated-rotate> (клас AnimatedRotateDrawable)

Ресурси для створення ефекту обертання.

Атрибут Тип Значення за замовчуванням Опис
visible boolean parent|true Determines if drawable is visible.
frameDuration integer 150 The duration of each frame, in milliseconds.
framesCount integer 12 Number of frames of rotation to animate.
pivotX float|fraction 0,5 The pivot point, as a fraction of the width.
pivotY float|fraction 0,5 The pivot point, as a fraction of the height.
drawable reference null The drawable to use for this item. Either this must be present or a drawable subelement must exist.

<animation-list> (клас AnimationDrawable)

Обертання по кадрам. Потрібно підготувати кілька схожих зображень, які будуть змінювати один одного.

Атрибут Тип Значення за замовчуванням Опис
visible boolean parent|true Determines if drawable is visible.
variablePadding boolean false If true, allows the drawable's padding to change based on the current state that is selected.
oneshot boolean false If true, the animation will only run a single time and then stop.

Якщо у нас є декілька зображень одного компонента ProgressBar.

 

 

 

<?xml version="1.0" encoding="utf-8"?>

<animation-list android:oneshot="false"

xmlns:android="schemas.android.com/apk/res/android">

<item android:duration="100">

<scale android:drawable="@drawable/blue_1" android:scaleGravity="center" />

</item>

<item android:duration="100">

<scale android:drawable="@drawable/blue_2" android:scaleGravity="center" />

</item>

<item android:duration="100">

<scale android:drawable="@drawable/blue_3" android:scaleGravity="center" />

</item>

<item android:duration="100">

<scale android:drawable="@drawable/blue_4" android:scaleGravity="center" />

</item>

<item android:duration="100">

<scale android:drawable="@drawable/blue_5" android:scaleGravity="center" />

</item>

<item android:duration="100">

<scale android:drawable="@drawable/blue_6" android:scaleGravity="center" />

</item>

<item android:duration="100">

<scale android:drawable="@drawable/blue_7" android:scaleGravity="center" />

</item>

<item android:duration="100">

<scale android:drawable="@drawable/blue_8" android:scaleGravity="center" />

</item>

<item android:duration="100">

<scale android:drawable="@drawable/blue_9" android:scaleGravity="center" />

</item>

<item android:duration="100">

<scale android:drawable="@drawable/blue_10" android:scaleGravity="center" />

</item>

<item android:duration="100">

<scale android:drawable="@drawable/blue_11" android:scaleGravity="center" />

</item>

<item android:duration="100">

<scale android:drawable="@drawable/blue_12" android:scaleGravity="center" />

</item>

</animation-list>

<bitmap> (клас BitmapDrawable)

Дозволяє використовувати растрові зображення і здійснювати з ними різні операції: розтягувати, розмножувати, вирівнювати. Часто використовується в складі інших ресурсів.

Основний атрибут src, в якому вказується файл зображення.

Атрибут gravity дозволяє управляти розміщенням картинки всередині контейнера. Використовувати можна кілька значень, розділених знаком |: top, left, center, fill та ін.

<?xml version="1.0" encoding="utf-8"?>

<bitmap

xmlns:android="http://schemas.android.com/apk/res/android"

android:gravity="top | left"

android:src="@drawable/ic_launcher">

</bitmap>

У нього також є цікавий атрибут tileMode, що дозволяє замостити зображенням весь доступний простір. Можна використовувати значення repeat, mirror, clamp.

Інші атрибути: antialias (згладжування), dither (перетворення кольорів, якщо поточної палітри недостатньо для відображення), filter (фільтр при стискувані або розтяганні), mipMap.

В android 5.0 інтерфейс (API 21) у bitmap з'явився новий атрибут android:tint, що дозволяє задавати відтінки.

<clip> (клас ClipDrawable)

Синтаксис

<?xml version="1.0" encoding="utf-8"?>

<clip

xmlns:android="http://schemas.android.com/apk/res/android"

android:drawable="@drawable/drawable_resource"

android:clipOrientation=["horizontal" | "vertical"] android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" | "fill_vertical" | "center_horizontal" | "fill_horizontal" | "center" | "fill" | "clip_vertical" | "clip_horizontal"] />

Даний вид ресурсів часто використовується для створення індикаторів прогресу.

Тег clip дозволяє обрізати Drawable по горизонтальній або вертикальній осі через атрибут clipOrientation.

Атрибут gravity дозволяє вказати напрямок обрізання. Значення атрибута можна комбінувати. Наприклад, якщо у clipOrientation значення дорівнює vertical, а у gravity - top, то відріжеться нижня частина зображення.

Створимо файл res/drawable/clipping.xml

<?xml version="1.0" encoding="utf-8"?>

<clip

xmlns:android="http://schemas.android.com/apk/res/android"

android:drawable="@drawable/cosmos"

android:clipOrientation="horizontal"

android:gravity="left" />

Привласнимо створений ресурс компоненту ImageView:

<ImageView

android:id="@+id/imageViewClip"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_gravity="center_horizontal"

android:src="@drawable/clipping" />

Сама обрізка здійснюється програмно через метод setLevel() з діапазоном значень від 0 до 10000, де 0 - картинка обрізана повністю і не видна, 10000 - картинка видна повністю.

public void onClick(View view) {

ImageView imageView = (ImageView) findViewById(R.id.imageViewClip);

ClipDrawable clipDrawable = (ClipDrawable) imageView.getDrawable();

clipDrawable.setLevel(5000);

}

У прикладі права частина обрізається по центру, залишаючи видимою ліву частину картинки.

Щоб залишити тільки четвертинку (ліву верхню частину), змінимо атрибути:

<?xml version="1.0" encoding="utf-8"?><

<clip xmlns:android="http://schemas.android.com/apk/res/android"

android:drawable="@drawable/cosmos"

android:clipOrientation="horizontal|vertical"

android:gravity="left|top" />

Наступна комбінація відріже зайве зліва та справа, залишивши лише центральну частину зображення.

<?xml version="1.0" encoding="utf-8"?>

<clip xmlns:android="http://schemas.android.com/apk/res/android"

android:drawable="@drawable/cosmos"

android:clipOrientation="horizontal"

android:gravity="center" />

<color> (класс ColorDrawable)

Кольорові ресурси використовуються у вигляді значень в папці res/values, наприклад в файлі colors.xml. Але можна звертатися до кольору, як до drawable-ресурса.

android:drawable="@color/green"

<layer-list> (класс LayerDrawable)

Можна задавати не лише прості форми, але і їх комбінації. Для цього служить клас LayerDrawable, що дозволяє накладати декілька об'єктів Drawable один поверх іншого. Описавши масив напівпрозорих об'єктів Drawable, ви можете створити складну комбінацію динамічних фігур і перетворень.

LayerDrawable описується за допомогою тега <layer-list>, усередині якого для кожного дочірнього вузла <item> використовується атрибут drawable, що вказує на ресурс для накладання.

Кожен об'єкт Drawable буде накладатися у відповідності зі своїм індексом — перший елемент масиву розміщується в самому низу.

Наведемо приклад використання програмного LayerDrawable з використанням XML. Створимо в папці res/drawable файл layerdrawable.xml:

<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

<item>

<bitmap

android:gravity="center_vertical"

android:src="@drawable/blue" />

</item>

<item>

<bitmap

android:gravity="left"

android:src="@drawable/red" />

</item>

<item>

<bitmap

android:gravity="right"

android:src="@drawable/green" />

</item>

</layer-list>

Залишилось застосувати до макета.

LinearLayout linear = (LinearLayout)findViewById(R.id.linear);

//linear.setBackground(createLayerDrawable());

linear.setBackgroundResource(R.drawable.layerdrawable); // за допомоги XML

Цікаві приклади на цю тему: Додаток

Вікторія Пряжнікова


2016-05-29 • Просмотров [ 41 ]