Mipmap drawables for icons

Od Androida 4.3 (Jelly Bean) możemy teraz korzystać z folderów res/mipmap do przechowywania obrazów "mipmap".

Na przykład, Chrome dla Androida przechowuje swoje ikony w tych folderach zamiast bardziej normalnych folderów res/drawable.

Czym te obrazy mipmap różnią się od innych znanych obrazów rysunkowych?

Widzę, że w moim manifeście używamy kwalifikatora @mipmap/ zamiast @drawable/, co ma sens biorąc pod uwagę folder zasobów nazwa:

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

Bibliografia:

Dokument Android 4.3 API ma do powiedzenia:

Używanie mipmapy jako źródła dla bitmapy lub drawable jest proste sposób na zapewnienie wysokiej jakości obrazu i różnych skal obrazu, które mogą być szczególnie przydatne, jeśli spodziewasz się, że twój obraz będzie skalowany podczas animacja.

Android 4.2 (API poziom 17) dodano obsługę mipmap w Bitmapie Klasa-Android zamienia obrazy mip w Twoja bitmapa po dostarczeniu źródła mipmap i włączyła setHasMipMap(). Teraz w Androidzie 4.3, możesz również włączyć mipmapy dla obiektu BitmapDrawable, poprzez udostępnienie zasobu mipmap i ustawienie atrybutu android: mipMap w bitmap resource file lub wywołując hasMipMap ().

Nie widzę tam nic, co by mi pomogło zrozumieć.

Zasoby Bitmapowe XML mają właściwość android:mipMap:

Boolean. Włącza lub wyłącza podpowiedź mipmap. Zobacz setHasMipMap () dla więcej informacji. Wartość domyślna to false.

To nie dotyczy ikon launchera, o ile widzę.


Pytanie zostało postawione na Google Groups (cel nazwy zasobu "mipmap"?!), na co Romain Guy odpowiedział:

Jest to przydatne, aby zapewnić obraz w większej rozdzielczości, która byłaby normalnie być obliczane (np. na urządzeniu mdpi Launcher może chcesz większe ikona hdpi do wyświetlania dużych skrótów aplikacji.)

Wydaje mi się, że to prawie ma sens, ale nie do końca.

Nadal jestem skłonny iść z Randy Sugianto kontynuacja:

Jakie są tego zalety? Czy jest jakiś przewodnik, jak używać mipmaps, prawdopodobnie dla lepszych ikon launchera?


Oczywiście, Wikipedia ma stronę"Mipmap" , która odnosi się do starszej techniki wynalezionej w 1983 roku, której nie mogę do końca odnieść do aktualna implementacja Androida.


Czy w dzisiejszych czasach powinniśmy przechowywać wszystkie ikony aplikacji w folderach res/mipmap i jakie są wytyczne dla tych obrazów mipmap?


Aktualizacja #1

Oto wpis na blogu, który próbuje to trochę wyjaśnić.

Ale obraz użyty w tym wpisie pokazuje, jak wygląda jeden plik z wieloma logo w nim. To nie jest co widzę w folderze Chrome mipmap.

Folder Chrome ' a mipmap-hdpi zawiera trzy obrazy. Jednym z nich jest logo Chrome, samo w sobie.

Chrome mipmap-ikona hdpi.png

O dziwo, to jest 72x72, a nie 48x48 czego bym się spodziewał.

Być może to wszystko - musimy tylko zachować większe ikony w folderach mipmap?


Aktualizacja #2

Blog deweloperów Androida z 23/10/2014 ponownie potwierdza pomysł korzystania z folderów mipmap dla ikony aplikacji:

[[12]} Mówiąc o gęstości ekranu Nexus 6, autor pisze: [13]}

Najlepiej jest umieszczać ikony aplikacji w folderach mipmap( Nie w drawable-folders), ponieważ są one używane w rozdzielczościach innych niż gęstość prądu urządzenia. Na przykład ikona aplikacji xxxhdpi może być używany na wyrzutni dla xxhdpi urządzenie.


