Малюнки Mipmap для іконок


449

Оскільки Android 4.3 (Jelly Bean) тепер ми можемо використовувати res/mipmapпапки для зберігання зображень "mipmap".

Наприклад, Chrome для Android зберігає свої піктограми в цих папках замість більш нормальних res/drawableпапок.

Чим ці зображення mipmap відрізняються від інших знайомих зображуваних зображень?

Я бачу, що в моєму маніфесті ми використовуємо @mipmap/замість цього класифікатор @drawable/, що має сенс, враховуючи назву папки ресурсу:

<activity
    android:name=".MipmapDemp"
    android:icon="@mipmap/ic_launcher" />

Список літератури:

У документі API 4.3 для API слід сказати:

Використання mipmap як джерела для вашої растрової чи графічної матриці - це простий спосіб забезпечити якісне зображення та різні масштаби зображень, що може бути особливо корисним, якщо ви очікуєте, що ваше зображення буде масштабуватися під час анімації.

Android 4.2 (рівень API 17) додав підтримку mipmap у класі Bitmap - Android поміняє зображення mip у вашій Bitmap, коли ви надали джерело mipmap та увімкнули setHasMipMap (). Тепер в Android 4.3 ви можете ввімкнути mipmaps для об’єкта BitmapDravable, надавши актив mipmap та встановивши атрибут android: mipMap у файлі ресурсу растрової карти або зателефонувавши hasMipMap ().

Я там нічого не бачу, що допомагає мені зрозуміти.


Ресурси растрових зображень XML мають android:mipMapвластивість:

Булева. Вмикає або вимикає підказку mipmap. Для отримання додаткової інформації див. SetHasMipMap (). Значення за замовчуванням помилкове.

Наскільки я бачу, це не стосується піктограм запуску.


Питання було порушено в групах Google ( мета назви ресурсу "mipmap" ?! ), на яку Ромен Гай відповів:

Корисно надати зображення в більшій роздільній здатності, яке зазвичай обчислюється (наприклад, на пристрої mdpi. Launcher може захотіти, щоб більша піктограма hdpi відображала великі ярлики програми.)

Я відчуваю, що це майже має сенс у цьому, але не зовсім.

Я все ще схильний піти з ренді Суганто:

У чому переваги цього? Чи є посібник, як використовувати mipmaps, можливо, для кращих піктограм запуску?


Звичайно, у Вікіпедії є сторінка для "Mipmap" , де йдеться про старішу техніку, винайдену в 1983 році, що я не можу повністю пов'язати з поточною реалізацією Android.


Чи повинні ми зберігати всі наші піктограми програм у res/mipmapпапках сьогодні та які вказівки щодо цих mipmap зображень?


Оновлення №1

Ось допис у блозі, який намагається трохи пояснити це.

Але зображення, яке використовується в цій публікації щоденника, показує, як виглядає один файл із безліччю логотипів. Це не те, що я бачу в папці mipmap Chrome.

mipmap-hdpiПапка Chrome містить три зображення. Один - сам логотип Chrome.

Chrome mipmap-hdpi icon.png

Як не дивно, я б очікував побачити це 72x72, а не 48x48.

Можливо, в цьому і є все - нам просто потрібно зберігати більші значки у папках mipmap?


Оновлення №2

Публікація в блозі розробників Android від 23.10.2014 знову підтверджує ідею використання mipmapпапок для піктограм програм:

Говорячи про щільність екрану Nexus 6, автор пише:

Найкраще практично розміщувати піктограми додатків у папках mipmap (не в папках, що перетягуються), оскільки вони використовуються з роздільною здатністю, відмінною від щільності струму пристрою. Наприклад, значок запуску xxxhdpi може бути використаний на панелі запуску пристрою xxhdpi.


Оновлення №3

Зауважте, що Android Studio створює ic_launcher.png піктограми в mipmap...папках, а не drawable...папки, у яких Eclipse використовував їх для створення.


Відповіді:


260

