Simgeler için mipmap çekilebilir


449

Android 4.3'ten (Jelly Bean) beri artık res/mipmap"mipmap" görüntülerini saklamak için klasörlerden yararlanabiliriz.

Örneğin, Android için Chrome , simgelerini daha normal res/drawableklasörler yerine bu klasörlerde saklar .

Bu mipmap görüntüleri tanıdık diğer çekilebilir görüntülerden nasıl farklıdır?

Manifestimde kaynak klasör adı verildiğinde @mipmap/bunun yerine niteleyiciyi kullandığımızı görüyorum @drawable/:

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

Referanslar:

Android 4.3 API'leri belge söylemek aşağıdaki vardır:

Bitmap'iniz veya çekilebilir için kaynak olarak bir mipmap kullanmak, kaliteli bir görüntü ve çeşitli görüntü ölçekleri sağlamanın basit bir yoludur; bu, özellikle bir animasyon sırasında görüntünüzün ölçeklendirilmesini beklediğinizde yararlı olabilir.

Android 4.2 (API seviye 17), Bitmap sınıfındaki mipmap'ler için destek ekledi; Android, bir mipmap kaynağı sağlayıp setHasMipMap () özelliğini etkinleştirdiğinizde Bitmap'inizdeki mip görüntülerini değiştirir. Şimdi Android 4.3'te, bir mipmap öğesi sağlayarak ve bir bitmap kaynak dosyasında android: mipMap özniteliğini ayarlayarak veya hasMipMap () öğesini çağırarak bir BitmapDrawable nesnesi için mipmap'leri de etkinleştirebilirsiniz.

Orada anlamama yardımcı olacak hiçbir şey görmüyorum.


XML Bitmap kaynaklarının bir android:mipMapözelliği vardır:

Boole. Mipmap ipucunu etkinleştirir veya devre dışı bırakır. Daha fazla bilgi için setHasMipMap () işlevine bakınız. Varsayılan değer false değeridir.

Bu, görebildiğim kadarıyla fırlatıcı simgeleri için geçerli değildir.


Soru, Romain Guy'ın yanıtladığı Google Grupları'nda ( "mipmap kaynak adının amacı?" ) Ortaya atıldı :

Normalde hesaplanacak daha büyük bir çözünürlükte bir görüntü sağlamak yararlıdır (örneğin, bir mdpi cihazında, Launcher daha büyük hdpi simgesinin büyük uygulama kısayollarını görüntülemesini isteyebilir.)

Bunun neredeyse mantıklı olduğunu hissediyorum, ama tam olarak değil.

Hala Randy Sugianto'nun takibine gitmeye meyilliyim:

Bunun avantajları nelerdir? Muhtemelen daha iyi başlatıcı simgeleri için mipmap'lerin nasıl kullanılacağı hakkında bir rehber var mı?


Tabii ki, Wikipedia'nın "Mipmap" için , 1983'te icat edilen daha eski bir tekniğe atıfta bulunan ve şu anki Android uygulamasıyla tam olarak ilişkilendiremediğim bir sayfası var .


Bugünlerde tüm uygulama simgelerimizi res/mipmapklasörlerde saklamalı mıyız ve bu mipmap görüntüleri için yönergeler nelerdir?


Güncelleme # 1

İşte size biraz açıklamaya çalışan bir blog yazısı.

Ancak bu blog gönderisinde kullanılan resim, içinde çok sayıda logo bulunan bir dosyaya neyin benzediğini gösterir. Chrome'un mipmap klasöründe gördüğüm bu değil.

Chrome'un mipmap-hdpiklasörü üç resim içeriyor. Birincisi, kendi başına Chrome logosu.

Chrome mipmap-hdpi icon.png

Garip bir şekilde, görmeyi umduğum 48x48 değil 72x72.

Belki de hepsi bu kadar - sadece mipmap klasörlerinde daha büyük simgeler tutmamız gerekiyor?


Güncelleme # 2

23/10/2014 tarihli Android Geliştiricileri Blog yayını, mipmapklasörleri uygulama simgeleri için kullanma fikrini bir kez daha doğrulamaktadır :

