Android Studioにおいてランチャーアイコンはそれまでのdrawable-密度/ic_launcher.pngからmipmap-密度/ic_launcher.pngに変わりました。
もちろん、名前が変わっただけじゃなくて実際の挙動も変わっているのですが、イマイチ地味な変化のためよく知られていないように思います。
結論#
結論から言うとランチャーアイコンはmipmapにしましょう。
mipmapとは#
Mipmapは3Dでよく使われる技術で、遠くのオブジェクトには荒いテクスチャ、近くのオブジェクトには細かいテクスチャを使用することでクオリティとメモリーを両立させる技術です。
Androidは3Dではないですが、drawableで似たようなことが行われています。
drawable-mdpiやdrawable-xxhdpiのように端末のピクセルサイズに応じてサイズの異なる画像を用意することで画面密度が荒い端末ではメモリー消費量を節約して、画面密度が細かい端末では高精細な画像を適用する qualifierという仕組みです。
通常であれば、それで良いのですが、最近の端末ではランチャーアイコンにおいて端末本来のdpiよりも高いdpiを使用してアイコンを拡大気味に表示している端末が有ります。
例えばNexus5では本来アイコンは、48dpのxxhdpi(3倍)なので144x144pxとなるはずなのに実際には176x176pxで表示されます。Nexus6では224x224pxで表示されます。
drawableとmipmapにおける挙動の違い#
この時、drableに指定されている画像は、端末の物理的なピクセルサイズを元にxxhdpiの画像を使用します。
それに対してmipmapに指定されている画像は、描画するときの画面密度を元に適切な画像を切り替えてxxxhdpiの画像を使用します。
Nexus5(xxhdpi)においてic_launcherをdarawableに置いた場合とmipmapにおいた場合のスクリーンショットです。
drawableではxxhdpiが使用されれているのに対してmipmapではxxxhdpiが使用されているのがわかります。
一般的に画像では拡大より縮小のほうが画質劣化が少ないので、drawableなxxhdpiを拡大するよりmipmapなxxxhdpiを縮小したほうが画質の劣化を抑えることが出来ます。
どれくらい画質に差がでるか#
同じ画像を元にmipmapを使用した場合とdrawableを使用した場合を見比べてみましょう。
表示した端末はNexus5上でdrawableとmipmapの画像を表示してみました。
左がdrawable、右がmipmapです。
drawableの方は144x144の画像を176x176に拡大したもの、mipmapは196x196の画像を176x176に縮小していることになります。
クビの部分を見るとmipmapの方が輪郭がくっきりしているのがよくわかります。
拡大するとこんな感じ
drawableではエッジ部分がかなりぼやけているのがわかります。
ということで、アイコンランチャーはdrawableではなくmipmapを使ってxxxhdpiまでサポートすることをおすすめします。
この記事はFirespeedの記事を元に細部の調整を行ったものです。