Існує два різних способи використання mipmap:

  1. Для піктограм запуску під час створення APK-файлів із щільністю. Деякі розробники створюють окремі APK-файли для кожної щільності, щоб зменшити розмір APK. Однак деякі пускові установки (поставляються з деякими пристроями або доступні в магазині Play) використовують розміри значків більшого розміру, ніж у стандартних 48dp. Пускові пристрої використовують getDravableForDensity і зменшують масштаб, якщо потрібно, а не вгору, тому піктограми є високою якістю. Наприклад, на планшеті hdpi пускова програма може завантажити піктограму xhdpi. Розмістивши піктограму запуску в каталозі mipmap-xhdpi, вона не буде зніматися так, як це каталог, який можна прочитати-xhdpi, під час створення APK для пристроїв hdpi. Якщо ви будуєте єдиний APK для всіх пристроїв, це насправді не має значення, оскільки пусковий механізм може отримати доступ до ресурсів, що витягуються, потрібної щільності.

  2. Фактичний API mipmap від 4.3. Я не користувався цим і не знайомий з цим. Він не використовується пусковими програмами Android Open Source, і я не знаю про будь-який інший запуск.


2
Отже, ви пропонуєте побудувати скрипт, який знімає неправильні папки щільності для всіх, крім ресурсів mipmap, якщо я правильно розумію?
Річард Ле Месюр'є

20
Я б запропонував просто створити один APK для всіх густин і не турбуватися про це. Але так, причина каталогів mipmap іноді використовується для піктограм запуску через те, що сценарії збірки (aapt - конфігурації з переважними конфігураціями) знімають каталоги, що витягуються (щільність), але не каталоги mipmap- {щільність}. Це майже схоже на використання помилки, але ваша цитата з публікації Ромена Гая та Діани Хакборн за адресою plus.google.com/105051985738280261832/posts/QTA9McYan1L показує, що це дизайн.
Кевін TeslaCoil

3
тому мій типовий процес видалення mipmap, розміщення моїх іконок у чернетках та створення єдиного APK є ідеальним. Це здається, що mipmap нетиповий для більшості із нас, дев, але все-таки він вимушений для всіх нас.
Хтось десь

У документації написано: "mipmap: Мальовані файли для різної щільності значка запуску". developer.android.com/guide/topics/resources/…
активність

79

Здається, Google оновив свої документи з усіх цих відповідей, тому, сподіваємось, це допоможе комусь іншому в майбутньому :) Просто я сам наткнувся на це питання, створюючи новий (новий новий) проект.

TL; DR: черпаки можуть бути позбавлені як частина оптимізації ресурсів, що стосуються dp. Mipmaps не буде зніматися.

Різні програми запуску домашнього екрана на різних пристроях показують піктограми запуску додатків у різних роздільних здатностях. Коли методи оптимізації ресурсів додатків видаляють ресурси для невикористаної щільності екрана, піктограми пускового пристрою можуть виглядати нечіткими, оскільки програма запуску має змінити масштаб піктограми нижчої роздільної здатності для відображення. Щоб уникнути цих проблем із дисплеєм, додатки повинні використовувати mipmap/папки ресурсів для піктограм запуску. Система Android зберігає ці ресурси незалежно від густини і забезпечує, що програми запуску можуть вибирати піктограми з найкращим дозволом для відображення.

http://developer.android.com/tools/projects/index.html#mipmap )


2
Це відповідає розміщенню за замовчуванням Android Studio під час імпорту зображень. Піктограми запуску переходять у mipmap; інші переходять у малювання.
Едвард Брей

2
Документація, схоже, знову змінилася, схоже, що mipmap не існує в developer.android.com/tools/projects/index.html (незважаючи на інші біти документації на Android, які все ще намагаються посилання на неї).
ХтосьElse

28

Чим ці зображення mipmap відрізняються від інших знайомих зображуваних зображень?

Ось два мої центи в спробі пояснити різницю. Є два випадки, з якими ви маєте справу, працюючи із зображеннями в Android:

  1. Ви хочете завантажити зображення на щільність свого пристрою, і ви будете використовувати його "як є", не змінюючи його фактичний розмір . У цьому випадку вам слід працювати з малюнком, а Android дасть вам найкраще зображення.

  2. Ви хочете завантажити зображення на щільність свого пристрою, але це зображення буде масштабуватися вгору або вниз . Наприклад, це потрібно, коли ви хочете показати більшу іконку запуску або у вас є анімація, яка збільшує розмір зображення. У таких випадках, щоб забезпечити найкращу якість зображення, слід помістити своє зображення в папку mipmap . Що робитиме Android, він намагатиметься забрати зображення з відра з більшою щільністю, а не масштабувати його. Це підвищить чіткість (якість) зображення.

Таким чином, правилом вирішувати, куди розмістити ваше зображення, було б:

  • Піктограми запуску завжди переходять у папку mipmap .
  • Зображення, які часто масштабируются до (або дуже масштабируются вниз) і якість яких має вирішальне значення для програми, перейдіть в MIPMAP папку , а також.
  • Всі інші зображення є звичайним вводяться коефіцієнтом .

Отже, піктограми для панелі дій чи піктограми для плаваючої кнопки входять у mipmap?
Хуан Де ла Крус

Ні, це звичайні малюнки.
sergej shafarenka

23

Реалізація mipmap для Android в 4.3 - це саме техніка з 1983 року, пояснена в статті Вікіпедії :)

Кожне растрове зображення набору mipmap є зменшеним копієм основної текстури, але з певним зменшеним рівнем деталізації. Хоча основна текстура все-таки буде використовуватися, коли представлення достатньо, щоб відобразити її в повній мірі, візуалізатор переключиться на відповідне зображення карти (...), коли текстура розглядається відстань або невеликий розмір.

Хоча це описано як техніку для 3D-графіки (оскільки вона згадує "перегляд з відстані"), вона застосовується так само добре, як і для 2D (перекладається як "намальований - це менший простір", тобто "зменшений масштаб").

Для конкретного прикладу Android, уявіть, що у вас є перегляд із певним фоном, який малюється (зокрема, a BitmapDrawable). Тепер ви використовуєте анімацію, щоб масштабувати її до 0,15 від її початкового розміру. Зазвичай для цього потрібне зменшення масштабу фонової растрової карти для кожного кадру. Однак цей "екстремальний" зменшення масштабу може створити візуальні артефакти.

Однак ви можете надати mipmap, а це означає, що зображення вже заздалегідь відображено для декількох конкретних масштабів (скажімо, 1,0, 0,5 та 0,25). Щоразу, коли анімація "переступає" поріг 0,5, замість того, щоб продовжувати зменшувати масштаб оригінального зображення розміром 1,0, вона перейде на зображення 0,5 та зменшує масштаб, що має забезпечити кращий результат. І так далі, як триває анімація.

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

/**
 * Set a hint for the renderer responsible for drawing this bitmap
 * indicating that it should attempt to use mipmaps when this bitmap
 * is drawn scaled down.
 *
 * If you know that you are going to draw this bitmap at less than
 * 50% of its original size, you may be able to obtain a higher
 * quality by turning this property on.
 * 
 * Note that if the renderer respects this hint it might have to
 * allocate extra memory to hold the mipmap levels for this bitmap.
 *
 * This property is only a suggestion that can be ignored by the
 * renderer. It is not guaranteed to have any effect.
 *
 * @param hasMipMap indicates whether the renderer should attempt
 *                  to use mipmaps
 *
 * @see #hasMipMap()
 */
public final void setHasMipMap(boolean hasMipMap) {
    nativeSetHasMipMap(mNativeBitmap, hasMipMap);
}

Я не зовсім впевнений, чому це особливо підходить для піктограм програм. Хоча Android на планшетах, а також деякі пускові установки (наприклад, GEL), вимагають піктограму "на одну щільність вище", щоб показати її більшою, це слід зробити за допомогою звичайного механізму (тобто drawable-xxxhdpi& c).


Це насправді не пояснює відмінність від drawableпапок, які також містять зображення з картами.
Timmmm

2
Насправді ця відповідь явно неправильна. Тільки різниця в тому , чи є роздягли або не файл - це не має нічого спільного з, використовується чи ні Mipmapping (це в обох випадках). Папка неналежно названа; вони, мабуть, повинні були це назвати drawable-nostripчи щось.
Timmmm

2
Приємне пояснення mipmap-файлів, але відповідь Казуакі на запис у документі Google, схоже, означає, що насправді це не причина.
Триларіон

11

Одне, що я згадував в іншій темі, на яку варто звернути увагу - якщо ви будуєте різні версії свого додатка для різної щільності, вам слід знати про каталог ресурсів "mipmap". Це точно як "потяжні" ресурси, за винятком того, що він не бере участі у збиранні щільності при створенні різних apk-цілей.

https://plus.google.com/105051985738280261832/posts/QTA9McYan1L


... так, як згадував Кевін у прийнятій відповіді. Це, здається, було основною причиною цього.
Річард Ле Месюр'є

@RichardLeMesurier так, щоб зробити це коротко і зрозуміло
kreker

4

Оскільки я шукав уточнюючу відповідь на це, щоб визначити правильний тип значків сповіщень, я хотів би додати це чітке твердження до теми. Це з http://developer.android.com/tools/help/image-asset-studio.html#saving