Nexus 6 ekran yoğunluğu hakkında konuşurken yazar şöyle yazar:

Uygulama simgelerinizi cihazın geçerli yoğunluğundan farklı çözünürlüklerde kullanıldığı için mipmap klasörlerine (çizilebilir klasörlere değil) yerleştirmek en iyi uygulamadır. Örneğin, bir xxhdpi cihazı için başlatıcıda bir xxxhdpi uygulama simgesi kullanılabilir.


Güncelleme # 3

Android Studio'nun , Eclipse'in bunları oluşturmak için kullandığı klasörlerden ziyade klasörlerde ic_launcher.pngsimgeleri oluşturduğunu unutmayın .mipmap...drawable...


Yanıtlar:


260

Mipmap'lerin iki farklı kullanımı vardır:

  1. Yoğunluğa özgü APK'ler oluştururken başlatıcı simgeleri için. Bazı geliştiriciler, APK boyutunu düşük tutmak için her yoğunluk için ayrı APK'ler oluşturur. Ancak bazı başlatıcılar (bazı cihazlarla birlikte gönderilir veya Play Store'da bulunur) standart 48dp'den daha büyük simge boyutları kullanır. Başlatıcılar getDrawableForDensity kullanır ve gerekirse yukarı doğru ölçeklendirir, böylece simgeler yüksek kalitededir. Örneğin, bir hdpi tablette başlatıcı xhdpi simgesini yükleyebilir. Başlatıcı simgenizi mipmap-xhdpi dizinine yerleştirerek, hdpi aygıtları için bir APK oluştururken çizilebilir-xhdpi dizininin soyulmasına neden olmaz. Tüm cihazlar için tek bir APK oluşturuyorsanız, başlatıcı istenen yoğunluk için çekilebilir kaynaklara erişebildiğinden bu gerçekten önemli değildir.

  2. 4.3'ten itibaren gerçek mipmap API'sı. Bunu kullanmadım ve aşina değilim. Android Açık Kaynak Proje başlatıcıları tarafından kullanılmaz ve başka herhangi bir başlatıcı kullanmanın farkında değilim.


2
Doğru anlıyorsam, mipmap kaynakları dışındaki herkes için yanlış yoğunluk klasörlerini açan bir derleme komut dosyası öneriyorsunuz?
Richard Le Mesurier

20
Tüm yoğunlukları için sadece bir APK oluşturmanızı ve endişelenmemeyi öneririm. Ancak evet, mipmap dizinlerinin bazen başlatıcı simgeleri için kullanılmasının nedeni, komut dosyaları (aapt - tercih edilen konfigürasyonlar) çekilebilir- {yoğunluk} dizinlerini sıyırmak, ancak mipmap- {yoğunluk} dizinlerini soymamaktır. Neredeyse bir hatadan yararlanıyor gibi görünüyor, ancak Romain Guy ve Diane Hackborn'un plus.google.com/105051985738280261832/posts/QTA9McYan1L'deki teklifiniz tasarım gereği olduğunu gösteriyor.
Kevin Tesla bobini

3
Bu yüzden mipmap'ı silme, simgelerimi çizilebilir yerlere yerleştirme ve tek bir APK oluşturma gibi tipik sürecim mükemmel. Mipmap, çoğumuz için en atipik gibi görünüyor, ancak hepimize zorlanıyor.
Birisi

Belgelerde şöyle diyor: "mipmap: Farklı başlatıcı simge yoğunlukları için çekilebilir dosyalar." developer.android.com/guide/topics/resources/…
etkinlik

79

Görünüşe göre Google, tüm bu yanıtlardan bu yana dokümanlarını güncelledi , umarım bu gelecekte başkalarına yardımcı olacaktır :) Yeni (yeni yeni) bir proje oluştururken bu soruya kendim rastladım.

TL; DR: çekmeceler, dp'ye özgü kaynak optimizasyonunun bir parçası olarak çıkarılabilir. Mipmap'lar çıkarılmaz.

