アイコン用のミップマップドローアブル


449

Android 4.3(Jelly Bean)以降、res/mipmapフォルダを使用して「ミップマップ」画像を保存できるようになりました。

たとえば、Android向けChromeのアイコンは、通常のres/drawableフォルダではなく、これらのフォルダに保存されます。

これらのミップマップイメージは、他の一般的なドローアブルイメージとどのように異なりますか?

私のマニフェストでは@mipmap/、の代わりに修飾子を使用していることがわかります@drawable/。これは、リソースフォルダー名を考えると意味があります。

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

参照:

アンドロイド4.3のAPIのドキュメントが言うには、以下があります。

ミップマップをビットマップまたはドローアブルのソースとして使用することは、高品質のイメージとさまざまなイメージスケールを提供する簡単な方法であり、アニメーション中にイメージがスケーリングされることが予想される場合に特に役立ちます。

Android 4.2(APIレベル17)は、ビットマップクラスのミップマップのサポートを追加しました。ミップマップソースを提供し、setHasMipMap()を有効にすると、Androidはビットマップのミップ画像を交換します。Android 4.3では、ミップマップアセットを提供し、ビットマップリソースファイルでandroid:mipMap属性を設定するか、hasMipMap()を呼び出すことで、BitmapDrawableオブジェクトのミップマップを有効にすることもできます。

理解に役立つものは何も見当たりません。


XMLビットマップリソースには次のandroid:mipMapプロパティがあります。

ブール。ミップマップヒントを有効または無効にします。詳細については、setHasMipMap()を参照してください。デフォルト値はfalseです。

これは、私が見る限り、ランチャーアイコンには当てはまりません。


質問はGoogleグループ(上育てられた目的のリソース名の「ミップマップ」?!:ロマン・ガイは答えました)、

通常は計算されるより大きな解像度で画像を提供すると便利です(たとえば、mdpiデバイスでは、Launcherは大きなhdpiアイコンに大きなアプリのショートカットを表示する場合があります)。

これはほとんど理解できると思いますが、完全ではありません。

私はまだランディ・スジャントのフォローアップに行く傾向があります:

これの利点は何ですか?おそらくより良いランチャーアイコンのために、ミップマップを使用する方法のガイドはありますか?


もちろん、Wikipediaには "Mipmap"のページがあります。これは、1983年に発明された古い手法を参照しており、現在のAndroidの実装とはあまり関係がありません。


最近、すべてのアプリアイコンをres/mipmapフォルダーに保存する必要がありますか?これらのミップマップイメージのガイドラインは何ですか?


アップデート#1

これを少し説明しようとするブログ投稿があります。

しかし、そのブログ投稿で使用されている画像は、多くのロゴが入った1つのファイルのように見えるものを示しています。これは、Chromeのミップマップフォルダーに表示されるものではありません。

Chromeのmipmap-hdpiフォルダには3つの画像が含まれています。1つはChromeロゴです。

Chrome mipmap-hdpi icon.png

奇妙なことに、私が見ると予想される48x48ではなく、72x72です。

おそらくこれですべてです-ミップマップフォルダーにより大きなアイコンを保持する必要があるだけですか?


アップデート#2

2014年10月23日のAndroid開発者ブログの投稿ではmipmap、アプリケーションアイコンにフォルダーを使用するという考えが再度確認されています。

Nexus 6の画面密度について話すとき、著者は次のように書いています。

アプリのアイコンはデバイスの現在の密度とは異なる解像度で使用されるため、アプリアイコンを(drawable-フォルダーではなく)mipmap-フォルダーに配置することをお勧めします。たとえば、xxxhdpiデバイスのランチャーでxxxhdpiアプリアイコンを使用できます。


アップデート#3

Android Studioは、Eclipse がic_launcher.pngアイコンを作成するために使用したmipmap...フォルダーではなく、フォルダー内にアイコンを作成することに注意してくださいdrawable...


回答:


260