Примітка. Файли значків запуску знаходяться в іншому місці, ніж у інших піктограм. Вони знаходяться в mipmap / папці. Усі інші файли значків перебувають у папці, що переглядається проектом.


2

Під час побудови окремих апків для різної щільності витягуються папки для інших густин позбавляються. Це зробить піктограми розмитими на пристроях, які використовують значки запуску більшої щільності. Оскільки папки mipmap не знімаються, найкраще використовувати їх для включення піктограм запуску.


2

Є два випадки, з якими ви маєте справу, працюючи із зображеннями в Android:

  1. Ви хочете завантажити зображення на щільність свого пристрою, і ви будете використовувати його "як є", не змінюючи його фактичний розмір. У цьому випадку вам слід працювати з малюнком, а Android дасть вам найкраще зображення.
  2. Ви хочете завантажити зображення на щільність свого пристрою, але це зображення буде масштабуватися вгору або вниз. Наприклад, це потрібно, коли ви хочете показати більшу іконку запуску або у вас є анімація, яка збільшує розмір зображення. У таких випадках, щоб забезпечити найкращу якість зображення, слід помістити своє зображення в папку mipmap. Що робитиме Android, він намагатиметься забрати зображення з відра з більшою щільністю, а не масштабувати його.

ТОМУ

Таким чином, правилом вирішувати, куди розмістити ваше зображення, було б:

  1. Піктограми запуску завжди переходять у папку mipmap.

  2. Зображення, які часто зменшуються (або надзвичайно зменшуються) і якість яких є критично важливими для програми, також переходять у папку mipmap.

  3. Усі інші зображення - це звичайні малюнки.

Цитування з цієї статті.


1
res/
mipmap-mdpi/ic_launcher.png (48x48 pixels)
mipmap-hdpi/ic_launcher.png (72x72)
mipmap-xhdpi/ic_launcher.png (96x96)
mipmap-xxhdpi/ic_launcher.png (144x144)
mipmap-xxxhdpi/ic_launcher.png (192x192)

MipMap для піктограми програми для запуску

http://android-developers.blogspot.co.uk/2014/10/getting-your-apps-ready-for-nexus-6-and.html

https://androidbycode.wordpress.com/2015/02/14/goodbye-launcher-drawables-hello-mipmaps/


Дякую за друге повідомлення в блозі! Він чітко роз'яснює різницю між використанням drawable-XXXта mipmap-XXXпапками: піктограма запуску відрізняється від інших ресурсів, оскільки можливо, що в панелі користувачів відображається піктограма з більшою роздільною здатністю. Якщо це зображення з більшою роздільною здатністю було знято з папки «Малюнки», піктограма нижчої щільності буде програмно масштабована. Це може спричинити непривабливий розмитий значок.
winklerrr

Принаймні, в Android 8.1 на Nexus P6 піктограми запуску в папках для витягнутих НЕ МОГАТЕ. Насправді взагалі не знайдено, і додаток виходить з ладу при відкритті.
Матвій

1

Якщо ви створили APK для цільової роздільної здатності екрана, наприклад HDPI, інструмент упаковки активів Android, AAPT, може викреслити чернетки для іншої непотрібної вам роздільної здатності. Але якщо вона знаходиться в папці mipmap, ці активи залишатимуться в APK, незалежно від цільової роздільної здатності.


-1

Розуміння, яке я маю щодо mipmap, є більш-менш таким:

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

Якщо у вас є зображення, яке нормально для мобільного телефону низького класу, коли ви масштабуєте його до розміру 10-дюймового планшета, ви повинні "вигадати" пікселі, які насправді не існують. Це робиться за допомогою певного алгоритму інтерполяції. Чим більше пікселів потрібно винайти, тим довше процес займає, і якість починає виходити з ладу. Найкраща якість отримується за допомогою складніших алгоритмів, які займають більше часу (наприклад, середнє оточення пікселів проти копіювання найближчого пікселя).

Щоб зменшити кількість пікселів, які потрібно винайти, за допомогою mipmap ви надаєте різні розміри / розв’язки одного і того ж зображення, і система вибере найближче зображення до тієї роздільної здатності, яку потрібно винести, і зробить масштабування звідти. Це має зменшити кількість винайдених пікселів, економлячи ресурси, які будуть використані при обчисленні цих пікселів, щоб забезпечити зображення хорошої якості.

Про це я читав у статті, в якій пояснюється проблема продуктивності в libgdx під час масштабування зображень:

http://www.badlogicgames.com/wordpress/?p=1403

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.