Drawable Mipmap untuk ikon

449

Karena Android 4.3 (Jelly Bean) sekarang kita dapat menggunakan res/mipmapfolder untuk menyimpan gambar "mipmap".

Misalnya, Chrome untuk Android menyimpan ikonnya di folder ini, bukan folder yang lebih normal res/drawable.

Apa perbedaan gambar mipmap ini dengan gambar yang dapat digambar yang biasa digunakan?

Saya melihat bahwa dalam manifes saya, kami menggunakan @mipmap/kualifikasi, alih-alih @drawable/, yang masuk akal mengingat nama folder sumber daya:

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

Referensi:

Dokumen Android 4.3 APIs memiliki hal-hal berikut untuk dikatakan:

Menggunakan mipmap sebagai sumber bitmap atau drawable Anda adalah cara sederhana untuk memberikan gambar berkualitas dan berbagai skala gambar, yang dapat sangat berguna jika Anda mengharapkan gambar Anda akan diskalakan selama animasi.

Android 4.2 (API level 17) menambahkan dukungan untuk mipmaps di kelas Bitmap — Android menukar gambar mip di Bitmap Anda ketika Anda telah memasok sumber mipmap dan telah mengaktifkan setHasMipMap (). Sekarang di Android 4.3, Anda dapat mengaktifkan mipmaps untuk objek BitmapDrawable juga, dengan memberikan aset mipmap dan mengatur atribut android: mipMap dalam file sumber daya bitmap atau dengan memanggil hasMipMap ().

Saya tidak melihat apa pun di sana yang membantu saya untuk mengerti.


Sumber daya XML Bitmap memiliki android:mipMapproperti:

Boolean. Mengaktifkan atau menonaktifkan petunjuk mipmap. Lihat setHasMipMap () untuk informasi lebih lanjut. Nilai default salah.

Ini tidak berlaku untuk ikon peluncur sejauh yang saya bisa lihat.


Pertanyaan itu muncul di Google Groups ( Tujuan dari nama sumber daya "mipmap" ?! ), yang dijawab Romain Guy:

Ini berguna untuk memberikan gambar pada resolusi yang lebih besar yang biasanya dihitung (misalnya, pada perangkat mdpi, Launcher mungkin ingin ikon hdpi yang lebih besar untuk menampilkan pintasan aplikasi yang besar.)

Saya merasa ini hampir masuk akal, tetapi tidak cukup.

Saya masih cenderung untuk pergi dengan tindak lanjut Randy Sugianto:

Apa kelebihannya? Apakah ada panduan cara menggunakan mipmaps, mungkin untuk ikon peluncur yang lebih baik?


Tentu saja, Wikipedia memiliki halaman untuk "Mipmap" , yang merujuk pada teknik lama yang ditemukan pada tahun 1983, yang saya tidak dapat menghubungkannya dengan implementasi Android saat ini.


Haruskah kita menyimpan semua ikon aplikasires/mipmap kita di folder hari ini, dan apa pedoman untuk gambar mipmap ini?


Perbarui # 1

Berikut adalah posting blog yang mencoba menjelaskannya sedikit.

Tetapi gambar yang digunakan dalam posting blog itu menunjukkan apa yang tampak seperti satu file dengan banyak logo di dalamnya. Ini bukan yang saya lihat di folder mipmap Chrome.

mipmap-hdpiFolder Chrome berisi tiga gambar. Salah satunya adalah logo Chrome.

Chrome mipmap-hdpi icon.png

Anehnya, ukurannya 72x72, bukan 48x48 yang akan saya lihat.

Mungkin hanya itu yang ada - kita hanya perlu menyimpan ikon yang lebih besar di folder mipmap?


Perbarui # 2

Posting Blog Pengembang Android 23/10/2014 lagi menegaskan gagasan untuk menggunakan mipmapfolder untuk ikon aplikasi:

Ketika berbicara tentang kerapatan layar Nexus 6, penulis menulis:

