<transition> (клас TransitionDrawable)
Є розширенням попереднього layer-list і дозволяє використовувати накладення.
В тезі transition зазначаються два об'єкта Drawable, між якими можна перемикатися з fade-ефектом і зазначенням тривалості переходу.
<level-list> (клас LevelListDrawable)
Використовуючи LevelListDrawable, ви можете ефективно розміщувати ресурси Drawable один поверх іншого, вказуючи цілочисельний індекс для кожного шару.
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:maxLevel="0" android:drawable="@drawable/cat_0"/>
<item android:maxLevel="1" android:drawable="@drawable/cat_1"/>
<item android:maxLevel="2" android:drawable="@drawable/cat_2"/>
<item android:maxLevel="4" android:drawable="@drawable/cat_4"/>
<item android:maxLevel="6" android:drawable="@drawable/cat_6"/>
<item android:maxLevel="8" android:drawable="@drawable/cat_8"/>
<item android:maxLevel="10" android:drawable="@drawable/cat_10"/>
</level-list>
Щоб вивести на екран певне зображення, викличте метод setImageLevel() з уявлення, якому призначений ресурс LevelListDrawable, передаючи в якості параметра індекс об'єкта Drawable, який ви хочете відобразити.
imageView.setImageLevel(5);
Уявлення відобразить ресурс з відповідним (або більшим) індексом. Ресурс LevelListDrawable потрібен при компонуванні віджетів.
<rotate> (клас RotateDrawable)
Даний ресурс дозволяє повернути зображення на потрібний градус. Припустимо, у вас є стрілки в різні боки. Зовсім не обов'язково створювати копії стрілок. Достатньо намалювати одну стрілку, а в файлах прописати потрібні повороти. Наприклад, повернемо значок додатка догори дригом у файлі drawable/rotate_up.xml:
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_launcher_cat"
android:fromDegrees="180"
android:toDegrees="180"
android:pivotX="50%"
android:pivotY="50%" />
Привласніть атрибуту src компонента ImageView і ви побачите значок перевернутим.
drawable — зображення для повороту;
fromDegrees — початковий кут повороту в градусах. За замовчуванням 0.0;
toDegrees — кінцевий кут повороту в градусах. За замовчуванням 360.0;
pivotX — опорна точка X;
pivotY — опорна точка Y.
Опорна точка - це місце для віртуального шпильки, навколо якої буде обертатися пришпилений листок. Для центру ми вказали половину по висоті і ширині. Для нерухомої картинки кути повороту можна вказати однаковими.
Тег rotate також використовується в анімаційних ресурсах, не плутайте їх.
<scale> (ScaleDrawable клас)
Дозволяє масштабувати (стиснути або розширити) зображення по горизонтальній (scaleWidth) та/або вертикальної (scaleHeight) осі і змістити отримане зображення у вказану частину (scaleGravity) доступного простору.
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_launcher_cat"
android:scaleGravity="center_vertical|center_horizontal"
android:scaleHeight="180%"
android:scaleWidth="80%" />
<selector> (клас StateListDrawable)
У деяких елементів управління є різні стани: натиснуто, вибрано і т.д.. Ви можете задавати зображення для будь-якого з таких станів.
Щоб описати StateListDrawable, створіть файл у форматі XML, у якому вказуються різні ресурси Drawable для кожного стану компонента. Кожен атрибут виду android:state_* може приймати одне з двох значень: true або false.
Доступні наступні стани:
state_focused - у фокусі чи ні;
state_window_focused - чи має фокус батьківське вікно;
state_enabled - доступний чи ні;
state_checkable - може бути відзначений чи ні;
state_checked - відзначений чи ні;
state_selected - виділено чи ні;
state_activated - активований чи ні;
state_pressed - натиснутий або не натиснутий;
state_hovered - знаходиться курсор над компонентом чи ні (з API 11 і вище);
Для списків є також:
state_single
state_first
state_middle
state_last
Розглянемо приклади. Нас не влаштовує зовнішній вигляд кнопки. Хочеться, щоб вона виглядала так (та ще й щоб підсвічувалася при натисканні):
Зробити це просто. Додаємо в ресурси нормального зображення (button_up.png) і натиснутого (button_down.png) станів кнопки. І створюємо в папці drawables в XML-файл з наступним змістом (states_button.xml):
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/button_down" />
<item android:drawable="@drawable/button_up" />
</selector>
Важливий момент: у списку станів потрібно спочатку вказувати спеціалізовані стани, а останнім повинен слідувати стан за замовчуванням (без state-* атрибутів взагалі).
Ще один момент. Кнопка може одночасно перебувати в стані pressed і focused, тому вказуйте спочатку state_pressed, а потім state_focused. Інакше, якщо кнопка буде в стані focused, то стан pressed не застосується.
Тепер залишилося у атрибута background для кнопки прописати створений ресурс.
<Button android:layout_width="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/states_button"
android:text="Custom button"
android:textSize="18dip"
/>
Можна обійтися без використання зображень для кнопки, а скористатися фігурами (states_shapes.xml).
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape>
<gradient android:type="linear" android:endColor="#6699CC" android:startColor="#99CCFF" android:angle="90.0" />
<corners android:radius="5.0dip" />
<padding android:left="20dip" android:right="20dip" android:top="7dip" android:bottom="7dip"/>
</shape>
</item>
<item>
<shape>
<gradient android:type="linear" android:endColor="#336699" android:startColor="#99CCFF" android:angle="90.0" />
<corners android:radius="5.0dip" />
<padding android:left="20dip" android:right="20dip" android:top="7dip" android:bottom="7dip"/>
</shape>
</item>
</selector>
А можна просто використовувати кольори:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="#ffff0000"/>
<item android:state_focused="true" android:color="#ff0000ff"/>
<item android:color="#ff000000"/>
</selector>
Спробуйте застосувати файл не до атрибуту background, а до атрибуту android:textColor, щоб колір впливав на текст кнопки, а не на саму кнопку.
Можна використовувати як шпаргалку наступну картинку.
RadioBox, CheckBox та ін.
Схожим чином можна задавати стилі для RadioButtom, CheckBox і т. п. А тут мало того, що можна окремим ресурсом задавати фон, так окремим же ресурсом можна ставити саму піктограму через атрибут button (states_compound.xml).
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true">
<shape android:shape="oval">
<gradient android:startColor="#00FF00" android:endColor="#00000000" android:type="radial" android:gradientRadius="7"/>
<size android:width="10dip" android:height="10dip" />
</shape>
</item>
<item>
<shape android:shape="oval">
<gradient android:startColor="#FF0000" android:endColor="#00000000" android:type="radial" android:gradientRadius="7"/>
<size android:width="10dip" android:height="10dip" />
</shape>
</item>
</selector>
Розмітка зі створеними стилями
<CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content"
android:button="@drawable/states_compound"
android:text="Item 1"
android:paddingLeft="20dip"/>
<CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content"
android:button="@drawable/states_compound"
android:checked="true"
android:text="Item 2"
android:paddingLeft="20dip"/>
<CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content"
android:button="@drawable/states_compound"
android:text="Item 3"
android:paddingLeft="20dip"/>
Цікаві приклади на цю тему: Додаток