android px를 dp, sp로 변환하는 결론
13818 단어 문제 레코드
안드로이드가 가지고 있는 도구류를 통해 역방향으로 유도되는 도구류가 있습니다.
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를 알고 이 방법을 적용하면 된다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ROS 해결 캣킨make 시 cmake error Invoking "cmake"failed홈페이지 레슨대로 할 때 캣킨make 명령 타임즈 오류CMakeLists.txt:52 (find_package) Configuring incomplete, errors occurred! See also "/home/...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.