Ini adalah praktik terbaik untuk menempatkan ikon aplikasi Anda di folder mipmap- (bukan folder yang dapat ditarik) karena ikon tersebut digunakan pada resolusi yang berbeda dari kepadatan perangkat saat ini. Misalnya, ikon aplikasi xxxhdpi dapat digunakan pada peluncur untuk perangkat xxhdpi.


Perbarui # 3

Perhatikan bahwa Android Studio membuat ic_launcher.pngikon di mipmap...folder daripada drawable...folder yang digunakan Eclipse untuk membuatnya.


Richard Le Mesurier
sumber

Jawaban:

260

Ada dua penggunaan berbeda dari mipmaps:

  1. Untuk ikon peluncur saat membuat APK spesifik kepadatan. Beberapa pengembang membuat APK terpisah untuk setiap kepadatan, untuk menjaga ukuran APK tetap rendah. Namun beberapa peluncur (dikirimkan bersama beberapa perangkat, atau tersedia di Play Store) menggunakan ukuran ikon yang lebih besar daripada 48dp standar. Peluncur menggunakan getDrawableForDensity dan turunkan jika diperlukan, bukan naik, sehingga ikonnya berkualitas tinggi. Misalnya pada tablet hdpi, peluncur mungkin memuat ikon xhdpi. Dengan menempatkan ikon peluncur Anda di direktori mipmap-xhdpi, itu tidak akan dilucuti seperti direktori drawable-xhdpi ketika membangun APK untuk perangkat hdpi. Jika Anda membuat APK tunggal untuk semua perangkat, maka ini tidak masalah karena peluncur dapat mengakses sumber daya yang dapat digambar untuk kepadatan yang diinginkan.

  2. API mipmap aktual dari 4.3. Saya belum pernah menggunakan ini dan saya tidak terbiasa dengannya. Ini tidak digunakan oleh peluncur Proyek Sumber Terbuka Android dan saya tidak mengetahui ada peluncur lain yang menggunakan.

Kevin TeslaCoil
sumber
2
Jadi Anda menyarankan skrip build yang menghapus folder kepadatan yang salah untuk semua kecuali sumber daya mipmap, jika saya mengerti dengan benar?
Richard Le Mesurier
20
Saya sarankan hanya membangun satu APK untuk semua kepadatan dan tidak perlu khawatir. Tapi ya alasan direktori mipmap kadang-kadang digunakan untuk ikon peluncur adalah karena membangun skrip (aapt --preferred-configuration) dengan membuka direktori drawable- {density} tetapi bukan direktori mipmap- {density}. Tampaknya seperti mengeksploitasi bug, tetapi kutipan Anda dari posting Romain Guy dan Diane Hackborn di plus.google.com/105051985738280261832/posts/QTA9McYan1L menunjukkan itu dengan desain.
Kevin TeslaCoil
3
jadi proses khas saya menghapus mipmap, menempatkan ikon saya di drawables dan membangun APK tunggal adalah sempurna. Kedengarannya seperti mipmap tidak lazim bagi kebanyakan dari kita dev, namun dipaksa pada kita semua.
Seseorang di suatu tempat
Dalam dokumentasi itu tertulis: "mipmap: File yang dapat digambar untuk kepadatan ikon peluncur yang berbeda." developer.android.com/guide/topics/resources/…
aktivitas
79

Tampaknya Google telah memperbarui dokumen mereka karena semua jawaban ini, jadi mudah-mudahan ini akan membantu orang lain di masa depan :) Temui pertanyaan ini sendiri, sambil membuat proyek baru (baru).

TL; DR: drawable dapat dihapus sebagai bagian dari optimalisasi sumber daya khusus-dp. Mipmaps tidak akan dilucuti.