Farklı cihazlardaki farklı ana ekran başlatıcı uygulamaları, çeşitli çözünürlüklerde uygulama başlatıcı simgelerini gösterir. Uygulama kaynağı optimizasyonu teknikleri kullanılmayan ekran yoğunlukları için kaynakları kaldırdığında, başlatıcı uygulaması görüntüleme için daha düşük çözünürlüklü bir simgeyi yükseltmek zorunda olduğu için başlatıcı simgeleri bulanık görünebilir. Bu görüntüleme sorunlarından kaçınmak için, uygulamalar mipmap/başlatıcı simgeleri için kaynak klasörlerini kullanmalıdır . Android sistemi, yoğunluğu sıyırma işleminden bağımsız olarak bu kaynakları korur ve başlatıcı uygulamalarının ekran için en iyi çözünürlükteki simgeleri seçebilmesini sağlar.

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


2
Bu, resim öğelerini içe aktarırken Android Studio'nun varsayılan yerleşimi ile tutarlıdır. Başlatıcı simgeleri mipmap'e girer; diğerleri çekilebilir.
Edward Brey

2
Belgeler tekrar değişmiş gibi görünüyor, mipmap geliştirici.android.com/ tools/projects/index.html içinde görünmüyor (Android dokümanlarının diğer parçalarına hala başvurmaya çalışıyor).
Someoneelse

28

Bu mipmap görüntüleri tanıdık diğer çekilebilir görüntülerden nasıl farklıdır?

İşte farkı açıklamaya çalışan iki sentim. Android'de görüntülerle çalışırken uğraştığınız iki durum var:

  1. Cihazınızın yoğunluğu için bir görüntü yüklemek istiyorsunuz ve gerçek boyutunu değiştirmeden "olduğu gibi" kullanacaksınız . Bu durumda çekmecelerle çalışmalısınız ve Android size en uygun görüntüyü verecektir.

  2. Cihazınızın yoğunluğu için bir görüntü yüklemek istiyorsunuz, ancak bu görüntü yukarı veya aşağı doğru ölçeklendirilecek . Örneğin, daha büyük bir başlatıcı simgesi göstermek istediğinizde veya görüntünün boyutunu artıran bir animasyonunuz olduğunda bu gereklidir. Bu gibi durumlarda, en iyi görüntü kalitesini sağlamak için görüntünüzü mipmap klasörüne koymalısınız . Android'in yapacağı şey, görüntüyü ölçeklendirmek yerine daha yüksek yoğunluklu bir kovadan almaya çalışacak. Bu, görüntünün netliğini (kalitesini) artıracaktır.

Böylece, resminizi nereye koyacağınıza karar vermek için temel kural şöyledir:

  • Başlatıcı simgeleri her zaman mipmap klasörüne gider .
  • Genellikle ölçeklendirilen (veya aşırı ölçeklendirilen) ve kalitesi uygulama için kritik olan görüntüler de mipmap klasörüne gider .
  • Diğer tüm görüntüler normal çekilebilir malzemelerdir .

Eylem çubuğunun simgeleri veya kayan düğmenin simgesi mipmap'te mi gidiyor?
Juan De la Cruz

Hayır, her zamanki çekmecelerdir.
sergej shafarenka

23

4.3'te mipmap'lerin Android uygulaması tam olarak 1983'ten Vikipedi makalesinde açıklanan tekniktir :)

Mipmap kümesinin her bitmap görüntüsü, ana dokunun küçültülmüş bir kopyasıdır, ancak belirli bir ayrıntı düzeyinde. Ana doku, görünüm tam olarak detaylandırılmak için yeterli olduğunda kullanılmaya devam etse de, doku bir mesafeden veya küçük boyutta görüntülendiğinde oluşturucu uygun bir mipmap görüntüsüne (...) geçecektir.

Bu, 3D grafikler için bir teknik olarak tanımlanmasına rağmen ("uzaktan görüntüleme" den bahsedildiği gibi), 2D için de geçerlidir ("çizilmiş, daha küçük bir alan" olarak çevrilir, yani "ölçek küçültülmüş").

