android px를 dp, sp로 변환하는 결론

13818 단어 문제 레코드
최근에 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 마크업 맵에 컨트롤 너비가 100px이면
                   100/768 * 1200/2.25 = 69.444
그래서 저는 69.444dp를 쓸 수 있어요.
하지만!!!
만약 장치를 바꾸면 2048*1536으로 바꾸고 화면 밀도와 dpi를 모두 바꾸면 69.444는 틀림없이 적합하지 않을 것이다. 바꾸면 어떻게 하지?서두르지 마...
이것은 최소 화면 너비에 사용됩니다. 최소 화면 너비의 단위는 dp입니다. 그러면 최소 화면 너비는 어떻게 계산합니까?
        dp = 160 *      / dpi

그리고 위의 그 예를 들어 내 장치의 최소 화면 너비는
    160 * 1200/360 = 533.333 dp
그래서res 아래에 폴더values-sw533dp나values-sw530dp를 만들 수 있습니다. 계산된 최소 화면 너비보다 작으면 됩니다. 왜 최소 화면 너비보다 작을까요?시스템이 크고 작기 때문에...스캔해 보세요.만약에values-sw550dp로 만들어진 폴더가 553.333에 불과하고 550에 이르지 못하면 자동으로 작은 단계로 진입하고, 이미 가장 작은 폴더라면 시스템의 기본적인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를 알고 이 방법을 적용하면 된다.

좋은 웹페이지 즐겨찾기