Aplikasi peluncur layar utama yang berbeda di perangkat yang berbeda menampilkan ikon peluncur aplikasi pada berbagai resolusi. Saat teknik pengoptimalan sumber daya aplikasi menghapus sumber daya untuk kepadatan layar yang tidak digunakan, ikon peluncur dapat berakhir menjadi kabur karena aplikasi peluncur harus meningkatkan ikon resolusi yang lebih rendah untuk ditampilkan. Untuk menghindari masalah tampilan ini, aplikasi harus menggunakan mipmap/folder sumber daya untuk ikon peluncur. Sistem Android menjaga sumber daya ini terlepas dari pengupasan kerapatan, dan memastikan bahwa aplikasi peluncur dapat memilih ikon dengan resolusi terbaik untuk ditampilkan.

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

Kazuaki
sumber
2
Ini konsisten dengan penempatan default Android Studio saat mengimpor aset gambar. Ikon peluncur masuk ke mipmap; yang lain masuk ke drawable.
Edward Brey
2
Dokumentasi tampaknya telah berubah lagi, mipmap tampaknya tidak ada di developer.android.com/tools/projects/index.html (meskipun ada sedikit dokumentasi Android lainnya yang masih mencoba merujuknya).
SeseorangElse
28

Apa perbedaan gambar mipmap ini dengan gambar yang dapat digambar yang biasa digunakan?

Inilah dua sen saya dalam mencoba menjelaskan perbedaannya. Ada dua kasus yang Anda tangani saat bekerja dengan gambar di Android:

  1. Anda ingin memuat gambar untuk kepadatan perangkat Anda dan Anda akan menggunakannya "apa adanya", tanpa mengubah ukuran sebenarnya . Dalam hal ini Anda harus bekerja dengan drawables dan Android akan memberi Anda gambar pas terbaik.

  2. Anda ingin memuat gambar untuk kepadatan perangkat Anda, tetapi gambar ini akan ditingkatkan ke atas atau ke bawah . Misalnya ini diperlukan ketika Anda ingin menampilkan ikon peluncur yang lebih besar, atau Anda memiliki animasi, yang meningkatkan ukuran gambar. Dalam kasus seperti itu, untuk memastikan kualitas gambar terbaik, Anda harus meletakkan gambar Anda di folder mipmap . Apa yang akan dilakukan Android adalah, ia akan mencoba mengambil gambar dari ember dengan kepadatan yang lebih tinggi alih-alih meningkatkannya. Ini akan meningkatkan ketajaman (kualitas) gambar.

Dengan demikian, aturan praktis untuk memutuskan ke mana harus meletakkan gambar Anda adalah:

  • Ikon peluncur selalu masuk ke folder mipmap .
  • Gambar, yang sering ditingkatkan (atau sangat diperkecil) dan kualitasnya sangat penting untuk aplikasi, masuk ke folder mipmap juga.
  • Semua gambar lain yang biasa digambar .
sergej shafarenka
sumber
Jadi ikon untuk bilah tindakan atau ikon untuk tombol mengambang masuk mipmap?
Juan De la Cruz
Tidak, itu adalah gambar biasa.
sergej shafarenka
23

Implementasi Android dari mipmaps di 4.3 adalah persis teknik dari tahun 1983 yang dijelaskan dalam artikel Wikipedia :)

Setiap gambar bitmap dari set mipmap adalah duplikat yang dirampingkan dari tekstur utama, tetapi pada tingkat rincian tertentu yang dikurangi. Meskipun tekstur utama masih akan digunakan ketika tampilan cukup untuk merendernya dengan detail penuh, renderer akan beralih ke gambar mipmap yang sesuai (...) ketika tekstur dilihat dari jarak jauh atau pada ukuran kecil.

Meskipun ini digambarkan sebagai teknik untuk grafik 3D (karena menyebutkan "melihat dari kejauhan"), ini juga berlaku untuk 2D (diterjemahkan sebagai "ruang yang ditarik lebih kecil", yaitu "downscaled").

Untuk contoh Android yang konkret, bayangkan Anda memiliki Tampilan dengan latar belakang tertentu yang dapat digambar (khususnya, a BitmapDrawable). Anda sekarang menggunakan animasi untuk skala ke 0,15 dari ukuran aslinya. Biasanya, ini membutuhkan downscaling bitmap latar belakang untuk setiap frame. Downscaling "ekstrim" ini, bagaimanapun, dapat menghasilkan artefak visual.

