Mipmap drawables для значков

Начиная с Android 4.3 (Jelly Bean) мы можем теперь использовать папки res/mipmap для хранения изображений "mipmap".

Например, Chrome для Android сохраняет свои значки в этих папках вместо более обычных res/drawable папок.

Как эти изображения mipmap отличаются от других знакомых изображений?

Я вижу, что в моем манифесте мы используем квалификатор @mipmap/ вместо @drawable/, что имеет смысл с учетом имени папки ресурса:

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

Литература:

В документе Android 4.3 API есть следующее:

Использование mipmap в качестве источника для вашего растрового изображения или рисования является простым способ предоставления качественного изображения и различных масштабов изображения, которые могут быть особенно полезно, если вы ожидаете, что ваше изображение будет масштабироваться во время анимации.

Android 4.2 (уровень API 17) добавила поддержку мипмапов в битовой карте класс-Android меняет изображения мига в вашем растровом изображении, когда вы поставили источник mipmap и включили setHasMipMap(). Теперь в Android 4.3, вы можете включить mipmaps для объекта BitmapDrawable, а также предоставление актива mipmap и установка атрибута android: mipMap в файл ресурса растрового изображения или путем вызова hasMipMap().

Я ничего не вижу, что помогает мне понять.


XML-ресурсы Bitmap имеют свойство android:mipMap:

Boolean. Включает или отключает подсказку mipmap. См. SetHasMipMap() для больше информации. Значение по умолчанию - false.

Это не относится к значкам запуска, насколько я могу видеть.


Вопрос был задан в группах Google (Назначение имени ресурса "mipmap" ?!), на что ответил Ромен Гай:

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

Мне кажется, что это почти имеет смысл, но не совсем.

Я все еще склонен идти с Рэнди Суджианто:

В чем преимущества этого? Есть ли руководство по использованию mipmaps, возможно, для более удобных значков запуска?


Конечно, В Википедии есть страница для "Mipmap" , которая ссылается на более старый метод, изобретенный в 1983 году, что я не могу относятся к текущей реализации Android.


Должны ли мы хранить все наши значки приложений в res/mipmap папках в эти дни и каковы рекомендации для этих изображений mipmap?


Обновление # 1

Вот сообщение в блоге, которое пытается немного объяснить это.

Но образ, используемый в этом блоге, показывает, что выглядит как один файл с большим количеством логотипов. Это не то, что я вижу в папке mipmap Chrome.

Chrome mipmap-hdpi папка содержит три изображения. Один из них - это логотип Chrome.

Chrome mipmap-hdpi icon.png

Странно, это 72x72, а не 48x48, которые я ожидаю увидеть.

Возможно, это все, что вам нужно - нам просто нужно держать большие значки в папках mipmap?


Обновление # 2

Сообщение блога разработчиков Android от 23/10/2014 снова подтверждает идею использования папок mipmap для значков приложений:

Говоря о плотности экрана Nexus 6, автор пишет:

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


Обновление # 3

Обратите внимание, что Android Studio создает значки ic_launcher.png в папках mipmap..., а не в папках drawable..., которые Eclipse использовал для их создания.


Ответ 1

Существует два различных использования mipmaps:

  • Значки запуска при создании APK с плотностью плотности. Некоторые разработчики создают отдельные APK для каждой плотности, чтобы уменьшить размер APK. Однако некоторые пусковые установки (поставляемые с некоторыми устройствами или доступные в Play Store) используют большие размеры значков, чем стандартные 48 дп. Пусковые установки используют getDrawableForDensity и уменьшают, если необходимо, а не вверх, поэтому значки имеют высокое качество. Например, на планшете hdpi пусковая установка может загрузить значок xhdpi. Поместив значок запуска в каталог mipmap-xhdpi, он не будет лишен способа создания каталога drawable-xhdpi при создании APK для устройств hdpi. Если вы создаете один APK для всех устройств, это не имеет особого значения, так как пусковая установка может получить доступ к ресурсам, которые можно использовать для требуемой плотности.

  • Фактический API mipmap из 4.3. Я не использовал это и не знаком с ним. Он не используется пусковыми установками Project Open Source Project, и я не знаю о других запусках.

Ответ 2

Кажется, Google обновил свои документы, так как все эти ответы, так что, надеюсь, это поможет кому-то еще в будущем:) Только сам наткнулся на этот вопрос, создавая новый (новый новый) проект.

TL; DR: чертежи могут быть удалены как часть оптимизации ресурсов, специфичной для dp. Мипмапы не будут удалены.

Различные приложения для запуска стартового экрана на разных устройствах показывают иконки запуска приложений в различных разрешениях. Когда методы оптимизации ресурсов приложений удаляют ресурсы для неиспользуемых плотностей экрана, значки запуска могут затуманиваться, выглядя нечеткими, потому что приложение-пусковое устройство должно увеличить размер значка более низкого разрешения для отображения. Чтобы избежать этих проблем с отображением, приложения должны использовать папки ресурсов mipmap/ для значков запуска. Система Android сохраняет эти ресурсы вне зависимости от плотности удаления и гарантирует, что приложения для запуска приложений могут выбирать значки с лучшим разрешением для отображения.

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

