소스 코드의 res / values ​​/ dimension.xml에서 차원 값로드


337

값을 그대로로드하고 싶습니다. 나는이 개있는 dimension.xml파일 하나 /res/values/dimension.xml와의 다른 하나를 /res/values-sw360dp/dimension.xml.

소스 코드에서 다음과 같은 작업을 수행하고 싶습니다.

getResources().getDimension(R.dimen.tutorial_cross_marginTop);

이것은 작동하지만 얻을 수있는 값은 화면 밀도 계수 (hdpi의 경우 1.5, xhdpi의 경우 2.0 등)를 곱한 값입니다.

나는 또한 시도했다

getResources().getString(R.dimen.tutorial_cross_marginTop);

이것은 원칙적으로 작동하지만 "dip"로 끝나는 문자열을 얻습니다 ...


1
이 자료는 메소드가 안드로이드에 버그가 있는지 궁금해 getDimensionPixelSize(int id)정확히 그래서, 그것은 픽셀에 반환한다고 것을 getDimension(int id)보기로 예를 들면, 사용할 준비가 될 것이라고, DP (종속 독립적 인 단위)에 반환해야합니다setPadding
폴 Verest

답변:


811

내 dimens.xml에는

<dimen name="test">48dp</dimen>

코드에서 내가하는 경우

int valueInPixels = (int) getResources().getDimension(R.dimen.test)

이것은 문서 상태에 현재 전화 밀도 (제 경우 48dp x 1.5)를 곱한 72를 반환합니다.

문서 상태 그대로 :

특정 자원 ID의 차원을 검색하십시오. 단위 변환은 리소스와 관련된 현재 DisplayMetrics를 기반으로합니다.

따라서 XML에서와 같이 정확한 dp 값을 원하면 DisplayMetrics 밀도로 나누십시오.

int dp = (int) (getResources().getDimension(R.dimen.test) / getResources().getDisplayMetrics().density)

dp는 48이됩니다


3
나는 여기에서 설명서가 특히 불분명하다고 생각합니다. "단위 변환은 자원과 관련된 현재 DisplayMetrics를 기반으로합니다." 그들이 말하고 싶은 것은 픽셀로 변환한다는 것입니다.
Trilarion

본질적으로 디스플레이 측정 항목 승수를 삭제하려는 경우 치수를 px로 정의 할 수도 있습니다. <dimen name = "test"> 48px </ dimen>. getDimension (R.dimen.test)은 48을 반환합니다.
Michael Peterson

나를 위해 작동하지 않습니다 : stackoverflow.com/questions/55972518/…
Alex

@Trilarion 그들은 단순히 픽셀로 변환하지 않습니다. 그들은 dp그것을 찾는 데 사용되는 자원 객체의 스케일에 비례하여 스케일 된 픽셀 값을 줄 것이라고 말하고 있습니다. 자원을 얻기 위해 다양한 방법으로 들어가면 더 관련이 있습니다. 간단하게하기 위해 화면 크기와 관련된 것으로 생각할 수 있습니다. 이 또한 sp, 또는 시스템 텍스트 크기를 기준으로 픽셀하고 px, 직접 픽셀. 각각은 다르며 목적이 다릅니다.
버려진 카트


17

Resource클래스에는 getDimensionPixelSize () 메소드도 있습니다 .


24
이것은 잘못이다! 또한 않습니다 메트릭 변환이 발생 getDimensionPixelSize()하면이 문서를 참조 할 경우 명확하게 진술 반환 Resource dimension value multiplied by the appropriate metric and truncated to integer pixels.
무하마드 바바에게

이것은 잘못이다. 이 방법을 사용하여 메트릭 변환이 발생합니다.
Michael Peterson

14

int리소스에 가치 를 저장해야하는 사람들을 위해 다음을 수행 할 수 있습니다.

integers.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="default_value">100</integer>
</resources> 

암호