Anda dapat, bagaimanapun, memberikan mipmap, yang berarti bahwa gambar tersebut sudah dipra-render untuk beberapa skala tertentu (misalkan 1,0, 0,5, dan 0,25). Setiap kali animasi "melewati" ambang 0,5, alih-alih melanjutkan menurunkan skala gambar asli berukuran 1,0, itu akan beralih ke gambar 0,5 dan menurunkannya, yang seharusnya memberikan hasil yang lebih baik. Dan seterusnya seiring animasi berlanjut.

Ini agak teoretis, karena sebenarnya dilakukan oleh renderer. Menurut sumber kelas Bitmap, itu hanya petunjuk, dan pemberi render mungkin atau tidak menghormatinya.

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

Saya tidak begitu yakin mengapa ini akan sangat cocok untuk ikon aplikasi. Meskipun Android pada tablet, serta beberapa peluncur (misalnya GEL), meminta ikon "satu kepadatan lebih tinggi" untuk menunjukkannya lebih besar, ini seharusnya dilakukan dengan menggunakan mekanisme biasa (yaitu drawable-xxxhdpi, & c).

matiash
sumber
Ini tidak benar-benar menjelaskan perbedaan dari drawablefolder yang juga berisi gambar yang dipetakan.
Timmmm
2
Sebenarnya, jawaban ini jelas salah. Satu- satunya perbedaan adalah apakah file dilucuti atau tidak - itu tidak ada hubungannya dengan apakah pemetaan digunakan atau tidak (dalam kedua kasus). Folder itu agak buruk namanya; mereka mungkin seharusnya menyebutnya drawable-nostripatau sesuatu.
Timmmm
2
Penjelasan bagus tentang mipmaps, tetapi jawaban Kazuaki yang merujuk pada entri dokumen Google tampaknya menyiratkan itu sebenarnya bukan alasan.
Trilarion
11

Satu hal yang saya sebutkan di utas lain yang patut ditunjukkan - jika Anda membuat versi aplikasi yang berbeda untuk kepadatan yang berbeda, Anda harus tahu tentang direktori sumber daya "mipmap". Ini persis seperti sumber daya "dapat ditarik", kecuali ia tidak berpartisipasi dalam pengupasan kerapatan saat membuat target apk yang berbeda.

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

Kreker
sumber
... ya memang, seperti yang disebutkan oleh Kevin dalam jawaban yang diterima. Ini tampaknya menjadi alasan utama di baliknya.
Richard Le Mesurier
@RichardLeMesurier ya, hanya untuk membuatnya singkat dan jelas
kreker
4

Karena saya sedang mencari jawaban klarifikasi untuk menentukan jenis ikon pemberitahuan yang tepat, saya ingin menambahkan pernyataan yang jelas ini ke topik. Itu dari http://developer.android.com/tools/help/image-asset-studio.html#saving

Catatan: File ikon peluncur berada di lokasi yang berbeda dari ikon lainnya. Mereka berada di mipmap / folder. Semua file ikon lainnya berada di drawable / folder proyek Anda.

Stev
sumber
2

Saat membuat apks yang terpisah untuk kepadatan yang berbeda, folder yang dapat digambar untuk kepadatan lainnya dihilangkan. Ini akan membuat ikon tampak buram di perangkat yang menggunakan ikon peluncur dengan kepadatan lebih tinggi. Karena folder mipmap tidak dilucuti, selalu lebih baik menggunakannya untuk menyertakan ikon peluncur.

Fartab
sumber
2