ミップマップには2つの明確な用途があります。

  1. 密度固有のAPKをビルドするときのランチャーアイコン用。一部の開発者はAPKのサイズを抑えるために、密度ごとに個別のAPKを作成しています。ただし、一部のランチャー(一部のデバイスに同梱されているか、Playストアで入手可能)は、標準の48 dpよりも大きなアイコンサイズを使用しています。ランチャーはgetDrawableForDensityを使用し、必要に応じて拡大ではなく縮小するため、アイコンの品質は高くなります。たとえば、hdpiタブレットでは、ランチャーはxhdpiアイコンをロードします。ランチャーアイコンをmipmap-xhdpiディレクトリに配置することにより、hdpiデバイス用のAPKを構築するときに、drawable-xhdpiディレクトリのように取り除かれません。すべてのデバイスに対して単一のAPKを構築している場合、ランチャーは必要な密度のドローアブルリソースにアクセスできるため、これは実際には重要ではありません。

  2. 4.3からの実際のミップマップAPI。私はこれを使用したことがなく、慣れていません。Androidオープンソースプロジェクトランチャーでは使用されていません。他のランチャーを使用していることは知りません。


2
私が正しく理解していれば、ミップマップリソース以外のすべての不適切な密度フォルダーを取り除くビルドスクリプトを提案しているのでしょうか。
Richard Le Mesurier 2014年

20
すべての密度に対して1つのAPKを作成するだけで、心配する必要はありません。しかし、はい、ランチャーアイコンにmipmapディレクトリが使用されることがある理由は、ビルドスクリプト(aapt --preferred-configurations)がdrawable- {density}ディレクトリを削除し、mipmap- {density}ディレクトリを削除しないためです。それはほとんどのロマン・ガイとダイアンHackbornのポストからバグを悪用するが、あなたの引用のように思えるplus.google.com/105051985738280261832/posts/QTA9McYan1Lそれは仕様ですショー。
Kevin TeslaCoil 2014年

3
ミップマップを削除し、ドローアブルにアイコンを配置し、単一のAPKをビルドする私の典型的なプロセスは完璧です。ミップマップは私たちのほとんどの開発者にとって非定型のようですが、それは私たち全員に強制されています。
誰かどこかに

ドキュメントには、「mipmap:さまざまなランチャーアイコン密度用の描画可能ファイル」と書かれています。developer.android.com/guide/topics/resources/...
アクティビティ

79

これらのすべての回答以来 Googleはドキュメント更新しているようです。新しい(新しい)プロジェクトを作成しているときに、これが将来誰かに役立つことを願っています。

TL; DR:dp固有のリソース最適化の一環として、ドローアブルが削除される場合があります。ミップマップは取り除かれません。

さまざまなデバイスのさまざまなホーム画面ランチャーアプリには、さまざまな解像度でアプリランチャーアイコンが表示されます。アプリのリソース最適化手法が未使用の画面密度のリソースを削除すると、ランチャーアプリは表示のために低解像度のアイコンをアップスケールする必要があるため、ランチャーアイコンがぼやけて見えることがあります。これらの表示の問題を回避するには、アプリmipmap/でランチャーアイコンのリソースフォルダーを使用する必要があります。Androidシステムは、密度ストリッピングに関係なくこれらのリソースを保持し、ランチャーアプリが表示に最適な解像度のアイコンを選択できるようにします。

http://developer.android.com/tools/projects/index.html#mipmapから)


2
これは、画像アセットをインポートするときのAndroid Studioのデフォルトの配置と一致しています。ランチャーアイコンはミップマップに入ります。他はドローアブルに入ります。
エドワードブレイ

2
ドキュメントが再び変更されたようです。mipmapはdeveloper.android.com/tools/projects/index.html内には存在しないようです(Androidドキュメントの他の部分がまだ参照しようとしているにもかかわらず)。
SomeoneElse

28

これらのミップマップイメージは、他の一般的なドローアブルイメージとどのように異なりますか?

