web-dev-qa-db-ja.com

-anydpiと-nodpiの違いは何ですか?

Android St​​udio 1.5.0でベクターアセットウィザードを使用する場合、そのウィザードを使用してインポートするベクター描画可能XMLはres/drawable/に入ります。

ただし、build/ディレクトリとその結果のAPKは、これらのXMLファイルがres/drawable-anydpi-v21/リソースディレクトリに移動されることを示しています。 VectorDrawableはAPIレベル21+でのみサポートされているため、-v21部分は理にかなっています。ただし、-anydpiは文書化されていないようです。元のインポート先と、ビルドシステムがそれを移動する場所の両方について、-nodpiを期待していました。

-anydpiが何を意味するのか、また-nodpiとの関係について公式の声明を見た人はいますか?いくつかのコードコメントが示唆するものだけでなく、実用的な効果を探しています。

97
CommonsWare

nodpi

これらは密度に依存しないリソースです。システムは、現在の画面の密度に関係なく、この修飾子でタグ付けされたリソースをスケーリングしません。

例えば:

  • drawable-nodpi/ dot.png

ドットはxxhdpiでは小さく表示され、ldpiでは大きく表示されます。

ただし、リソースリゾルバーは、特定の修飾子が存在する場合に一致します。

例えば

  • drawable-hdpi/ eg.png
  • drawable-nodpi-v21/eg.xml

Lollipop(API 21)hdpiデバイスでは、bitmapが使用されます。

Lollipop(API 21)xhdpiデバイスでは、ベクターが使用されます。

anydpi

これらのリソースは、どのdpiでも優先されます。

例えば

  • drawable-hdpi/ eg.png
  • drawable-anydpi-v21/eg.xml

Lollipop(API 21)hdpiデバイスでは、vectorが使用されます。

Lollipop(API 21)xhdpiデバイスでは、ベクターが使用されます。

参照

:anydpiが change Ic3288d0236fe0bff20bb1599aba2582c25b0db32 に追加されました。

92
rds

ソースコード には、次のコメントが含まれています(639行目)。

/**
 * Value for {@link #densityDpi} for resources that scale to any density (vector drawables).
 * {@hide}
 */
public static final int DENSITY_DPI_ANY = 0xfffe;

/**
 * Value for {@link #densityDpi} for resources that are not meant to be scaled.
 * {@hide}
 */
public static final int DENSITY_DPI_NONE = 0xffff;

これで混乱が解消されることを願っています。

15

nodpi:すべての密度のリソース。これらは密度に依存しないリソースです。システムは、現在の画面の密度に関係なく、この修飾子でタグ付けされたリソースをスケーリングしません。

anydpi:この修飾子は、すべての画面密度に一致し、他の修飾子よりも優先されます。これはベクターのドロアブルに役立ちます。 APIレベル21で追加。

8
dzikovskyy

私はすべてにdrawable-nodpiを使用しており、大きなグラフィックがたくさんあります。グラフィックを「スケールアップ」することで文書化されていない結果の1つは、メモリ使用量が指数関数的に増加することです。したがって、「ドローアブル」で100Mのグラフィックを使用している場合、ユーザーデバイスの解像度に応じて、400Mまたは1.6Gにスケーリングされます。そして、デバイスの解像度は上がり続けます。もちろん、スケールアップしてもグラフィックの「シャープネス」は実際には増加しません。描画アクションは、画面サイズに対するグラフィックスの大きさを決定できます。複数の描画フォルダーでアプリを肥大化する必要はありません。

7
Androidcoder