Aktualizacja #3

Zauważ, że Android Studio tworzy ikony ic_launcher.png w folderach mipmap... zamiast folderów drawable..., w których Eclipse je tworzył.


Author: Peter Mortensen, 2014-05-29

11 answers

Istnieją dwa różne zastosowania mipmap:

  1. Dla ikon uruchamiania podczas budowania pakietów APK specyficznych dla gęstości. Niektórzy programiści budują osobne pakiety APK dla każdej gęstości, aby utrzymać ich rozmiar w dół. Jednak niektóre wyrzutnie (dostarczane z niektórymi urządzeniami lub dostępne w Sklepie Play) używają większych rozmiarów ikon niż standardowy 48dp. Program uruchamiający używa getDrawableForDensity i w razie potrzeby skaluje w dół, a nie w górę, więc ikony są wysokiej jakości. Na przykład na tablecie hdpi launcher może załadować ikona xhdpi. Umieszczając ikonę Launchera w katalogu mipmap-xhdpi, nie zostanie ona rozebrana tak, jak katalog drawable-xhdpi podczas budowania APK dla urządzeń hdpi. Jeśli budujesz jeden APK dla wszystkich urządzeń, to tak naprawdę nie ma to znaczenia, ponieważ launcher może uzyskać dostęp do rysowalnych zasobów dla pożądanej gęstości.

  2. Rzeczywiste API mipmap od 4.3. Nie używałem tego i nie znam go. Nie jest używany przez wyrzutnie Android Open Source Project I Nie znam żadnego innego launchera używającego.

 242
Author: Kevin TeslaCoil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-07 23:36:44

Wygląda na to, że Google zaktualizowało swoje dokumenty od tych wszystkich odpowiedzi, więc mam nadzieję, że to pomoże komuś innemu w przyszłości :) właśnie natknąłem się na to pytanie, tworząc nowy (nowy) projekt.

TL;DR: drawables może zostać usunięty w ramach optymalizacji zasobów specyficznych dla dp. Mipmapy nie zostaną rozebrane.

Różne aplikacje uruchamiające ekran główny na różnych urządzeniach pokazują ikony uruchamiania aplikacji w różnych rozdzielczościach. Gdy optymalizacja zasobów aplikacji techniki usuwają zasoby dla nieużywanych gęstości ekranu, ikony programu uruchamiającego mogą skończyć się rozmytym wyglądem, ponieważ aplikacja uruchamiająca musi przeskalować ikonę o niższej rozdzielczości do wyświetlania. Aby uniknąć tych problemów z wyświetlaniem, aplikacje powinny używać folderów zasobów mipmap/ dla ikon uruchamiania. System Android zachowuje te zasoby niezależnie od usuwania gęstości i zapewnia, że aplikacje uruchamiające mogą wybierać ikony z najlepszą rozdzielczością do wyświetlania.

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

 72
Author: Kazuaki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-27 05:52:26

Czym te obrazy mipmap różnią się od innych znanych rysowalnych obrazów?

Oto moje dwa centy w próbie wyjaśnienia różnicy. Istnieją dwa przypadki, z którymi masz do czynienia podczas pracy z obrazami w Androidzie:
  1. Chcesz załadować obraz dla gęstości urządzenia i będziesz go używać "tak jak jest", bez zmiany jego rzeczywistego rozmiaru . W tym przypadku powinieneś pracować z drawables, A Android zapewni Ci najlepsze dopasowanie obraz.

  2. Chcesz załadować obraz dla gęstości urządzenia, ale ten obraz zostanie skalowany w górę lub w dół. Na przykład jest to potrzebne, gdy chcesz pokazać większą ikonę programu uruchamiającego lub masz animację, która zwiększa rozmiar obrazu. W takich przypadkach, aby zapewnić najlepszą jakość obrazu, należy umieścić swój obraz w folderze mipmap. To, co Android zrobi, to spróbuje podnieść obraz z wiadra o wyższej gęstości, zamiast go skalować. To będzie zwiększ ostrość (jakość) obrazu.

