Я намагаюся використовувати векторні малюнки у своєму додатку для Android. З http://developer.android.com/training/material/drawables.html (курсив мій):
В Android 5.0 (рівень API 21) і вище ви можете визначити векторні малюнки, які масштабуються, не втрачаючи визначення.
Використовуючи цей малюнок:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="@color/colorPrimary" android:pathData="M14,20A2,2 0 0,1 12,22A2,2 0 0,1 10,20H14M12,2A1,1 0 0,1 13,3V4.08C15.84,4.56 18,7.03 18,10V16L21,19H3L6,16V10C6,7.03 8.16,4.56 11,4.08V3A1,1 0 0,1 12,2Z" />
і цей ImageView:
<ImageView
android:layout_width="400dp"
android:layout_height="400dp"
android:src="@drawable/icon_bell"/>
створює це розмите зображення при спробі відобразити піктограму з роздільною здатністю 400dp (на великому мобільному пристрої високої роздільної здатності близько 2015 року, на якому працює льодяник):
Зміна ширини та висоти у визначенні вектора, що малюється, до 200dp значно покращує ситуацію при розмірі візуалізації 400dp. Однак, встановивши його як елемент, який можна малювати для елемента TextView (тобто піктограму зліва від тексту), тепер створюється величезна піктограма.
Мої запитання:
1) Чому у малюваному векторі є специфікація ширини / висоти? Я думав, що вся суть цього полягає в тому, що вони масштабуються вгору і вниз без втрат, роблячи ширину та висоту безглуздими у своєму визначенні?
2) Чи можна використовувати один векторний малюнок, який працює як 24dp, що малюється на TextView, але добре масштабується, щоб використовувати також набагато більші зображення? Наприклад, як я можу уникнути створення кількох векторних малюнків різних розмірів і замість цього використовувати той, який масштабується відповідно до моїх відтворених вимог?
3) Як ефективно використовувати атрибути width / height та яка різниця з viewportWidth / Height?
Додаткові деталі:
- На пристрої працює API 22
- Використання Android Studio v1.5.1 з Gradle версії 1.5.0
- Маніфест - це компіляція та цільовий рівень 23, мінімальний рівень 15. Я також намагався перенести мінімальний рівень до 21, але це не мало ніякої різниці.
- Декомпіляція файлу .apk (з мінімальним рівнем, встановленим на 21) показує один XML-ресурс у папці, яку можна малювати. Растеризовані зображення не створюються.
drawable
папка. Ширина / висота у векторному XML-файлі, який можна малювати, становить 24dp. Визначення ImageView висотою / шириною 400 дп, безумовно, створює погано масштабоване зображення.
drawable-anydpi-v21
це те, що моя minSdkVersion
менше 21. Будь-яка зміна поведінки, якщо ви встановите значення minSdkVersion
менше 21? А як щодо переміщення XML drawable-anydpi
? Я б не сподівався, що відбудуться зміни, але я також би очікував, що ваше векторне зображення буде правильно масштабовано ...
drawable-anydpi-v21
із різними растровими зображеннями в mdi / hdpi / тощо. папки. Хоча жодних змін до кінцевого результату не було.
New -> Vector Asset
її, вона опускає векторне зображення XML у мою папку, яку можна малювати. Однак, якщо я використовую apktool для розпакування встановленого файлу .apk, я бачу, що XML-файли маютьdrawable-anydpi-v21
та масштабуються правильно на пристроях API 21+. Растрові файли розміщуються вdrawable-<mdpi/hdpi/etc>-v4
папках і не використовуються на пристроях API 21+ (виходячи з того, що вони правильно масштабуються)