Somut bir Android örneği için, belirli bir arka plan çizilebilir (özellikle a BitmapDrawable) olan bir Görünümünüz olduğunu düşünün . Artık bir animasyonu orijinal boyutunun 0,15'ine ölçeklemek için kullanıyorsunuz. Normalde, bu, her bir çerçeve için arka plan bitmap'inin küçültülmesini gerektirir. Ancak bu "aşırı" ölçek küçültme görsel yapaylıklar üretebilir.

Bununla birlikte, bir mipmap sağlayabilirsiniz, bu da görüntünün birkaç belirli ölçek için önceden oluşturulduğu anlamına gelir (diyelim 1.0, 0.5 ve 0.25). Animasyon, 0,5 eşiğini "geçtiğinde", orijinal, 1,0 boyutlu görüntüyü küçültmeye devam etmek yerine, 0,5 görüntüye geçecek ve küçülterek daha iyi bir sonuç sağlayacaktır. Ve böylece animasyon devam ederken.

Bu biraz teoriktir, çünkü aslında renderer tarafından yapılır. Bitmap sınıfının kaynağına göre, bu sadece bir ipucu ve oluşturucu buna saygı duyabilir veya vermeyebilir.

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

Bunun neden uygulama simgeleri için özellikle uygun olacağından emin değilim. Tabletlerdeki Android ve bazı başlatıcılar (örn. GEL), daha büyük göstermek için "bir yoğunluk daha yüksek" bir simge istemesine rağmen, bunun normal mekanizma (yani drawable-xxxhdpi& c) kullanılarak yapılması gerekiyor .


Bu, drawablemipmap görüntüleri de içeren klasörlerden farkı açıklamaz .
Timmmm

2
Aslında, bu cevap açık bir şekilde yanlıştır. Sadece fark dosyaları soyulmuş olsun ya da olmasın - o olsun veya olmasın (her iki durumda da olduğu) kullanılır Mipmapping ile ilgisi yoktur. Klasör kötü adlandırılmış; muhtemelen buna drawable-nostripfalan demeliydiler.
Timmmm

2
Mipmap'lerin güzel açıklaması, ancak Kazuaki'nin bir Google dokümanı girişine atıfta bulunmasının cevabı aslında bunun nedeni olmadığını gösteriyor.
Trilarion

11

Dikkat çekmeye değer başka bir iş parçacığında bahsettiğim bir şey - farklı yoğunlukları için uygulamanızın farklı sürümlerini oluşturuyorsanız, "mipmap" kaynak dizini hakkında bilgi sahibi olmalısınız. Farklı apk hedefleri oluştururken yoğunluk sıyırma işlemine katılmaması dışında, bu tam olarak "çekilebilir" kaynaklar gibidir.

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


... evet, Kevin tarafından kabul edilen cevapta belirtildiği gibi. Bu arkasındaki ana sebep gibi görünüyor.
Richard Le Mesurier

@RichardLeMesurier evet, sadece kısa ve net yapmak için
kreker

4

Bildirim simgeleri için doğru türü belirlemek amacıyla buna açıklayıcı bir cevap aradığım için, konuya bu açık ifadeyi eklemek istiyorum. Bu geliyor http://developer.android.com/tools/help/image-asset-studio.html#saving

Not: Başlatıcı simge dosyaları, diğer simgelerden farklı bir konumda bulunur. Bunlar mipmap / klasöründe bulunur. Diğer tüm simge dosyaları projenizin çekilebilir / klasöründe bulunur.


2

Farklı yoğunluklar için ayrı apks oluştururken, diğer yoğunluklar için çekilebilir klasörler çıkarılır. Bu, yüksek yoğunluklu başlatıcı simgeleri kullanan cihazlarda simgelerin bulanık görünmesini sağlar. Mipmap klasörleri soyulmadığından, başlatıcı simgelerini dahil etmek için bunları kullanmak en iyisidir.


2