Ada dua kasus yang Anda tangani saat bekerja dengan gambar di Android:

  1. Anda ingin memuat gambar untuk kepadatan perangkat Anda dan Anda akan menggunakannya "apa adanya", tanpa mengubah ukuran sebenarnya. Dalam hal ini Anda harus bekerja dengan drawables dan Android akan memberi Anda gambar pas terbaik.
  2. Anda ingin memuat gambar untuk kepadatan perangkat Anda, tetapi gambar ini akan ditingkatkan ke atas atau ke bawah. Misalnya ini diperlukan ketika Anda ingin menampilkan ikon peluncur yang lebih besar, atau Anda memiliki animasi, yang meningkatkan ukuran gambar. Dalam kasus seperti itu, untuk memastikan kualitas gambar terbaik, Anda harus meletakkan gambar Anda di folder mipmap. Apa yang akan dilakukan Android adalah, ia akan mencoba mengambil gambar dari ember dengan kepadatan yang lebih tinggi alih-alih meningkatkannya.

BEGITU

Dengan demikian, aturan praktis untuk memutuskan ke mana harus meletakkan gambar Anda adalah:

  1. Ikon peluncur selalu masuk ke folder mipmap.

  2. Gambar, yang sering ditingkatkan (atau sangat diperkecil) dan kualitasnya sangat penting untuk aplikasi, masuk ke folder mipmap juga.

  3. Semua gambar lainnya adalah gambar biasa.

Kutipan dari artikel ini .

Hayk Nahapetyan
sumber
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)

Ikon MipMap untuk aplikasi untuk peluncur

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/

Piyush
sumber
Terima kasih untuk posting blog kedua itu! Ini mengklarifikasi perbedaan antara penggunaan drawable-XXXdan mipmap-XXXfolder dengan sangat baik: Ikon peluncur berbeda dengan sumber daya lain karena ada kemungkinan bahwa ikon resolusi yang lebih tinggi ditampilkan di peluncur pengguna. Jika gambar dengan resolusi lebih tinggi telah dihapus dari folder drawables Anda, maka ikon dengan kepadatan lebih rendah akan ditingkatkan skala programnya. Ini dapat menyebabkan ikon buram yang tidak menarik.
winklerrr
Setidaknya di Android 8.1 pada Nexus P6, luncurkan ikon di folder yang dapat digambar TIDAK ditingkatkan. Sebenarnya tidak ditemukan sama sekali dan aplikasi macet saat dibuka.
matthew
1

Jika Anda membangun APK untuk resolusi layar target seperti HDPI, alat pengemasan aset Android, AAPT, dapat menghapus gambar untuk resolusi lain yang tidak Anda butuhkan. Tetapi jika itu ada di folder mipmap, maka aset ini akan tetap berada di APK, terlepas dari resolusi target.

Evan
sumber
-1

Pemahaman yang saya miliki tentang mipmap kurang lebih seperti ini:

Ketika gambar perlu digambar, mengingat kami memiliki ukuran layar yang berbeda resolusi, beberapa penskalaan harus mengambil bagian.

Jika Anda memiliki gambar yang ok untuk ponsel low-end, ketika Anda skala ke ukuran 10 "tablet Anda harus" menemukan "piksel yang sebenarnya tidak ada. Ini dilakukan dengan beberapa algoritma interpolasi. semakin banyak jumlah piksel yang harus ditemukan, semakin lama proses dan kualitas mulai gagal. Kualitas terbaik diperoleh dengan algoritma yang lebih kompleks yang memakan waktu lebih lama (rata-rata piksel sekitarnya vs menyalin piksel terdekat misalnya).

Untuk mengurangi jumlah piksel yang harus ditemukan, dengan mipmap Anda memberikan ukuran / resolusi berbeda dari gambar yang sama, dan sistem akan memilih gambar terdekat dengan resolusi yang harus dibuat dan melakukan penskalaan dari sana. Ini harus mengurangi jumlah piksel yang ditemukan untuk menghemat sumber daya yang akan digunakan dalam menghitung piksel ini untuk memberikan gambar berkualitas baik.

Saya membaca tentang ini di sebuah artikel yang menjelaskan masalah kinerja di libgdx saat menskala gambar:

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

Juan
sumber