android pxからdp,spへの変換に関する結論
13737 ワード
最近px変換dp,spのシールをたくさん見て、いろいろな方法を見ました.
アンドロイドが持参したツールクラスから逆方向に導出したツールクラスがあります
UIによって画像の幅の広い画素とスクリーンサイズを設計し、数式を組み合わせて計算することもあります.
待って待って.....
最後に、コントロールの高さを測定してログを印刷することで、これらの方法は正確ではないことがわかりました.
次のように計算できます.
1、UIを探して作図時の幅と高さの画素を尋ねる
2、コードによってデバイスの密度、dpiと幅を取得する
3、dp=(UI標的px/UI作図の幅)*デバイスの幅/スクリーン密度
例を挙げると、UIは1024*768を基準にした図で、私のデバイスは1920*1200で、画面密度は2.25で、dpiは360です.
UIの寸法図には、幅が100 pxのコントロールがあります.
100/768 * 1200/2.25 = 69.444
だから69.444 dpを書くことができます
でも!!!
もし設備を変えたら、2048*1536に変えて、スクリーン密度とdpiを変えたら、69.444はきっと適切ではありません.どうすればいいですか.急がないで...
これは最小スクリーン幅を使い、最小スクリーン幅の単位はdpですが、最小スクリーン幅はどのように計算しますか?
私のデバイスの最小画面幅は
160 * 1200/360 = 533.333 dp
だから私はresの下にフォルダvalues-sw 533 dpあるいはvalues-sw 530 dpを建てることができて、計算した最小スクリーン幅以下であればいいのに、どうして最小スクリーン幅以下であるのですか?システムが大きいから小さいまで...スキャンしましょう.作成したフォルダがvalues-sw 550 dpの場合、デバイスは553.333しかなく、550に達しないと自動的に1級小さくなり、すでに最小であればシステムデフォルトのvaluesフォルダ内の内容を使用します.
フォルダを作成して下にdimenを作成します.xmlのファイル、内容は大体
ここでpxをdpに変換する問題を解決しました.pxをspに変換するのはこの方法と同じで、dpをspに変えるだけでいいです.
異なるスクリーンの適合を行うには、そのスクリーンの幅、スクリーン密度、スクリーンdpiを知る必要があります.そして、この方法を適用すればいいです.
アンドロイドが持参したツールクラスから逆方向に導出したツールクラスがあります
public class UnitUtils {
// dip px
public static int dp2px(Context context, int dip) {
float scale = context.getResources().getDisplayMetrics().density;
return (int) (dip * scale + 0.5f * (dip >= 0 ? 1 : -1));
}
// px dip
public static int px2dp(Context context, int px) {
float scale = context.getResources().getDisplayMetrics().density;
return (int) (px / scale + 0.5f * (px >= 0 ? 1 : -1));
}
public static int sp2px(Context context, float spValue) {
float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
public static int px2sp(Context context, float pxValue) {
float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
}
UIによって画像の幅の広い画素とスクリーンサイズを設計し、数式を組み合わせて計算することもあります.
待って待って.....
最後に、コントロールの高さを測定してログを印刷することで、これらの方法は正確ではないことがわかりました.
次のように計算できます.
1、UIを探して作図時の幅と高さの画素を尋ねる
2、コードによってデバイスの密度、dpiと幅を取得する
DisplayMetrics metrics = this.getResources().getDisplayMetrics();
float density = metrics.density; //
int dpi = metrics.densityDpi; // dpi
int widthPixels = metrics.widthPixels; //
3、dp=(UI標的px/UI作図の幅)*デバイスの幅/スクリーン密度
例を挙げると、UIは1024*768を基準にした図で、私のデバイスは1920*1200で、画面密度は2.25で、dpiは360です.
UIの寸法図には、幅が100 pxのコントロールがあります.
100/768 * 1200/2.25 = 69.444
だから69.444 dpを書くことができます
でも!!!
もし設備を変えたら、2048*1536に変えて、スクリーン密度とdpiを変えたら、69.444はきっと適切ではありません.どうすればいいですか.急がないで...
これは最小スクリーン幅を使い、最小スクリーン幅の単位はdpですが、最小スクリーン幅はどのように計算しますか?
dp = 160 * / dpi
私のデバイスの最小画面幅は
160 * 1200/360 = 533.333 dp
だから私はresの下にフォルダvalues-sw 533 dpあるいはvalues-sw 530 dpを建てることができて、計算した最小スクリーン幅以下であればいいのに、どうして最小スクリーン幅以下であるのですか?システムが大きいから小さいまで...スキャンしましょう.作成したフォルダがvalues-sw 550 dpの場合、デバイスは553.333しかなく、550に達しないと自動的に1級小さくなり、すでに最小であればシステムデフォルトのvaluesフォルダ内の内容を使用します.
フォルダを作成して下にdimenを作成します.xmlのファイル、内容は大体
9.856sp
10.841sp
11.827sp
12.813sp
13.798sp
14.784sp
は私が書いた方法で書くことができます. int width = 1200;//ui
DisplayMetrics metrics = this.getResources().getDisplayMetrics();
float density = metrics.density; //
int dpi = metrics.densityDpi; // dpi
int widthPixels = metrics.widthPixels; //
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("
");
for (int px = 0; px <= 200; px += 2) {
String dp = px * 1.0 * widthPixels / width / density + "";
if (dp.indexOf(".") + 4 < dp.length()) {// 3
dp = dp.substring(0, dp.indexOf(".") + 4);
}
stringBuilder.append("").append(dp).append("dp
");
}
stringBuilder.append(" ");
Log.e("tag", stringBuilder.toString());
印刷結果は
0.0dp
0.888dp
1.777dp
2.666dp
3.555dp
4.444dp
5.333dp
6.222dp
7.111dp
8.0dp
8.888dp
9.777dp
10.666dp
11.555dp
12.444dp
13.333dp
14.222dp
15.111dp
16.0dp
16.888dp
17.777dp
18.666dp
19.555dp
20.444dp
21.333dp
22.222dp
23.111dp
24.0dp
24.888dp
25.777dp
26.666dp
27.555dp
28.444dp
29.333dp
30.222dp
31.111dp
32.0dp
32.888dp
33.777dp
34.666dp
35.555dp
36.444dp
37.333dp
38.222dp
39.111dp
40.0dp
40.888dp
41.777dp
42.666dp
43.555dp
44.444dp
45.333dp
46.222dp
47.111dp
48.0dp
48.888dp
49.777dp
50.666dp
51.555dp
52.444dp
53.333dp
54.222dp
55.111dp
56.0dp
56.888dp
57.777dp
58.666dp
59.555dp
60.444dp
61.333dp
62.222dp
63.111dp
64.0dp
64.888dp
65.777dp
66.666dp
67.555dp
68.444dp
69.333dp
70.222dp
71.111dp
72.0dp
72.888dp
73.777dp
74.666dp
75.555dp
76.444dp
77.333dp
78.222dp
79.111dp
80.0dp
80.888dp
81.777dp
82.666dp
83.555dp
84.444dp
85.333dp
86.222dp
87.111dp
88.0dp
88.888dp
ここでpxをdpに変換する問題を解決しました.pxをspに変換するのはこの方法と同じで、dpをspに変えるだけでいいです.
異なるスクリーンの適合を行うには、そのスクリーンの幅、スクリーン密度、スクリーンdpiを知る必要があります.そして、この方法を適用すればいいです.