これが違いを説明しようとする私の2セントです。Androidで画像を操作する場合に対処する2つのケースがあります。

  1. デバイスの密度に合わせて画像をロードし、実際のサイズを変更せずに「そのまま」使用します。この場合、ドローアブルを使用する必要があり、Androidが最適な画像を提供します。

  2. デバイスの密度に合わせて画像を読み込みたいのですが、この画像は拡大または縮小されます。たとえば、大きなランチャーアイコンを表示したい場合や、画像のサイズを大きくするアニメーションがある場合に必要です。このような場合、最高の画像品質を確保するには、画像をmipmapフォルダーに配置する必要があります。Androidが行うことは、画像を拡大するのではなく、より高密度のバケットから画像を取得しようとすることです。これにより、画像のシャープネス(品質)が向上します。

したがって、画像を配置する場所を決定するための経験則は次のようになります。

  • ランチャーアイコンは常にミップマップフォルダーに入ります。
  • 多くの場合、拡大(または極端に縮小)され、アプリにとって品質が重要である画像も、ミップマップフォルダーに格納されます。
  • 他のすべての画像は通常のドローアブルです。

それで、アクションバーのアイコンまたはフローティングボタンのアイコンはミップマップに入りますか?
ファンデラクルス

いいえ、通常のドローアブルです。
sergej shafarenka 2018

23

4.3でのミップマップのAndroid実装は、まさにWikipediaの記事で説明されている1983年の手法です:)

ミップマップセットの各ビットマップイメージは、メインテクスチャの縮小された複製ですが、特定の詳細レベルが低下しています。ビューが完全に詳細にレンダリングするのに十分な場合、メインテクスチャは引き続き使用されますが、距離からまたは小さいサイズでテクスチャを表示すると、レンダラーは適切なミップマップイメージ(...)に切り替えます。

これは3Dグラフィックスのテクニックとして説明されていますが(「遠くから見ている」と述べられているように)、2Dにも同様に適用されます(「描画は小さいスペースです」、つまり「ダウンスケール」と解釈されます)。

具体的なAndroidの例として、特定の背景ドローアブル(特にBitmapDrawable)を持つビューがあるとします。アニメーションを使用して、元のサイズの0.15にスケーリングします。通常、これには各フレームの背景ビットマップを縮小する必要があります。ただし、この「極端な」ダウンスケーリングでは、視覚的なアーティファクトが生じる可能性があります。

ただし、ミップマップを指定することはできます。これは、画像がいくつかの特定のスケール(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など)は、アイコンを「1密度高く」してそれを大きく表示するよう要求しますが、これは通常のメカニズム(つまりdrawable-xxxhdpi、&​​c)を使用して行われることになっています。


これは実際にdrawableミップマップされた画像を含むフォルダーとの違いを説明していません。
Timmmm 2015年

2
実際、この答えは明らかに間違っています。唯一の違いは、ファイルが取り除かれているか否かである-それは(それは両方のケースである)ミップマッピングが使用されているかどうかとは関係ありません。フォルダーの名前は不適切です。彼らはおそらくそれdrawable-nostripか何かを呼んでいたはずです。
Timmmm 2015年

2
ミップマップの素晴らしい説明ですが、Googleのドキュメントエントリを参照している和昭の答えは、それが実際の理由ではないことを示唆しているようです。
Trilarion 2015年

11

指摘する価値がある別のスレッドで述べたことの1つ-異なる密度で異なるバージョンのアプリをビルドする場合は、「mipmap」リソースディレクトリについて知っておく必要があります。異なるapkターゲットを作成するときに密度ストリッピングに参加しないことを除いて、これは「描画可能」リソースとまったく同じです。

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


...はい、確かに、受け入れられた回答でケビンによって言及されました。これがその背後にある主な理由だったようです。
Richard Le Mesurier、2015年

@RichardLeMesurierはい、短くして明確にするためです
クレーカー

4

