dp 단위로 프로그래밍 방식으로 Android 및 너비 및 높이 설정


304

나는 일을 해요:

button.setLayoutParams(new GridView.LayoutParams(65, 65));

문서에 따르면 너비와 높이의 단위 (위의 65 개 모두)는 "픽셀"입니다. 이것을 장치 독립적 픽셀 또는 "dp"로 설정하려면 어떻게합니까?

답변:


541

디스플레이 배율을 사용하여 dps에서 픽셀로 변환해야합니다.

final float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scale + 0.5f);

111
올바른 변환은 (int) (dps * scale + 0.5f)입니다. 이것이 우리가 프레임 워크 전체에서 사용하는 공식입니다.
Romain Guy

8
수식은 문서에 있습니다. 자세한 내용은 developer.android.com/guide/practices/…
SK9

34
@RomainGuy, 당신은에서 변환하는 API에 유틸리티 기능을 추가하시기 바랍니다 수 dppx? 감사.
AlikElzin-kilaka

3
여기에 dps는 무엇입니까? "dps를 변수로 해석 할 수 없습니다"오류가 발생합니까? 어떤 유형의 "dps"를 선언해야합니까?
Deepak

5
"dps"변수는 변환하려는 입력 값입니다.
Robby Pond

233

나는 이것이 오래된 질문이라는 것을 알고 있지만이 전환을 수행하는 훨씬 더 깔끔한 방법을 찾았습니다.

자바

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());

코 틀린

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65f, resources.displayMetrics)

8
이 작업을 수행하는 방법을 찾기 위해 잘했습니다. 나는 여러 곳에서 공식을 반복하는 팬이 아닙니다! 감사.
darrenp

2
그렇지 않다면 공식으로 함수를 작성하십시오
Sayka

1
@Kenobi DP에서 PX로 변환합니다. 은 65위의 당신이 PX로 전환시키려는 DP 값입니다
drspaceboo

7
이 숫자 (0.5)가 어디
에서나

1
@ Johny19 0.5는 마법이 아닙니다. 부동 소수점 숫자를 잘라내는 대신 가장 가까운 정수로 반올림하는 방법입니다. 자세한 내용은 Robby Pond의 답변에 대한 내 의견을 참조하십시오.
MarredCheese

38

요구 사항을 살펴보면 대체 솔루션도 있습니다. 컴파일 타임에 dp의 크기를 알고 있으므로 리소스에 dimen 항목을 추가 할 수 있습니다. 그런 다음 dimen 항목을 쿼리하면이 호출에서 자동으로 픽셀로 변환됩니다.

final float inPixels= mActivity.getResources().getDimension(R.dimen.dimen_entry_in_dp);

그리고 dimens.xml에는 다음이 있습니다.

<dimen name="dimen_entry_in_dp">72dp</dimen>

이 아이디어를 확장하면 1dp 또는 1sp의 값을 dimen 항목으로 저장하고 값을 쿼리하여 승수로 사용할 수 있습니다. 이 방법을 사용하면 수학 자료에서 코드를 격리하고 라이브러리를 사용하여 계산을 수행합니다.


반환 값은 실제로 int이므로 float로 캐스팅됩니다.
CorayThan

이것은 역동적 인 운임이기 때문에 잘못된 답변입니다
Johny19

37

테스트 된 가장 간단한 방법 (및 API 1에서도 작동)은 다음과 같습니다.

getResources().getDimensionPixelSize(R.dimen.example_dimen);

설명서에서 :

원시 픽셀의 크기로 사용하기 위해 특정 자원 ID의 차원을 검색하십시오. 이것은 반환 값이 정수 픽셀로 변환되어 사이즈로서 사용되는 것을 제외하고는 getDimension (int)와 같습니다. 크기 변환은 기본 값을 반올림하고 0이 아닌 기본 값이 적어도 하나의 픽셀 크기인지 확인합니다.

예, 값을 반올림하지만 그리 나쁘지는 않습니다 (hdpi 및 ldpi 장치의 홀수 값에서만 ldpi가 그리 일반적이지 않은 경우 약간의 값을 추가해야 함) 4dp를 16 (픽셀)로 변환하는 xxhdpi 장치에서 테스트했으며 진실.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.