Help us understand the problem. What is going on with this article?

Androidのmipmapとdrawableについて

More than 3 years have passed since last update.

以前はdrawable-xxxxxというディレクトリに解像度ごとの画像を用意することでマルチ解像度対応ができていたのですが、いつのまにかmipmap-xxxxxというのもあるようなので調べてまとめておきました。

概要

概要説明はAndroid4.3の説明にありました。
https://developer.android.com/about/versions/android-4.3.html#MipMap

Mipmapping for drawables

Using a mipmap as the source for your bitmap or drawable is a simple way to provide a quality image and various image scales, which can be particularly useful if you expect your image to be scaled during an animation.

Android 4.2 (API level 17) added support for mipmaps in the Bitmap class—Android swaps the mip images in your Bitmap when you've supplied a mipmap source and have enabled setHasMipMap(). Now in Android 4.3, you can enable mipmaps for a BitmapDrawable object as well, by providing a mipmap asset and setting the android:mipMap attribute in a bitmap resource file or by calling hasMipMap().

ここから読み取れるのは、

  • Android4.2から使用できる
  • mipmapイメージを使うと、旧来のdrawableが画面解像度に応じたbitmapイメージを選択してロードしてくれていた仕組みに対して、拡大縮小アニメーションをしたときにも適切なビットマップを適用してくれる。
    • 旧来の仕組みはリソース節約のための仕組みだったのに対して、新しい仕組みは、メモリやGPU等がリッチになった前提でインタラクションを優先した仕組みな模様。
  • mipmapを使用するには新しいAPIを使用する。(従来のdrawableの使い方で勝手にmipmapイメージを選択してくれたり、置き換わったりするわけではないようだ。)

また、こちらも参考になりました。
https://plus.google.com/109167540865998371620/posts/U9TLZ65yJ6S
http://qiita.com/operandoOS/items/53b0f2074a806aacd290

マルチスクリーン対応の説明はどう変わったか

http://developer.android.com/guide/practices/screens_support.html#support

Note: Place all your launcher icons in the res/mipmap-[density]/ folders, rather than the res/drawable-[density]/ folders. The Android system retains the resources in these density-specific folders, such as mipmap-xxxhdpi, regardless of the screen resolution of the device where your app is installed. This behavior allows launcher apps to pick the best resolution icon for your app to display on the home screen. For more information about using the mipmap folders, see Managing Projects Overview.

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

Make sure launcher apps show a high-resolution icon for your app by moving all densities of your launcher icons to density-specific res/mipmap/ folders (for example res/mipmap-mdpi/ and res/mipmap-xxxhdpi/). The mipmap/ folders replace the drawable/ folders for launcher icons. For xxhpdi launcher icons, be sure to add the higher resolution xxxhdpi versions of the icons to enhance the visual experience of the icons on higher resolution devices.

このあたりによると、ランチャーアイコンについてはmipmapに完全に置き換わっているようです。
そのほかの一般的なアプリ内の画像リソースでのdrawableとmipmapの使い分けについては特に記述はありませんでした。

drawableを使うのは今までどおりでよく、拡大縮小が絡むところだけmipmapの使用を検討すればよさそうです。

リソースディレクトリはどうなるか

http://developer.android.com/guide/practices/screens_support.html#qualifiers

こちらによると、こんな感じになります。

res/drawable-mdpi/graphic.png         // bitmap for medium-density
res/drawable-hdpi/graphic.png         // bitmap for high-density
res/drawable-xhdpi/graphic.png        // bitmap for extra-high-density
res/drawable-xxhdpi/graphic.png       // bitmap for extra-extra-high-density

res/mipmap-mdpi/my_icon.png         // launcher icon for medium-density
res/mipmap-hdpi/my_icon.png         // launcher icon for high-density
res/mipmap-xhdpi/my_icon.png        // launcher icon for extra-high-density
res/mipmap-xxhdpi/my_icon.png       // launcher icon for extra-extra-high-density
res/mipmap-xxxhdpi/my_icon.png      // launcher icon for extra-extra-extra-high-density

また、
http://developer.android.com/guide/practices/screens_support.html#support

    Note: The mipmap-xxxhdpi qualifier is necessary only to provide a launcher icon that can appear larger than usual on an xxhdpi device. You do not need to provide xxxhdpi assets for all your app's images.

アイコンファイルはxxxhdpまで用意してほしいが、それ以外のイメージについては必須ではないとのこと。

理由はちゃんと書いてありませんが、おそらく必須とするとアプリサイズが膨大になるし、大抵の場合はxxhdpiイメージからの拡大でも問題ないという判断なのではないかと思います。

対応OSバージョンごとの選択肢

Android4.1以前では使えないため、対応OSバージョンごとに次の選択肢が考えられます。

最低バージョンがAndroid4.2以上 (android:minSdkVersionが17以上)

  • アイコンはmipmapだけでOK
  • 画像リソースは基本drawable
  • アプリ内で画像の拡大縮小をする場合はmipmapの使用を検討する

最低バージョンがAndroid4.1以前(android:minSdkVersionが16以下)

  • アイコンはdrawableとmipmap両方に用意する
    • またはdrawableだけにしても、互換性はあるはずなので大丈夫
    • でもapkになる時点では圧縮されるので、両方にあっても悪影響は少ないと思う
  • 画像リソースはdrawableに
  • アプリ内で画像の拡大縮小をする場合はmipmapの使用を検討する
    • ただし、その際には必ずAPIレベルのチェックを行ってからAPIを呼ぶ必要があるので煩雑になる覚悟の上で
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away