Tak więc, zasada decydowania, gdzie umieścić swój obraz będzie:

  • ikony Launchera zawsze trafiają do folderu mipmap.
  • obrazy, które są często skalowane w górę (lub bardzo skalowane w dół) i których jakość ma kluczowe znaczenie dla aplikacji, również przejdź do folderu mipmap.
  • wszystkie inne obrazy są zwykłymi rysunkami.
 26
Author: sergej shafarenka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-01 10:14:55

[[3]}implementacja mipmap w Androidzie w 4.3 jest dokładnie tą techniką z 1983 roku opisaną w artykule na Wikipedii:)

Każdy obraz bitmapowy zestawu mipmap jest pomniejszonym duplikatem główna Tekstura, ale na pewnym zredukowanym poziomie szczegółowości. Chociaż Tekstura główna będzie nadal używana, gdy widok jest wystarczający do renderowania to w pełni szczegółowo, renderer przełączy się na odpowiedni obraz mipmap (...) gdy tekstura jest oglądana z daleka lub z małej rozmiar.

Chociaż jest to opisane jako technika dla grafiki 3D (jak wspomina "oglądanie z daleka"), stosuje się tak samo dobrze do 2D (tłumaczone jako "drawn is a smaller space", tj. "downscaled").

Dla konkretnego przykładu Androida, wyobraź sobie, że masz widok z pewnym rysowanym tłem(w szczególności BitmapDrawable). Teraz za pomocą animacji skalujesz ją do 0,15 jej oryginalnego rozmiaru. Zwykle wymaga to zmniejszania bitmapy w tle dla każdej klatki. To jednak "ekstremalne" zmniejszanie może powodować artefakty wizualne.

Możesz jednak dostarczyć mipmapę, co oznacza, że obraz jest już wstępnie renderowany dla kilku konkretnych skal(powiedzmy 1.0, 0.5 i 0.25). Za każdym razem, gdy animacja "przekroczy" próg 0,5, zamiast kontynuować zmniejszanie oryginalnego obrazu o rozmiarze 1,0, przełączy się na obraz 0,5 i zmniejszy go, co powinno zapewnić lepszy wynik. I tak dalej, jak animacja trwa.

To jest trochę teoretyczne, bo tak naprawdę robi to renderer. Według źródła klasy Bitmap, jest to tylko podpowiedź, a renderer może ją lub nie uhonorować.

/**
 * 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);
}

Nie jestem do końca pewien, dlaczego byłoby to szczególnie odpowiednie dla ikon aplikacji. Chociaż Android na tabletach, a także niektóre wyrzutnie (np. GEL), żądają ikony "o jedną gęstość wyższa", aby pokazać ją większą, należy to zrobić za pomocą zwykłego mechanizmu (np. drawable-xxxhdpi, & c).

 23
Author: matiash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-08 01:59:13

Jedną rzecz wspomniałem w innym wątku, który jest wart zwrócenia uwagi - jeśli budujesz różne wersje aplikacji dla różnych gęstości, powinieneś wiedzieć o katalogu zasobów "mipmap". Jest to dokładnie tak, jak" drawable " zasoby, z tym wyjątkiem, że nie uczestniczy w zdzieraniu gęstości podczas tworzenia różnych celów apk.

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

 10
Author: kreker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-17 01:34:15

Ponieważ szukałem klarownej odpowiedzi na to, aby określić odpowiedni typ ikon powiadomień, chciałbym dodać to jasne stwierdzenie do tematu. Pochodzi z http://developer.android.com/tools/help/image-asset-studio.html#saving

Uwaga: pliki ikon Launchera znajdują się w innej lokalizacji niż inne ikony. Znajdują się one w folderze mipmap/. wszystkie inne ikony pliki znajdują się w katalogu drawable/ twojego projektu.

 4
Author: Stev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-22 00:38:38

Istnieją dwa przypadki, z którymi masz do czynienia podczas pracy z obrazami w Androidzie:

  1. chcesz załadować obraz dla gęstości urządzenia i będziesz go używać "tak jak jest", bez zmiany jego rzeczywistego rozmiaru. W tym przypadku powinien pracować z drawables i Android daje najlepsze dopasowanie obraz.
  2. chcesz załadować obraz dla gęstości urządzenia, ale ten obraz będzie skalowany w górę lub w dół. Na przykład jest to potrzebne, gdy chclno Pokaż większą ikonę Launchera, lub masz animację, która zwiększa rozmiar obrazu. W takich przypadkach, aby zapewnić najlepszą jakość obrazu, powinieneś umieścić swój obraz w folderze mipmap. Co zrobi Android, zamiast tego spróbuje odebrać obraz z wiadra o większej gęstości skalowania.

Więc

Tak więc, zasada decydowania, gdzie umieścić swój obraz be:

  1. Ikony Launchera zawsze trafiają do mipmap folder.

  2. Obrazy, które są często skalowane (lub bardzo skalowane w dół) i których jakość ma kluczowe znaczenie dla aplikacji, przejdź do folderu mipmap jako cóż.

  3. Wszystkie inne obrazy są zwykle rysowane.

Cytat z tego artykułu.

 2
Author: Hayk Nahapetyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-07 09:07:37

Jeśli zbudujesz APK dla docelowej rozdzielczości ekranu, takiej jak HDPI,narzędzie do pakowania zasobów Androida,AAPT, może rozebrać rysunki dla innej rozdzielczości, której nie potrzebujesz.Ale jeśli znajduje się w folderze mipmap,to te zasoby pozostaną w pliku APK, niezależnie od rozdzielczości docelowej.

 0
Author: Evan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-01 05:27:25

Podczas tworzenia oddzielnych plików APK dla różnych gęstości, foldery rysowalne dla innych gęstości są usuwane. Spowoduje to, że ikony pojawią się rozmazane w urządzeniach, które używają ikon uruchamiania o większej gęstości. Ponieważ foldery mipmap nie są usuwane, zawsze najlepiej jest użyć ich do włączenia ikon programu uruchamiającego.

 0
Author: Fartab,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-10 06:56:32

Zrozumienie, jakie mam na temat mipmap jest mniej więcej takie:

Gdy obraz musi być narysowany, biorąc pod uwagę, że mamy różne rozmiary ekranu są rozdzielczościami, niektóre Skalowanie będzie musiało wziąć udział.

Jeśli masz obraz, który jest w porządku dla telefonu komórkowego niskiej klasy, po przeskalowaniu go do rozmiaru tabletu 10 "musisz" wymyślić " piksele, które tak naprawdę nie istnieją. Odbywa się to za pomocą algorytmu interpolacji. Im więcej pikseli trzeba wymyślić, tym dłużej proces trwa i jakość zaczyna zawodzić. Najlepszą jakość uzyskuje się przy użyciu bardziej złożonych algorytmów, które trwają dłużej(średnia otaczających pikseli vs skopiować najbliższy piksel na przykład).

Aby zmniejszyć liczbę pikseli, które trzeba wymyślić, za pomocą mipmap podasz różne rozmiary / rsolutions tego samego obrazu, a system wybierze najbliższy obraz do rozdzielczości, która ma być renderowana i zrobi skalowanie stamtąd. Powinno to zmniejszyć liczbę wymyślonych pikseli zapisujących zasoby wykorzystywane do obliczania tych pikseli w celu zapewnienia dobrej jakości obrazu.

Czytałem o tym w artykule wyjaśniającym problem wydajności w libgdx podczas skalowania obrazów:

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

 -1
Author: Juan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-07 12:02:31
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 for app icon for launcher

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/

 -1
Author: Piyush,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-03 09:28:24