Android'de görüntülerle çalışırken uğraştığınız iki durum var:

  1. Cihazınızın yoğunluğu için bir görüntü yüklemek istiyorsunuz ve gerçek boyutunu değiştirmeden “olduğu gibi” kullanacaksınız. Bu durumda çekmecelerle çalışmalısınız ve Android size en uygun görüntüyü verecektir.
  2. Cihazınızın yoğunluğu için bir görüntü yüklemek istiyorsunuz, ancak bu görüntü yukarı veya aşağı doğru ölçeklendirilecek. Örneğin, daha büyük bir başlatıcı simgesi göstermek istediğinizde veya resmin boyutunu artıran bir animasyonunuz olduğunda bu gereklidir. Bu gibi durumlarda, en iyi görüntü kalitesini sağlamak için görüntünüzü mipmap klasörüne koymalısınız. Android'in yapacağı şey, görüntüyü ölçeklendirmek yerine daha yüksek yoğunluklu bir kovadan almaya çalışacak.

YANİ

Böylece, resminizi nereye koyacağınıza karar vermek için temel kural şöyledir:

  1. Başlatıcı simgeleri her zaman mipmap klasörüne gider.

  2. Genellikle ölçeklendirilen (veya aşırı ölçeklendirilen) ve kalitesi uygulama için kritik olan görüntüler de mipmap klasörüne gider.

  3. Diğer tüm görüntüler normal çekilebilir malzemelerdir.

Bu makaleden alıntı .


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)

Başlatıcı için uygulama simgesi için 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/


İkinci blog yazısı için teşekkürler! Klasörlerin kullanımı drawable-XXXile mipmap-XXXklasörlerin arasındaki farkı çok iyi aydınlatır : Başlatıcı simgesi, kullanıcı başlatıcısında daha yüksek bir çözünürlük simgesinin görüntülenmesi mümkün olduğundan diğer kaynaklardan farklıdır. Bu daha yüksek çözünürlüklü resim çekilebilir klasörünüzden çıkarılmışsa, daha düşük bir yoğunluk simgesi programlı olarak yükseltilir. Bu çekici olmayan bir bulanık simgeye neden olabilir.
winklerrr

En azından Android 8.1'de Nexus P6 başlatma simgeleri, çekilebilir klasörlerdeki ölçeklendirilmedi. Aslında hiç bulunamadı ve uygulama açıldığında çöküyor.
matthew

1

Android varlık paketleme aracı AAPT gibi HDPI gibi bir hedef ekran çözünürlüğü için bir APK oluşturursanız, ihtiyacınız olmayan diğer çözünürlükler için çekmeceleri çıkarabilir.Ancak mipmap klasöründeyse, bu varlıklar APK, hedef çözünürlük ne olursa olsun.


-1

Mipmap hakkında sahip olduğum anlayış aşağı yukarı şöyle:

Bir görüntünün çizilmesi gerektiğinde, farklı ekran boyutlarına sahip olduğumuz çözünürlükler göz önüne alındığında, bazı ölçeklendirmeler yer almalıdır.

Düşük uçlu bir cep telefonu için uygun bir görüntünüz varsa, 10 "tablet boyutuna ölçeklendirdiğinizde, gerçekte var olmayan pikselleri" icat etmeniz "gerekir. Bu, bazı enterpolasyon algoritması ile yapılır. icat edilmesi gereken daha fazla piksel sayısı, işlem ne kadar uzun sürerse ve kalite başarısız olursa, en uzun kalite, daha uzun süren daha karmaşık algoritmalarla elde edilir (örneğin, en yakın piksele kıyasla çevredeki piksellerin ortalaması vs.).

İcat edilmesi gereken piksel sayısını azaltmak için, mipmap ile aynı görüntünün farklı boyutlarını / çözünürlüklerini sağlarsınız ve sistem, oluşturulması gereken çözünürlüğe en yakın görüntüyü seçer ve ölçeklendirmeyi oradan yapar. Bu, iyi kalitede bir görüntü sağlamak için bu pikselleri hesaplarken kullanılacak icat edilmiş piksel sayısını azaltacaktır.

Görüntüleri ölçeklerken libgdx'te bir performans sorununu açıklayan bir makalede bunu okudum:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.