web-dev-qa-db-ja.com

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

Android 4.3(Jelly bean)以降、 "mipmap"画像を保存するためにres/mipmapフォルダを利用することができます。

たとえば、Android for Chromeは、通常のres/drawableフォルダではなく、これらのフォルダにアイコンを格納します。

これらのミップマップイメージは他のよく知られている描画可能イメージとどう違うのですか?

私のマニフェストでは、リソースフォルダー名を考えると@mipmap/ではなく@drawable/修飾子を使用しています。

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

参考文献:

Android 4.3 API 文書には、次のような記述があります。

ミップマップをビットマップまたはドロウアブルのソースとして使用するのは、高品質のイメージとさまざまなイメージスケールを提供するための簡単な方法です。これは、アニメーション中にイメージが拡大縮小されると予想される場合に特に便利です。

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

私が理解するのに役立つものはそこには見当たりません。


XMLビットマップリソースAndroid:mipMapプロパティがあります。

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

私が見ることができる限りこれはランチャーアイコンには適用されません。


この問題はGoogle Groups(リソース名 "mipmap"の目的は?!)で発生し、Romain Guyは次のように答えました。

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

私はこれがほとんどそれを理解しているように感じますが、まったくそうではありません。

私はまだRandy Sugiantoのフォローアップを続けるつもりです。

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


もちろん、 ウィキペディアには "Mipmap"のページがあります 、これは1983年に発明された古い技術のことで、現在のAndroidの実装とはまったく関係がありません。


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


更新#1

これをちょっと説明しようとするブログ記事があります。

しかし、このブログ記事で使用されている画像は、1つのファイルに多くのロゴが含まれているように見えるものを示しています。これはChromeのmipmapフォルダにはありません。

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

Chrome mipmap-hdpi icon.png

奇妙なことに、それは私が見ることを期待するであろう48×48ではなく72×72です。

おそらくこれですべてです - 私たちはミップマップフォルダにもっと大きなアイコンを保存する必要があるのでしょうか?


更新#2

2014年10月23日のAndroid Developers Blogの記事でも、アプリケーションアイコンにmipmapフォルダを使用するという考えが確認されています。

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

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


更新#3

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


425

ミップマップの使い方は2つあります。

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

  2. 4.3からの実際のミップマップAPI。私はこれを使ったことがないし、慣れていない。これはAndroid Open Source Projectランチャーでは使用されていませんし、他のランチャーが使用していることも知りません。

249
Kevin TeslaCoil

Googleがこれらのすべての回答から ドキュメントを更新したようです だから、これが将来他の人に役立つことを願っています:)新しい(新しい)プロジェクトを作成しながらこの質問に遭遇したところです。

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

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

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

76
Kazuaki

これらのミップマップイメージは、他のよく知られている描画可能イメージとどう違うのですか?

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

  1. あなたはあなたのデバイス密度のために画像をロードしたいと思うでしょう、そしてあなたはそれを実際のサイズを変えることなく "そのまま"、 使用するつもりです この場合、 drawables で作業してください。Androidが最適な画像を提供します。

  2. あなたはあなたのデバイス密度のために画像をロードしたいが、この画像 は拡大または縮小される予定です 。たとえば、大きなランチャーアイコンを表示したい場合、またはアニメーションを使用している場合は画像のサイズが大きくなります。そのような場合、最高の画質を保証するために、あなたは mipmap フォルダにあなたの画像を置くべきです。 Androidは、拡大するのではなく、高密度のバケツから画像を取得しようとします。これにより、画像の鮮明度(品質)が向上します。

したがって、どこに画像を入れるかを決める経験則は、次のようになります。

  • ランチャーアイコン 常に mipmap フォルダーに移動します。
  • 拡大 (または極端に縮小)され、品質がアプリにとって重要である画像は、 mipmap フォルダーにも入れます。
  • 他のすべての画像 は通常のものです drawables
27

4.3のミップマップのAndroid実装は、1983年のウィキペディアの記事で説明されている技術とまったく同じです。

ミップマップセットの各ビットマップ画像は、メインテクスチャの複製を縮小したものですが、詳細度はある程度低下しています。メインテクスチャは、ビューが十分詳細に表示するのに十分な場合には依然として使用されますが、テクスチャが遠くから、または小さいサイズで表示されると、レンダラは適切なミップマップイメージ(...)に切り替わります。

これは(「遠くから見る」と言及されているように)3Dグラフィックスのための技法として説明されているが、それは2Dにも同様に当てはまる(「描画は小さいスペース」、すなわち「縮小」として翻訳される)。

具体的なAndroidの例として、特定の背景を描画可能なビュー(特にBitmapDrawable)を持つビューがあるとします。アニメーションを使って、元のサイズの0.15に拡大します。通常、これには各フレームの背景ビットマップの縮小が必要です。ただし、この「極端な」縮小は視覚的なアーティファクトを引き起こす可能性があります。

ただし、ミップマップを提供することもできます。これは、画像がすでにいくつかの特定の縮尺でプリレンダリングされていることを意味します(たとえば、1.0、0.5、および0.25)。元の1.0サイズの画像を縮小し続けるのではなく、アニメーションが0.5のしきい値を「超える」ときはいつでも、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)を使用して行われることになっています。

23
matiash

指摘しておく価値がある別のスレッドで私が述べたことの1つ - あなたが異なる密度のためにあなたのアプリケーションの異なるバージョンを構築しているなら、あなたは "mipmap"リソースディレクトリについて知っておくべきです。これは、「描画可能な」リソースとまったく同じですが、異なるapkターゲットを作成するときに密度ストリッピングに関与しない点が異なります。

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

11
kreker

通知アイコンの正しい種類を判断するための明確な答えを探していたので、この明確な文をトピックに追加したいと思います。それは http://developer.Android.com/tools/help/image-asset-studio.html#saving からです

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

4
Stev

Androidで画像を扱うときに対処するケースが2つあります。

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

_ _ so _

したがって、どこに画像を入れるかを決める経験則は、次のようになります。

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

  2. しばしば拡大される(または極端に縮小される)画像の品質がアプリにとって重要である場合は、同様にmipmapフォルダに移動します。

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

this articleからの引用。

2
Hayk Nahapetyan

あなたはHDPI、Androidの資産packageingツールのようなターゲットの画面解像度用のAPKを構築する場合、AAPTは、他の解像度のためのDrawableを取り除くことができますが、それはミップマップのフォルダ内にいた場合、その後、これらの資産はに滞在するneed.ButはありませんAPK、関係なく、ターゲット解像度の。

1
Evan
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/ /

1
Piyush

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

1
Fartab