通知アイコンの正しいタイプを決定するためにこれに対する明確な答えを探していたので、この明確なステートメントをトピックに追加したいと思います。それはhttp://developer.android.com/tools/help/image-asset-studio.html#savingからです

注:ランチャーアイコンファイルは他のアイコンとは別の場所にあります。それらは、mipmap /フォルダーにあります。他のすべてのアイコンファイルは、プロジェクトのdrawable /フォルダーにあります。


2

異なる密度用に個別のAPKを構築すると、他の密度用の描画可能なフォルダーが削除されます。これにより、高密度のランチャーアイコンを使用するデバイスでアイコンがぼやけて表示されます。ミップマップフォルダーは削除されないため、ランチャーアイコンを含めるために常に使用するのが最善です。


2

Androidで画像を操作する場合に対処する2つのケースがあります。

  1. デバイスの密度に合わせて画像をロードし、実際のサイズを変更せずに「そのまま」使用します。この場合、ドローアブルを使用する必要があり、Androidが最適な画像を提供します。
  2. デバイス密度の画像をロードしたいが、この画像は拡大または縮小されます。たとえば、大きなランチャーアイコンを表示したい場合や、画像のサイズを大きくするアニメーションがある場合に必要です。このような場合、最高の画像品質を確保するには、画像をmipmapフォルダーに配置する必要があります。Androidが行うことは、画像を拡大するのではなく、より高密度のバケットから画像を取得しようとすることです。

そう

したがって、画像を配置する場所を決定するための経験則は次のようになります。

  1. ランチャーアイコンは常にミップマップフォルダーに移動します。

  2. 多くの場合、拡大(または極端に縮小)され、アプリにとって品質が重要である画像も、ミップマップフォルダーに格納されます。

  3. 他のすべての画像は通常のドローアブルです。

この記事からの引用。


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)

ランチャーのアプリアイコン用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/


2番目のブログ投稿をありがとう!それはの使用との違いを明確にdrawable-XXXし、mipmap-XXX本当によくフォルダを:高解像度のアイコンがランチャーのユーザーに表示されている可能性があるとして、ランチャーアイコンが他のリソースに異なっています。そのより高い解像度の画像がドローアブルフォルダーから削除されている場合、より低い密度のアイコンはプログラムで拡大されます。これは、魅力のないぼやけたアイコンを引き起こす可能性があります。
winklerrr 2017

少なくともNexus 8.1のAndroid 8.1では、ドローアブルフォルダー内の起動アイコンは拡大されません。実際にはまったく見つからず、アプリを開くとクラッシュします。
マシュー

1

HDPIのようなターゲット画面解像度のAPKを作成する場合、AndroidアセットパッケージツールAAAPTは、不要な他の解像度のドローアブルを削除できます。ただし、ミップマップフォルダーにある場合、これらのアセットはターゲット解像度に関係なくAPK。


-1

ミップマップについて私が理解しているのは、多かれ少なかれ次のようなものです。

画像を描画する必要がある場合、解像度とは異なる画面サイズがあるため、ある程度のスケーリングが必要になります。

ローエンドの携帯電話で問題のない画像がある場合、10インチのタブレットのサイズに拡大縮小するとき、実際には存在しないピクセルを「発明」する必要があります。これは、いくつかの補間アルゴリズムを使用して行われます。発明する必要があるピクセルの量が多いほど、プロセスにかかる時間が長くなり、品質が低下し始めます。より長い時間がかかる複雑なアルゴリズムを使用すると、最高の品質が得られます(たとえば、周囲のピクセルの平均と最も近いピクセルのコピー)。

発明する必要があるピクセルの数を減らすために、ミップマップを使用して同じ画像の異なるサイズ/解像度を提供すると、システムはレンダリングする必要がある解像度に最も近い画像を選択し、そこからスケーリングを行います。これにより、発明されたピクセルの数が減り、これらのピクセルを計算して高品質の画像を提供するために使用されるリソースを節約できます。

これについては、libgdxで画像をスケーリングするときのパフォーマンスの問題を説明する記事で読みました。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.