15

タブレット 7 インチの Kindle Fire HD と Nexus 7 用のアプリケーションを開発しています。これら 2 つのアプリケーションは、サイズも画面解像度も同じです。ただし、アプリケーションを実行すると、非常に異なります。なんで?

nexus 7 は TVDPI として検出され、Kindle Fire HD は HDPI として検出されるためと思われます。モデル 1280 * 800 に基づいて同じレンダリングを行うにはどうすればよいですか?

ありがとうございました

4

3 に答える 3

25

2 つに違いがある理由はすでにわかっているようです。それは、異なる密度スケール係数が報告されているためです。

  • Nexus 7: TVDPI: 倍率 = 1.333
  • Kindle Fire HD: HDPI: 倍率 = 1.5

では、技術的には物理的なサイズと解像度が同じなのに、レポートが異なるのはなぜでしょうか?

一方のデバイスは Google Play デバイス (Nexus) であり、もう一方のデバイスはそうでない (Kindle) ため、コアの問題が実際に存在します。Google Play (およびその他の Google アプリ) を備えたすべての Android デバイスは、互換性テスト スイート (CTS) と呼ばれるものに合格することによってのみ、これを行うことができます。CTS は、このような設定が彼らが提示した標準に準拠していることを検証します。標準自体は、各リリースの互換性定義ドキュメント (CDD) に記載されています。 Android 4.0 の CDD へのリンクを次に示します (セクション 7.1 で画面サイズと密度を扱います)。CDD はデバイス メーカーに、画面の実際の DPI (この場合は実際には TVDPI) に数値的に最も近いスケール ファクターを報告する必要があることを伝えます。

Amazon デバイスは、Google Play を含む Google アプリケーションを使用しません。同じ基準に従うことが彼らの最善の利益になるかもしれませんが、彼らはそれらに拘束されておらず、しばしば守られていません. TVDPI は、Nexus 7 に登場したときにみんなに忍び寄りましたが、設計中に CDD を参照していれば、Amazon はそれを知っていたでしょう。

これにより、どのように動作が異なるのでしょうか?

違いは、レイアウトの選択にはありません。明らかに、スクリーンショットから、両方のデバイスが期待どおりに適切なレイアウトを選択しています。レイアウト ディレクトリの値を変更しても、swどのデバイスがそのレイアウトを選択するかに影響するだけです...スケールの仕方については何も変わりません。密度固有のディレクトリにレイアウト自体を配置しようとすることを気にしないでください...レイアウトは柔軟であるはずです。

代わりに、テキスト サイズ、作成した固定ビュー サイズ、ドローアブル サイズなど、密度に依存しないピクセル単位 (つまり、dip または dp) で行われる寸法またはサイズの計算に問題があります。

これら 2 つのデバイスはアセットを異なる方法でスケーリングすることを選択したため、使用するドローアブル リソースまたは「dp」で定義する値によって、わずかな変化が生じます。2 つの例を挙げましょう。

a のテキスト サイズを に定義しTextViewます16dp。Nexus 7 では、これにより 21px でテキストが描画されます。Kindle Fire HD は、同じテキストを 24px で描画します。違いは小さいです...しかし、存在します。

描画可能な画像についても同じことが言えます。drawable-mdpi48x48 の画像と 72x72 の同じ画像のみを定義した場合drawable-hdpi、Kindle には直接使用する 72px の画像があり、Nexus はスケール 64px の画像を作成するため、2 つのアセット間に 8 ピクセルの差があります。

2つをより似せるにはどうすればよいですか?

ほとんどの場合、すべきではないと思います。通常、ハードコーディングされたサイズが多すぎるレイアウトの制約が設定されていない限り、実行されるスケーリングはアプリケーションの結果に大きな影響を与えません。

ただし、一般に、この目的のために特に変更する必要がある UI の部分がある場合、解決策は、-tvdpi必要と思われる場合に備えて特定のリソースとディメンションを定義することです (繰り返しますが、すべてをスケーリングすることはお勧めしません)。このケースを満たすためにあなたのアプリ)。

テキストやビューのサイズなどについては、values-tvdpi/dimensions.xmlファイルとデフォルトvalues/dimensions.xmlファイルが必要になる場合があることを意味します。上記の例を使用すると、デフォルトのテキスト サイズを 16 dp として定義できますが、-tvdpi場所では同じ寸法を 18 dp として定義します。これにより、両方のデバイスで最終的なテキストが最大 24px に拡大されます。実際のディメンションが使用されているコードでは、直接@dimen/myTextSizeではなくとして参照してください。16dp

ドローアブル アイテムの場合は、drawable-tvdpiディレクトリを追加し、Nexus 7 などのデバイスでの描画方法に合わせてアセットをスケーリングします。前の例で、同じ画像ファイルをフォルダーからdrawable-hdpiフォルダーにコピーしてdrawable-tvdpi、両方のデバイスが同じように描画されるようにします。 72px の画像。

同じアセットを複数の場所にコピーすることを避けるために、エイリアスを使用してこれを行うこともできます。画像自体にdrawable/特別な名前を付け、 と を使用values-tvdpi/drawables.xmlvalues-hdpi/drawables.xmlて 2 つの場所で単一のアセットを参照します。エイリアシングの詳細については、このドキュメントを参照してください。例はレイアウト用ですが、type="drawable".

于 2012-11-28T23:55:54.960 に答える
1

Nexus7 は tvdpi デバイスであるため、layout-sw600dp アセットを使用します (213dpi での計算に基づく)。FireHD は HDPI デバイスであり、最終的には layout-sw533dp アセットを使用します (240dpi に基づく計算)。

于 2012-11-16T01:53:10.373 に答える
1

おそらく、layout-tvdpi と layout-hdpi を使用する必要がありますか?

于 2012-11-28T22:49:36.347 に答える