2017/01/16

drawable-nodpi と drawable-anydpi と drawable の違い


[Android Drawable Importer](https://github.com/winterDroid/android-drawable-importer-intellij-plugin) というプラグイン一般的によく使われるようなアイコンを一発で追加できるプラグインです。結構便利。を使って Vector Drawable を追加すると、`drawable-anydpi` というディレクトリに追加されます。 前々から気になっていた `drawable-nodpi` との違いを調べてみたところ、意外と情報が少なかったのですが、こちらのブログに情報がありました。 - [The CommonsBlog — -nodpi, -anydpi, and WTF?](https://commonsware.com/blog/2015/12/21/nodpi-anydpi-wtf.html) 以下、まとめようと思ったのですが、原文がすばらしかったので、ほぼ翻訳です。 ### nodpi `nodpi` は全ての解像度で使用されます。ただし、特定の解像度に同じ名前のリソースがあった場合、そちらが使用されます。 例えば、`res/drawable-nodpi/foo.xml` と `res/drawable-xxhdpi/foo.png` がある場合、`-xxhdpi` の解像度のデバイスでは `res/drawable-xxhdpi/foo.png` が使用されます。 他の解像度のデバイスでは `res/drawable-nodpi/foo.xml` が使用されます。 ### anydpi `anydpi` も全ての解像度で利用される点は同じです。ただし、特定の解像度に同じ名前のリソースがあろうとも、`anydpi` が優先して使用されます。 例えば、`res/drawable-anydpi/foo.xml` と `res/drawable-xxhdpi/foo.png` がある場合、全てのデバイスで `res/drawable-anydpi/foo.xml` が使用されます。 このため、`anydpi` は他の修飾子と一緒に使用されることが多いです。 `-v21` はよく見かけるものの一つでしょう。というのも、XML で定義できる drawable の一つである [vector drawable](https://developer.android.com/studio/write/vector-asset-studio.html) は API Level 21 以降で追加されたためですただし、後述のように Android Studio が png ファイルを生成してくれるので、あまり意識する必要は無いと思う。。 例えば、`res/drawable-anydpi-v21/foo.xml` と `res/drawable-xxhdpi/foo.png` が定義されている場合、API Level 21 (Android 5.0) 以上の端末では `res/drawable-anydpi-v21/foo.xml` が使用され、 それ以外のデバイスでは `res/drawable-xxhdpi/foo.png` が使用されます`-xxhdpi` 解像度ではない場合は適切にサイズ変更が行われる。 ### 無修飾子 何もついていない `res/drawable/` は `res/drawable-mdpi/` と同義です。解像度毎のリソースが定義される前の **非常に古い** Android との互換性として残されています。 つまり、 `res/drawable` を非解像度依存のリソースとして使用すべきではありませんIMHO : 私の意見では。 ### drawable-nodpi に vector drawable を入れてはいけない 原文ではサラっと書いてあったのですが、結構大事なことだと思うので別項目にしました。 `minSdkVersion` が 21 より小さい場合、 `drawable-nodpi` に vector drawable をいれてはいけません。 というのも、Android Studio は API Level 21 (Android 5.0) 以前の端末のために png ファイルを自動生成しますが、`drawable-nodpi` ディレクトリは対象外にしているためです。

0 件のコメント: