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


108

Android Studio 1.5.0でベクターアセットウィザードを使用する場合、そのウィザードを使用してインポートしたベクタードローアブルXMLはすべてに移動しres/drawable/ます。

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

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


回答:


106

nodpi

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

例えば:

  • ドローアブル-nodpi /dot.png

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

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

例えば

  • ドローアブル-hdpi /eg.png
  • drawable- nodpi -v21 / eg.xml

Lollipop(API 21)hdpiデバイスでは、ビットマップが使用されます。

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

anydpi

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

例えば

  • ドローアブル-hdpi /eg.png
  • ドローアブル-anydpi -v21 / eg.xml

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

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

参照

:anydpiは、変更Ic3288d0236fe0bff20bb1599aba2582c25b0db32で追加されました


それは私が見ているものではありません。私の賞金を引用:「res / drawable-nodpi /とres-drawable-mdpi /に同じリソースの2つのエディションがある場合、-xxhdpiであるAndroid 6.0を実行しているNexus 5でres / drawable-nodpi /エディションを取得します。端末"。引用している動作を示すサンプルプロジェクトはありますか?
CommonsWare、2015

を使用しdrawableたからです。SDKの動作は変更されている可能性があります。参照VectorDrawableは:Androidの負荷xhdpi PNGの代わりにベクトルリソースのは
RDS

「それはあなたがドローアブルを使ったからだ」-そう答えた。drawable私の賞金で引用した両方のディレクトリがリソースディレクトリであるのと同じように、回答で引用したすべてのdrawableリソースディレクトリはリソースディレクトリです。
CommonsWare、2015

「xxxdpiでは、フレームワークはhdpiビットマップを取ります。」-私のテストは-xxhdpiデバイス上で行われていますが、具体的には何が起こっていません。私res/drawable-mdpi/nodpi_and_m.pngres/drawable-nodpi/nodpi_and_m.xml。Nexus 5 -xxhdpiデバイスでは、使用されるリソースはres/drawable-nodpi/nodpi_and_m.xmlです。あなたのアルゴリズムと私の期待に応じて、res/drawable-mdpi/nodpi_and_m.png使用する必要があります。それは起こっていることではありません。
CommonsWare、

2
結論:ベクトルをに配置する必要がありdrawable-anydpi-v21ます。support-vector-drawableライブラリがある場合は、それらをdrawable-anydpiまたはに配置できますdrawable
RDS

17

ソースコードは以下のコメント(ライン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;

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


8
「これで混乱が解消されることを願っています」-それほどではありません。「任意の密度へのスケーリング」と「スケーリングすることを意図していない」との違いが実際にはどういう意味かは不明です。中ドローアブル-nodpiディレクトリは最も確かに描画可能がどのように使われるかのために整備されているものは何でも規則に従って、サイズに基づいてスケーリングします。
CommonsWare、2015

「スケーリングすることを意図していない」とは、プログラマーが何をしても、密度が何であっても、スケーリングされないことを意味します。
Vishavjeet Singh

「あらゆる密度にスケーリング」という言葉は、密度の大きさに関係なく、あらゆる密度に合うようにスケーリングするベクトルドローアブルを指していることを意味していると思います。
Vishavjeet Singh

3
android.googlesource.com/platform/frameworks/base/+/31245b4%5Eに追加されました、そしてそこから、おそらくいくつかのバグ17007265が修正されたことを知ることができます
marcinj

1
@MarcinJędrzejewski:実際には、そのコミットに関する「要求された密度と完全に一致する構成がない限り、最良の一致として選択されます」というコメントは、手掛かりを与えてくれます。ありがとう!
CommonsWare

10

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

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


9

私は、ゲームの大きなグラフィックをたっぷり含む、すべてにdrawable-nodpiを使用しています。グラフィックスのスケールアップによる文書化されていない結果の1つは、メモリ使用量が指数関数的に増加することです。したがって、ドローアブルに1MBのグラフィックがある場合、ユーザーデバイスの解像度に応じて4MB、16MB、または64MBにスケーリングされます。そして、デバイスの解像度は上がり続けています。もちろん、その拡大は実際にはグラフィックのシャープネスを向上させるものではありません。とにかく、描画アクションは、各グラフィックの画面サイズに対する大きさを指示できます。複数の描画フォルダでアプリを膨らませる必要はありません。


3
過小評価された答え。同じ問題が発生しました:100KBの画像がありましたが、ロード時にOOMエラーが頻繁に発生しました。アプリがクラッシュし、18MBを割り当てることができなかったと述べました!!! これらの100KBを18MBに変換する方法を理解できませんでしたが、実際にはそのスケーリングの結果です。画像をno-dpiに切り替えると問題が解決しました。
Simon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.