Od Androida 4.3 (Jelly Bean) możemy teraz korzystać z res/mipmap
folderów do przechowywania obrazów „mipmap”.
Na przykład Chrome na Androida przechowuje swoje ikony w tych folderach zamiast bardziej normalnych res/drawable
folderów.
Czym różnią się te obrazy mipmap od innych znanych rysowalnych obrazów?
Widzę, że w moim manifeście używamy @mipmap/
kwalifikatora zamiast @drawable/
, co ma sens, biorąc pod uwagę nazwę folderu zasobów:
<activity
android:name=".MipmapDemp"
android:icon="@mipmap/ic_launcher" />
Bibliografia:
Dokument interfejsu API systemu Android 4.3 ma następujące zdanie:
Użycie mipmapy jako źródła dla mapy bitowej lub rysowalnej jest prostym sposobem na zapewnienie wysokiej jakości obrazu i różnych skal obrazu, co może być szczególnie przydatne, jeśli spodziewasz się skalowania obrazu podczas animacji.
Android 4.2 (API poziom 17) dodał obsługę mipmap w klasie Bitmap - Android zamienia obrazy mip w Bitmapie, gdy podałeś źródło mipmap i włączyłeś setHasMipMap (). Teraz w Androidzie 4.3 możesz włączyć mipmapy również dla obiektu BitmapDrawable, podając zasób mipmap i ustawiając atrybut android: mipMap w pliku zasobów bitmapy lub wywołując hasMipMap ().
Nie widzę tam nic, co pomogłoby mi zrozumieć.
Zasoby bitmapy XML mają android:mipMap
właściwość:
Boolean. Włącza lub wyłącza wskazówkę mipmap. Aby uzyskać więcej informacji, zobacz setHasMipMap (). Wartość domyślna to false.
O ile mi wiadomo, nie dotyczy to ikon programu uruchamiającego.
Pytanie zostało zadane w Grupach dyskusyjnych Google ( celem nazwy zasobu „mipmap” ?! ), na co odpowiedział Romain Guy:
Przydatne jest dostarczenie obrazu o większej rozdzielczości, który normalnie byłby obliczany (na przykład na urządzeniu mdpi Launcher może chcieć, aby większa ikona hdpi wyświetlała duże skróty do aplikacji).
Wydaje mi się, że to prawie ma sens, ale nie do końca.
Nadal jestem skłonny do śledzenia Randy'ego Sugianto:
Jakie są tego zalety? Czy jest jakiś przewodnik jak używać mipmap, prawdopodobnie dla lepszych ikon programów uruchamiających?
Oczywiście Wikipedia ma stronę „Mipmap” , która odnosi się do starszej techniki wynalezionej w 1983 r., Której nie mogę do końca powiązać z obecną implementacją Androida.
Czy powinniśmy teraz przechowywać wszystkie nasze ikony aplikacji w res/mipmap
folderach i jakie są wytyczne dla tych obrazów mipmap?
Aktualizacja nr 1
Oto post na blogu, który próbuje to trochę wyjaśnić.
Ale obraz użyty w tym blogu pokazuje, jak wygląda jeden plik z wieloma logo. Nie tego widzę w folderze mipmap Chrome.
mipmap-hdpi
Folder Chrome zawiera trzy obrazy. Jednym z nich jest samo logo Chrome.
O dziwo, to 72x72, a nie 48x48, których spodziewałbym się zobaczyć.
Być może to wszystko - musimy po prostu przechowywać większe ikony w folderach mipmap?
Aktualizacja nr 2
W blogu deweloperów Androida z 23.10.2014 ponownie potwierdzono pomysł użycia mipmap
folderów na ikony aplikacji:
Mówiąc o gęstości ekranu Nexusa 6, autor pisze:
Najlepszą praktyką jest umieszczanie ikon aplikacji w folderach mipmap (nie folderach rysowalnych), ponieważ są one używane w rozdzielczościach innych niż aktualna gęstość urządzenia. Na przykład ikona aplikacji xxxhdpi może być używana w programie uruchamiającym dla urządzenia xxhdpi.
Aktualizacja nr 3
Pamiętaj, że Android Studio tworzy ic_launcher.png
ikony w mipmap...
folderach, a nie w drawable...
folderach, w których Eclipse je utworzył.
źródło
Wygląda na to, że Google zaktualizowało swoje dokumenty od wszystkich tych odpowiedzi, więc mam nadzieję, że pomoże to komuś innemu :) Właśnie natrafiłem na to pytanie podczas tworzenia nowego (nowego) projektu.
TL; DR: drawable mogą być usuwane w ramach optymalizacji zasobów specyficznej dla dp. Mipmapy nie zostaną usunięte.
(z http://developer.android.com/tools/projects/index.html#mipmap )
źródło
Oto moje dwa centy za próbę wyjaśnienia różnicy. Podczas pracy z obrazami w Androidzie masz do czynienia z dwoma przypadkami:
Chcesz załadować obraz dla swojej gęstości urządzenia i będziesz go używać „tak jak jest”, bez zmiany jego rzeczywistego rozmiaru . W takim przypadku powinieneś pracować z rysunkami, a Android zapewni ci najlepiej pasujący obraz.
Chcesz załadować obraz dla swojej gęstości urządzenia, ale obraz ten zostanie przeskalowany w górę lub w dół . Jest to na przykład potrzebne, gdy chcesz wyświetlić 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ć obraz w folderze mipmap . Android będzie próbował odebrać obraz z wiadra o wyższej gęstości zamiast go skalować. Zwiększy to ostrość (jakość) obrazu.
Zatem ogólna zasada decydująca o tym, gdzie umieścić obraz, to:
źródło
Implementacja mipmap na Androida w 4.3 jest dokładnie techniką z 1983 roku wyjaśnioną w artykule na Wikipedii :)
Chociaż jest to opisywane jako technika grafiki 3D (ponieważ wspomina o „oglądaniu z dystansu”), to samo dotyczy również 2D (przetłumaczone jako „narysowana jest mniejsza przestrzeń”, tj. „Przeskalowana w dół”).
Na konkretny przykład Androida wyobraź sobie, że masz Widok z określonym tłem do rysowania (w szczególności a
BitmapDrawable
). Teraz używasz animacji, aby przeskalować ją do 0,15 oryginalnego rozmiaru. Zwykle wymagałoby to zmniejszenia skali bitmapy tła dla każdej klatki. To „ekstremalne” zmniejszanie skali może jednak powodować powstawanie artefaktów wizualnych.Możesz jednak podać mipmapę, co oznacza, że obraz jest już wstępnie renderowany dla kilku określonych skal (powiedzmy 1,0, 0,5 i 0,25). Ilekroć animacja „przekroczy” próg 0,5, zamiast kontynuować zmniejszanie oryginalnego obrazu o rozmiarze 1,0, przełącza się na obraz 0,5 i przeskalowuje go w dół, co powinno zapewnić lepszy wynik. I tak dalej, gdy animacja trwa.
Jest to trochę teoretyczne, ponieważ faktycznie robi to renderer. Według źródła klasy Bitmap jest to tylko podpowiedź, a mechanizm renderujący może ją honorować lub nie.
Nie jestem jednak do końca pewien, dlaczego byłoby to szczególnie odpowiednie w przypadku ikon aplikacji. Chociaż Android na tabletach, a także niektóre wyrzutnie (np. GEL), żądają ikony „o większej gęstości”, aby pokazać ją większą, należy to zrobić przy użyciu zwykłego mechanizmu (tj.
drawable-xxxhdpi
& C).źródło
drawable
folderów, które również zawierają obrazy zmapowane.drawable-nostrip
.https://plus.google.com/105051985738280261832/posts/QTA9McYan1L
źródło
Ponieważ szukałem odpowiedzi na to pytanie, 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
źródło
Podczas budowania oddzielnych aplikacji dla różnych gęstości, usuwalne foldery dla innych gęstości są usuwane. Sprawi to, że ikony będą rozmazane na urządzeniach, które używają ikon uruchamiania o większej gęstości. Ponieważ foldery mipmap nie są usuwane, zawsze najlepiej jest używać ich do dołączania ikon programu uruchamiającego.
źródło
Cytat z tego artykułu.
źródło
MipMap dla ikony aplikacji dla programu uruchamiającego
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/
źródło
drawable-XXX
imipmap-XXX
folderami: Ikona programu uruchamiającego różni się od innych zasobów, ponieważ możliwe jest, że w programie uruchamiającym użytkowników wyświetlana jest ikona wyższej rozdzielczości. Jeśli obraz o wyższej rozdzielczości został usunięty z folderu drawables, ikona o niższej gęstości zostanie programowo powiększona. Może to powodować nieatrakcyjną rozmytą ikonę.Jeśli zbudujesz pakiet APK dla docelowej rozdzielczości ekranu, takiej jak HDPI, narzędzie do pakietowania zasobów dla systemu Android, AAPT, może usunąć pliki do rysowania w celu uzyskania innej rozdzielczości, której nie potrzebujesz, ale jeśli znajduje się w folderze mipmap, wówczas te zasoby pozostaną w APK, niezależnie od rozdzielczości docelowej.
źródło
Rozumienie, jakie mam na temat mipmap, jest mniej więcej takie:
Kiedy obraz musi zostać narysowany, biorąc pod uwagę, że mamy różne rozmiary ekranów, są rozdzielczości, trzeba będzie wziąć udział w skalowaniu.
Jeśli masz obraz, który jest odpowiedni dla niższej klasy telefonu komórkowego, po skalowaniu go do rozmiaru 10-calowego tabletu musisz „wymyślić” piksele, które w rzeczywistości nie istnieją. Jest to realizowane za pomocą pewnego algorytmu interpolacji. im więcej pikseli trzeba wymyślić, tym dłużej trwa proces, a jakość zaczyna się nie powieść. Najlepszą jakość uzyskuje się przy bardziej złożonych algorytmach, które trwają dłużej (na przykład średnia pikseli otaczających w porównaniu do skopiowania najbliższego piksela).
Aby zmniejszyć liczbę pikseli, które muszą zostać wynalezione, za pomocą mipmapy podajesz różne rozmiary / rozdzielczości tego samego obrazu, a system wybierze obraz najbliższy rozdzielczości, która ma zostać wyrenderowana i dokona skalowania od tego miejsca. Powinno to zmniejszyć liczbę wymyślonych pikseli oszczędzających zasoby, które zostaną wykorzystane do obliczenia tych pikseli, aby zapewnić obraz dobrej jakości.
Przeczytałem o tym w artykule wyjaśniającym problem z wydajnością w libgdx podczas skalowania obrazów:
http://www.badlogicgames.com/wordpress/?p=1403
źródło