Ответ 3

Реализация mipmaps в 4.3 в Android - это точно техника, описанная в 1983 году в статье Wikipedia:)

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

Несмотря на то, что это описывается как техника для 3D-графики (поскольку она упоминает "просмотр с расстояния" ), она применима так же хорошо, как и к 2D (в переводе "нарисовано меньшее пространство", т.е. "уменьшено" ).

Для конкретного примера Android представьте, что у вас есть вид с определенным фоном, который можно извлечь (в частности, 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).

Ответ 4

Как эти изображения mipmap отличаются от других знакомых изображений?

Вот мои два цента, пытаясь объяснить разницу. Есть два случая, с которыми вы сталкиваетесь при работе с изображениями в Android:

  • Вы хотите загрузить изображение для плотности вашего устройства, и вы собираетесь использовать его "как есть", не изменяя его фактический размер. В этом случае вы должны работать с drawables, а Android предоставит вам наилучшее изображение.

  • Вы хотите загрузить изображение для плотности вашего устройства, но это изображение будет увеличено или уменьшено. Например, это необходимо, когда вы хотите показать более крупный значок запуска, или у вас есть анимация, которая увеличивает размер изображения. В таких случаях, чтобы обеспечить наилучшее качество изображения, вы должны поместить свое изображение в папку mipmap. Что будет делать Android, он попытается забрать изображение из более высокой плотности, вместо того, чтобы масштабировать его. Это увеличит резкость (качество) изображения.

Таким образом, эмпирическое правило, чтобы решить, куда помещать ваше изображение, будет:

  • Значки Launcher всегда входят в папку mipmap.
  • Изображения, которые часто масштабируются (или очень уменьшены) и качество которых имеет решающее значение для приложения, перейдите в папку mipmap.
  • Все остальные изображения обычно рисунки.

Ответ 5

Одна вещь, о которой я упоминал в другом потоке, который стоит указать - если вы создаете разные версии своего приложения для разных плотностей, вы должны знать о каталоге ресурсов mipmap. Это точно так же, как "вытягиваемые" ресурсы, за исключением того, что он не участвует в зачистке плотности при создании разных целей APK.

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

Ответ 6

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

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

Ответ 7

Есть два случая, с которыми вы сталкиваетесь при работе с изображениями в Android:

  • Вы хотите загрузить изображение для плотности вашего устройства, и вы собираетесь использовать его "как есть", не изменяя его фактический размер. В этом случае вы должен работать с выводами, и Android предоставит вам лучший изображение.
  • Вы хотите загрузить изображение для плотности вашего устройства, но это изображение будет увеличено или уменьшено. Например, это необходимо, когда вы хотите показать большую иконку запуска, или у вас есть анимация, которая увеличивает размер изображения. В таких случаях, чтобы обеспечить наилучшее качество изображения, вы должны поместить свое изображение в папку mipmap. Что будет делать Android, он попытается забрать изображение из более высокой плотности его масштабирования.

SO

Таким образом, эмпирическое правило, чтобы решить, куда помещать ваш образ, было бы быть:

  • Значки Launcher всегда входят в папку mipmap.

  • Изображения, которые часто масштабируются (или очень уменьшены) и качество которых имеет решающее значение для приложения, перейдите в папку mipmap как хорошо.

  • Все остальные изображения являются обычными чертежами.

Ссылка из эта статья.

Ответ 8

Если вы создаете APK для разрешения целевого экрана, такого как HDPI, инструмент AAPT для пакетов активов Android может вычеркнуть чертежи для другого разрешения, которое вам не нужно. Но если он находится в папке mipmap, то эти активы останутся в APK, независимо от целевого разрешения.

Ответ 9

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

Ответ 10

Понимание, которое я имею о mipmap, более или менее выглядит следующим образом:

Когда изображение нужно нарисовать, учитывая, что у нас разные размеры экрана - это разрешения, потребуется некоторое масштабирование.

Если у вас есть изображение, которое подходит для мобильного телефона с низким уровнем конца, когда вы масштабируете его до размера 10-дюймового планшета, вам придется "изобретать" пиксели, которые на самом деле не существуют. Это делается с некоторой интерполяцией алгоритм. Чем больше пикселов, которые нужно изобрести, тем дольше происходит процесс, а качество начинает терпеть неудачу. Лучшее качество достигается с более сложными алгоритмами, которые занимают больше времени (в среднем, окружающих пикселей и, например, скопировать ближайший пиксель).

Чтобы уменьшить количество пикселов, которые нужно изобрести, с mipmap вы предоставляете разные размеры /rsolutions одного и того же изображения, и система выберет ближайшее изображение к разрешающей способности, которая должна быть отображена, и сделайте масштабирование оттуда, Это должно уменьшить количество изобретенных пикселей, экономя ресурсы, которые будут использоваться при вычислении этих пикселей, чтобы обеспечить изображение хорошего качества.

Я читал об этом в статье, объясняющей проблему производительности в libgdx при масштабировании изображений:

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