序文
今日の Android システムの開発は、そのオープン ソース性と切り離すことはできませんが、Android システムに接続されるデバイスが増え、Android システムにさまざまなカスタマイズが加えられるにつれて、さまざまな深刻なフラグメンテーションが長い間発生してきました。 . たとえば、Android の画面には、5 インチ、5.9 インチ、6 インチ、6.1 インチなど、さまざまなサイズがあります。もちろん、画面の解像度もさまざまであり、同じ要素が異なる効果を表示するという問題に簡単につながる可能性があります。そのため、Android アプリ開発における画面適応作業はますます重要になっています。
この記事では、Android の画面適応に関する知識を紹介します。
画面適応の基本的な考え方
画面サイズ
画面サイズは、携帯電話の対角線の物理的な長さを指し、単位は英寸
(インチ、1 インチ = 2.54 cm )、
たとえば、一般的な 6 インチの携帯電話は、携帯電話の対角線の長さが 6 * 2.54 = 15.24 cm であることを意味します。
画面の解像度
携帯電話の横方向と縦方向の画素数の合計を指し、単位はpx
(画素、1画素=1画素)、
解像度は通常、A * B のように表されます。たとえば、1080 * 1920 です。これは、画面の各行が 1080 ピクセルで、各列が 1920 ピクセルであることを意味します。
Android デバイスの場合、ADB コマンドを使用して画面解像度情報をすばやく確認できます。
adb shell wm size
画面のピクセル密度
これは、1 インチあたりのピクセル数を指し、単位はdpi
(dots per ich) です。デバイスに 1 インチあたり 160 ピクセルがあると仮定すると、デバイスの画面ピクセル密度は 160 dpi になります。
画面ピクセルの計算式は次のとおりです。
画面ピクセル密度 = 1 行ピクセル数 2 + 1 列ピクセル数 2 画面サイズ 画面ピクセル密度 = \frac{\sqrt{1 行ピクセル数^2 + 1 列ピクセル数^2 }}{画面サイズ}画面のピクセル密度=画面サイズ1 行のピクセル数2+1 列のピクセル数2なな
つまり、まずピタゴラスの定理を使用して対角線上のピクセル数を計算し、その数を画面サイズで割ります。
例: 4.7 インチ、1080 * 1920 解像度の携帯電話、そのピクセル密度は:
画面のピクセル密度 = 108 0 2 + 192 0 2 4.7 ≈ 469 dpi 画面のピクセル密度 = \frac{\sqrt{1080^2 + 1920^ 2 }}{4.7} ≈ 469 dpi画面のピクセル密度=4.7108 02+192 02なな≒469 d p i
Android デバイスの場合、ADB コマンドを使用して画面のピクセル密度情報をすばやく確認できます。
adb shell wm density
密度に依存しないピクセル
密度に依存しないピクセル、英語名密度に依存しないピクセル、単位 dp、これは Android の固有の単位であり、デバイス上の実際の物理的なピクセルとは関係なく、画面のピクセル密度にのみ関連します。画面のピクセル密度が異なるデバイスでも同じ効果が得られます。
注: Android では、1 インチ = 160 dp です。
直接 px ではなく dp を使用するのはなぜですか? 簡単な例を見てみましょう:
画面幅の半分の長さの線を px で画面に表示する必要があると仮定すると、次のようになります。
- 解像度が 480 * 800 で画面密度が 240 dpi (約 3.89 インチ) のデバイスでは、この行の長さは 240 px にする必要があります。
- 解像度が 320 * 480 で画面密度が 160 dpi (約 3.61 インチ) のデバイスでは、この線の長さは 160 px にする必要があります。
上記の場合、px を使用してこの線の長さを設定する場合、異なる解像度を持つ 2 つのデバイスに適応するために 2 つの異なる値を使用する必要があります。
ただし、単位dp
を使用する、どちらの場合も 160 dp を使用するだけで、線を画面の長さの半分として表示できます。
通常の開発では、UI デザイナーから渡される設計図はすべて単位px
でdp
、開発の単位として使用したいため、px を dp に変換する必要があります.これらの変換関係は次のとおりです。
密度タイプ | 代表解像度(px) | 画面密度 (dpi) | 変換 (px/dp) |
---|---|---|---|
低密度 (ldpi) | 240×320 | 120 | 1 dp = 0.75 ピクセル |
中密度 (mdpi) | 320×480 | 160 | 1 dp = 1 ピクセル |
高密度 (hdpi) | 480×800 | 240 | 1 dp = 1.5 ピクセル |
超高密度 (xhdpi) | 720 * 1280 | 320 | 1 dp = 2 ピクセル |
超超高密度 (xxhdpi) | 1080 * 1920 | 480 | 1 dp = 3 ピクセル |
画面密度が160dpiのデバイスの場合、1dp=1pxであることがわかります。
独立スケール ピクセル
独立スケール ピクセル、英語名スケール非依存ピクセル、単位 sp、Android でフォント サイズを設定するために一般的に使用される Android 固有の単位です。
一般に、1 sp = 1 dp です。フォント サイズの設定には偶数の sp 値を使用することをお勧めします。奇数と 10 進数の使用は推奨されません。精度が失われやすいためです。
画面適応スキーム
dp ネイティブ ソリューション
Android はどのような問題を解決するdp
の。
上記の dp の概念の紹介で、Android では1 インチ = 160 dpであることがわかっています。
サイズが同じで解像度が異なるデバイスでは、画面のピクセル密度が異なるため、1 dp ごとに表されるピクセル数が異なります。
同じ px 値で線を表示すると、線の長さは 2 つのデバイスで異なる比率で表示されます。
単位として dp を使用する場合、各 dp の対応する物理的な長さは同じであるため、同じ dp 値を使用すると、それらの表示比率は同じになります。
実際、dp の利点は主に、サイズが同じで解像度が異なるデバイスの適応効果に反映されます。サイズや解像度が異なるデバイスの場合、dp の適応効果は十分ではありません。
例えば。
画面解像度が 1080 * 2670 で、画面サイズが 6 インチ (dpi は約 480) のデバイス用に設計された UI デザインを想定すると、計算により、UI ダイアグラム内のデバイス画面の最大幅は 360 dp になります。 .
しかし、画面解像度が 1080 * 1920 で、画面サイズが 5 インチ (dpi は約 440) のデバイスの場合、計算すると、
その画面幅は実際には1080 / (440/160) = 392.7 dp
、
つまり、画面は設計図よりも広いです。
この場合、dp を使用しても同じ効果を別のデバイスで表示することはできません. 同時に、画面幅が 360 dp 未満のデバイスがまだいくつかあります. 現時点では、それに応じた開発につながります.幅は 360 dp ですが、実際の表示は不完全です。
概要: 画面適応には dp ネイティブ ソリューションのみを使用してください。適応性は非常に低く、このソリューションはお勧めしません。
sw 修飾子適応スキーム
sw 修飾子適応は、最小幅修飾子適応とも呼ばれる、smallestWidth 適応です。
その原理は、Android が利用可能な画面の高さと幅の最小サイズの dp 値を識別し、識別された結果资源文件
に従って修飾子に対応するフォルダーの下のリソース ファイルを検索することです。実際、システムは特定のルールに従って対応するファイルを選択します。
例えば。
携帯電話の画面解像度は 1080 * 1920 で、画面のピクセル密度は 480 dpi です.計算により、
その最大幅に対応する dp 値は次のとおりです。1080 / (480 / 160) = 360 dp
この360 dp
値、システムはvalue-sw360dp
フォルダと対応するリソース ファイルを探して使用します。
value-sw360dp
フォルダがない場合、システムは下を見て、たとえば 360 dp に最も近いものだけを検索しvalue-sw350dp
、Android はvalue-sw350dp
フォルダ。
一般的に言えば、value-swXXXdp フォルダーは/src/main/res/
、value-sw480dp
私のプロジェクトで作成されたフォルダーなどの directory の下に作成されます。
これらのフォルダを作成する前に、事前に基準サイズを設定する必要があります.一般的には、UI設計図で使用される最大幅に対応するdp値を基準dp値として使用します.たとえば、360 dpを使用します.次のようなベースライン リソース ファイルを見てみましょう/src/main/res/value/dimens.xml
。
次に、value-sw480dp
フォルダーを作成し、その中にdimens.xml
ファイル。
では、このデータはどのように計算されるのでしょうか? もちろん、これもベンチマーク サイズに基づいて計算されます。
たった今:dp_2 = (480 / 基准) x 2 = (480 / 360) x 2 = 2.6667 dp
この適応スキームはフォールト トレランス率が低く、その欠点は非常に侵入的であり、異なるモデルの最大幅 dp に応じて複数のフォルダーを作成する必要があり、メンテナンス コストが比較的高いことです。
使用するより明らかに適していますdp 原生方案
。sw 限定符适配方案