setWidth (int pixels)는 dip 또는 px를 사용합니까?


답변:


222

픽셀을 사용하지만 대신 딥을 사용하는 방법이 궁금합니다. 대답은에 TypedValue.applyDimension()있습니다. 다음은 코드에서 딥을 px로 변환하는 방법의 예입니다.

// Converts 14 dip into its equivalent px
Resources r = getResources();
int px = Math.round(TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_DIP, 14,r.getDisplayMetrics()));

64
또한 nbDips가의 GetResources () * 호출 할 수 있습니다 getDisplayMetrics ()를 밀도..
로맹 가이

9
사실 이것이 바로 TypedValue.applyDimension ()이하는 일입니다. 나는 그것을 게시하는 것을 고려했지만, 어떤 것이 변경 될 경우에 대비하여 API를 사용하는 것을 좋아합니다. 괜찮다면 그 방법을 사용하는 것이 안전하다고 생각합니다. :)
Dan Lew

12
applyDimension () 버전은 더 많은 코드를 실행하고 내가 찾은 것을 읽는 것이 조금 더 어렵습니다. FWIW, 제가 게시 한 라인은 우리가 프레임 워크와 표준 앱에서 실제로 사용하는 것입니다.
Romain Guy

1
안녕하세요, 위의 두 가지 예를 시도했지만 픽셀을 올바르게 계산하지 못하는 것 같습니다. 대신 내 뷰에서 지정한 정확한 값을 반환합니다. 내 경우에는 android : layout_width = "50dip"입니다. xml 파일에서 정확한 값을 50 반환합니다. 그런 다음 앱에서 이것을 확인했고 예상대로 값이 올바르지 않고 예상보다 너무 큰보기를 그립니다
Jonathan

px에서 pt로 변환하는 유일한 해결책은 매우 좋습니다.
A-Live

24

코드에서 일정한 수의 DIP를 얻는 올바른 방법은 다음과 같이 dp 값을 포함하는 리소스 XML 파일을 만드는 것입니다.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="image_width">100dp</dimen>
    <dimen name="image_height">75dp</dimen>
</resources>

그런 다음 다음과 같이 코드의 리소스를 참조하십시오.

float width = getResources().getDimension(R.dimen.image_width));
float height = getResources().getDimension(R.dimen.image_height));

반환 한 부동 소수점은 장치의 픽셀 밀도에 따라 크기가 조정되므로 응용 프로그램 전체에서 변환 방법을 계속 복제 할 필요가 없습니다.


제 상황에서이 솔루션은 목록보기가있는 사용자 지정 대화 상자가 있고 ListView의 헤더 레이블 및 열 너비를 동일한 너비로 설정하려는 경우에 가장 잘 작동합니다.
Wayne Phipps

당신의 첫 번째 문장은 약간 웃기지 만, 기본적으로 XML 파일을 만드는 것이 "코드에서 [뭔가]를 지정" 하는 적절한 방법이라고 말하는 것입니다 . 그럼 난 당신이 단지 :)를 지정하지 않는 코드에서 상수를 사용하고 생각
조 프리

나는 약간 표현을 업데이트했습니다 있도록 @Joffrey 그래, 난 당신이 무슨 뜻인지 볼
SDJMcHattie

7

메서드 setWidth (100), 100px를 width (dp가 아님)로 설정합니다. 따라서 다른 안드로이드 폰에서 너비가 다양한 문제에 직면 할 수 있으므로 픽셀 대신 dp로 측정을 사용하십시오. 아래 코드를 사용하여 샘플 너비의 dp로 측정하십시오. = 300px 및 height = 400px.

int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, getResources().getDisplayMetrics());

int Height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 400, getResources().getDisplayMetrics());


0

물론 픽셀은 픽셀을 매개 변수로 요구합니다.


1
레이아웃 xml 파일에있는 경우 android : layout_width = "100dip"또는 android : layout_width = "100px"를 지정할 수 있습니다. 소스 코드에서 레이아웃의 너비를 100dip으로 지정할 수 없습니까?
user256239 2010 년

직접적으로가 아니라 DisplayMetrics.density를 사용하여 자신을 변환해야합니다.
Romain Guy

0

나에게 잘 작동하는 위의 답변을 기반으로 몇 가지 도우미 메서드를 생성하고 유틸리티에 추가하여 전체 프로젝트에서 사용하십시오.

   // value in DP
   public static int getValueInDP(Context context, int value){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
    }

    public static float getValueInDP(Context context, float value){
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
    }

    // value in PX
    public static int getValueInPixel(Context context, int value){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
    }

    public static float getValueInPixel(Context context, float value){
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.