android pxからdp,spへの変換に関する結論

13737 ワード

最近px変換dp,spのシールをたくさん見て、いろいろな方法を見ました.
アンドロイドが持参したツールクラスから逆方向に導出したツールクラスがあります
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を知る必要があります.そして、この方法を適用すればいいです.