int defaultValue = getResources().getInteger(R.integer.default_value);

2
이것에 감사합니다. 다른 사람들에게는 그렇지 않더라도 찾고자하는 것이 더
많았지 만이

11

getDimension 대신 getDimensionPixelOffset ()을 사용할 수 있으므로 int로 캐스트 할 필요가 없습니다.

int valueInPixels = getResources().getDimensionPixelOffset(R.dimen.test)


2
    This works but the value I get is multiplied times the screen density factor
  (1.5 for hdpi, 2.0 for xhdpi, etc).

나는 해상도에 따라 가치를 얻는 것이 좋다고 생각하지만 이것을 원하지 않는다면 이것을 px로 제공하십시오 ....

밀도 독립적 픽셀 (dp)

UI 레이아웃을 정의 할 때 레이아웃 크기를 나타내거나 밀도 독립적 인 방식으로 위치를 지정하는 데 사용해야하는 가상 픽셀 단위입니다. 밀도 독립적 인 픽셀은 160dpi 화면에서 하나의 물리적 픽셀과 같습니다. 이는 "중간"밀도 화면에 대해 시스템에서 가정 한 기준 밀도입니다. 런타임시 시스템은 필요에 따라 dp 단위의 모든 스케일링을 투명하게 처리 based on the actual density of the screen in use. The conversion of dp units to screen pixels is simple: px = dp * (dpi / 160). For example, on a 240 dpi screen, 1 dp equals 1.5 physical pixels.합니다. 응용 프로그램의 UI를 정의 할 때 항상 dp 단위를 사용하여 밀도가 다른 화면에 UI를 올바르게 표시해야합니다.

나는 해상도에 따라 값을 변경하는 것이 좋다고 생각하지만 이것을 원하지 않으면 이것을 px로 제공하십시오 ....

링크를 참조하십시오

이것에 따라

dp

밀도 독립적 픽셀-화면의 물리적 밀도를 기반으로하는 추상 단위입니다. 이 단위는 160dpi (dots per inch) 화면과 관련이 있으며 1dp는 대략 1px입니다.When running on a higher density screen, the number of pixels used to draw 1dp is scaled up by a factor appropriate for the screen's dpi. Likewise, when on a lower density screen, the number of pixels used for 1dp is scaled down.dp 대 픽셀의 비율은 화면 밀도에 따라 변경되지만 반드시 직접 비율로 변경되지는 않습니다. px 단위 대신 dp 단위를 사용하면 다양한 화면 밀도에 맞게 레이아웃의보기 크기를 적절하게 조정할 수 있습니다. 다시 말해, 다양한 장치에서 실제 UI 요소 크기에 일관성을 제공합니다.

px

픽셀-화면의 실제 픽셀에 해당합니다. 실제 측정 값은 장치마다 다를 수 있으므로이 측정 단위는 권장하지 않습니다. 각 장치는 인치당 다른 수의 픽셀을 가질 수 있으며 화면에서 사용 가능한 총 픽셀 수를 더 많거나 적을 수 있습니다.


2

Kotlin 확장 기능 사용

이 프로세스를 단순화하기 위해 확장을 추가 할 수 있습니다. context.dp(R.dimen. tutorial_cross_marginTop)Float 값을 얻기 위해 전화 를 걸 수 있습니다.

fun Context.px(@DimenRes dimen: Int): Int = resources.getDimension(dimen).toInt()

fun Context.dp(@DimenRes dimen: Int): Float = px(dimen) / resources.displayMetrics.density

문맥없이 처리하려면 다음을 사용할 수 있습니다 Resources.getSystem().

val Int.dp get() = this / Resources.getSystem().displayMetrics.density // Float

val Int.px get() = (this * Resources.getSystem().displayMetrics.density).toInt()

예를 들어, xhdpi 장치에서 24.dp12.0 12.px을 얻 거나 24를 얻으려면을 사용하십시오.

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