해상도가 팬택 장치 인 픽셀의 높이와 너비를 사용하여 응용 프로그램을 만들었습니다 480x800
.
G1 장치의 높이와 너비를 변환해야합니다.
dp로 변환하면 문제를 해결하고 두 장치에 동일한 솔루션을 제공 할 것이라고 생각했습니다.
픽셀을 DP로 변환하는 쉬운 방법이 있습니까?
어떤 제안?
답변
// Converts 14 dip into its equivalent px
float dip = 14f;
Resources r = getResources();
float px = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
dip,
r.getDisplayMetrics()
);
답변
/**
* This method converts dp unit to equivalent pixels, depending on device density.
*
* @param dp A value in dp (density independent pixels) unit. Which we need to convert into pixels
* @param context Context to get resources and device specific display metrics
* @return A float value to represent px equivalent to dp depending on device density
*/
public static float convertDpToPixel(float dp, Context context){
return dp * ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}
/**
* This method converts device specific pixels to density independent pixels.
*
* @param px A value in px (pixels) unit. Which we need to convert into db
* @param context Context to get resources and device specific display metrics
* @return A float value to represent dp equivalent to px value
*/
public static float convertPixelsToDp(float px, Context context){
return px / ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}
답변
바람직하게는 Util.java 클래스에 넣습니다.
public static float dpFromPx(final Context context, final float px) {
return px / context.getResources().getDisplayMetrics().density;
}
public static float pxFromDp(final Context context, final float dp) {
return dp * context.getResources().getDisplayMetrics().density;
}
답변
float density = context.getResources().getDisplayMetrics().density;
float px = someDpValue * density;
float dp = somePxValue / density;
density
같다
.75
켜기ldpi
(120
dpi)1.0
켜기mdpi
(160
dpi; 기준선)1.5
켜기hdpi
(240
dpi)2.0
켜기xhdpi
(320
dpi)3.0
켜기xxhdpi
(480
dpi)4.0
켜기xxxhdpi
(640
dpi)
이 온라인 변환기 를 사용 하여 dpi 값으로 재생 하십시오 .
편집 : dpi
bucket과와 1 : 1 관계가없는 것 같습니다 density
. Nexus 5X
존재 xxhdpi
는의 density
값이 2.625
아닌 것 같습니다 3
. 장치 메트릭 에서 직접 확인하십시오 .
답변
Context없이 이것을 사용할 수 있습니다.
public static int pxToDp(int px) {
return (int) (px / Resources.getSystem().getDisplayMetrics().density);
}
public static int dpToPx(int dp) {
return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}
@Stan이 언급했듯이 ..이 방법을 사용하면 시스템의 밀도가 변경되면 문제가 발생할 수 있습니다. 그러니 알아 두세요!
개인적으로 나는 그것을하기 위해 컨텍스트를 사용하고 있습니다. 내가 당신과 공유하고 싶었던 또 다른 접근법 일뿐입니다.
답변
XML 크기를 사용할 수 있다면 매우 간단합니다!
당신의 res/values/dimens.xml
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="thumbnail_height">120dp</dimen>
...
...
</resources>
그런 다음 Java에서 :
getResources().getDimensionPixelSize(R.dimen.thumbnail_height);
답변
안드로이드 개발 가이드에 따르면 :
px = dp * (dpi / 160)
그러나 종종 픽셀로 표시된 디자인을받을 때 다른 방법으로이 작업을 수행하려고합니다. 그래서:
dp = px / (dpi / 160)
240dpi 장치를 사용하는 경우이 비율은 1.5 (이전에 언급 한 것처럼)이므로 응용 프로그램에서 60px 아이콘이 40dp와 같습니다.