LayoutParams의 높이를 밀도 독립적 픽셀로 프로그래밍 방식으로 설정


123

LayoutParams 의 높이 / 너비 를 밀도 독립 픽셀 (dp) 로 설정하는 방법이 있습니까? 프로그래밍 방식으로 설정하면 높이 / 너비가 dp가 아닌 픽셀 단위 인 것처럼 보입니다.

답변:


271

딥 값을 픽셀로 변환해야합니다.

int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, <HEIGHT>, getResources().getDisplayMetrics());

나를 위해 이것은 트릭입니다.


10
getActivity (). getResources (). getDimension (resourceID)가 올바른 변환 작업을 수행한다고 생각합니다.
StErMi

3
나를 위해 작동하지만 xml을 사용하는 것과 위의 방법을 사용하여 ImageView의 너비 / 높이를 설정하면 다릅니다. XML에서는 위의 방법이 동일한 크기를 생성하기 위해 "75"가 필요하지만 85dp를 설정했습니다. 왜 그런지 아세요?
Dirk

1
@Dirk 프로그래밍 방식으로 설정할 때 패딩 / 여백 문제가있을 수 있습니다 (일반적으로 코드에서 설정할 때 패딩을 직접 지정해야합니다). XML 또는 코드에서 dp를 설정하는 것에는 차이가 없어야합니다.
티아고

11
 public static int getDPI(int size, DisplayMetrics metrics){
     return (size * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT;        
 }

다음과 같이 함수를 호출하십시오.

DisplayMetrics metrics;
metrics = new DisplayMetrics();         
getWindowManager().getDefaultDisplay().getMetrics(metrics);

int heigh = getDPI(height or width, metrics);

그건 ... 정말 틀렸어요. 고정 된 수의 밀도 만 지원하도록 하드 코딩했습니다. 밀도 스케일링 계수로 스케일하려면 developer.android.com/reference/android/util/… 을 곱하면됩니다. 이것은 (size * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT와 동일합니다.
hackbod

1
예, 귀하의 새로운 답변은 합리적입니다. 또는 내가 말했듯이 메트릭스 밀도를 곱하면됩니다. 그것이 바로 그 이유입니다.
hackbod

6

여러 번 사용할 수 있기 때문에 :

public static int convDpToPx(Context context, float dp) {
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
}

일반적으로 하나 이상의 값을 변환해야하므로 변환율을 사용하는 것이 더 실용적이라는 것을 알았습니다. 전환율이 변하지 않기 때문에 약간의 처리 시간이 절약됩니다.

/**
 * Get conversion rate from dp into px.<br>
 * E.g. to convert 100dp: px = (int) (100 * convRate);
 * @param context e.g. activity
 * @return conversion rate
 */
public static float convRateDpToPx(Context context) {
    return context.getResources().getDisplayMetrics().densityDpi / 160f;
}

5

내 스 니펫은 다음과 같습니다.

public class DpiUtils {

    public static int toPixels(int dp, DisplayMetrics metrics) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
    }

}

어디 DisplayMetrics metrics = getResources().getDisplayMetrics()


0

대답 된 솔루션이 저에게 효과가 없었고보기의 높이가 여전히 꺼져있었습니다. 나는 이것으로 끝났고 잘 작동합니다.

protected int dp2px(int dp){
    final float scale = getResources().getDisplayMetrics().density;
    return (int) (dp * scale + 0.5f);
}

그리고 반대로 원하면 픽셀을 dp로 ...

protected float px2dp(float px){
    DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
    float dp = px / (metrics.densityDpi / 160f);
    return Math.round(dp);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.