픽셀을 dp로 변환 팬택 장치 인 픽셀의 높이와 너비를 사용하여

해상도가 팬택 장치 인 픽셀의 높이와 너비를 사용하여 응용 프로그램을 만들었습니다 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( 120dpi)
  • 1.0켜기 mdpi( 160dpi; 기준선)
  • 1.5켜기 hdpi( 240dpi)
  • 2.0켜기 xhdpi( 320dpi)
  • 3.0켜기 xxhdpi( 480dpi)
  • 4.0켜기 xxxhdpi( 640dpi)

온라인 변환기 를 사용 하여 dpi 값으로 재생 하십시오 .

편집 : dpibucket과와 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와 같습니다.