-anydpi와 -nodpi의 차이점은 무엇입니까?


108

Android Studio 1.5.0에서 Vector Asset 마법사를 사용하는 경우 해당 마법사를 사용하여 가져온 모든 벡터 드로어 블 XML은 res/drawable/.

그러나 build/디렉토리와 결과 APK는 해당 XML 파일이 res/drawable-anydpi-v21/리소스 디렉토리 로 이동되었음을 보여줍니다 . 이 -v21부분은 VectorDrawableAPI 레벨 21 이상에서만 지원 되므로 의미 가 있습니다. 그러나 -anydpi문서화되지 않은 것 같습니다. -nodpi원래 가져 오기 대상과 빌드 시스템이 이동하도록 선택한 위치 모두에 대해 예상했을 것입니다.

누가 -anydpi의미하고 그 관계가 무엇인지에 대한 공식적인 진술을 본 사람 이 -nodpi있습니까? 일부 코드 주석이 암시하는 것만이 아니라 실용적인 효과를 찾고 있습니다.


답변:


106

Nodpi

이들은 밀도에 독립적 인 리소스입니다. 시스템은 현재 화면의 밀도에 관계없이이 한정자로 태그가 지정된 리소스를 확장하지 않습니다.

예를 들면 :

  • drawable- nodpi /dot.png

점은 xxhdpi에서는 작게 표시되고 ldpi에서는 크게 표시됩니다.

그러나 리소스 확인자는 존재하는 경우 특정 한정자와 일치합니다.

예를 들어

  • drawable- hdpi에 /eg.png
  • drawable- nodpi -v21 / eg.xml

Lollipop (API 21) hdpi 장치에서는 비트 맵 이 사용됩니다.

Lollipop (API 21) xhdpi 장치에서는 벡터가 사용됩니다.

anydpi

이러한 리소스는 모든 dpi에서 우선합니다.

예를 들어

  • drawable- hdpi에 /eg.png
  • 드로어 블 -anydpi -v21 / eg.xml

Lollipop (API 21) hdpi 장치에서는 벡터 가 사용됩니다.

Lollipop (API 21) xhdpi 장치에서는 벡터가 사용됩니다.

참고

참고 : anydpi는 Ic3288d0236fe0bff20bb1599aba2582c25b0db32 변경 에 추가되었습니다 .


그것은 내가보고있는 것이 아닙니다. 내 현상금을 인용하면 : "res / drawable-nodpi / 및 res-drawable-mdpi /에 동일한 리소스의 두 버전이있는 경우 Android 6.0을 실행하는 Nexus 5에서 res / drawable-nodpi / 버전을 얻습니다. 이는 -xxhdpi입니다. 장치". 당신이 인용하는 행동을 보여주는 샘플 프로젝트가 있습니까?
CommonsWare

당신이 사용하기 때문이다 drawable. SDK의 bahaviour가 변경되었을 수 있습니다. VectorDrawable : Android가 벡터 리소스 대신 xhdpi PNG로드를
rds dec.

"그건 드로어 블을 사용했기 때문입니다."-대답도 마찬가지입니다. 답변에서 인용 한 모든 단일 리소스 디렉토리 drawabledrawable리소스 디렉토리입니다. 바운티에서 인용 한 두 디렉토리가 모두 리소스 디렉토리 인 것처럼 .
CommonsWare

"xxxdpi에서 프레임 워크는 hdpi 비트 맵을 사용합니다." -내 테스트가 -xxhdpi장치 에서 이루어 지지만 그것은 구체적으로 일어나지 않는 것입니다 . 나는 res/drawable-mdpi/nodpi_and_m.pngres/drawable-nodpi/nodpi_and_m.xml. Nexus 5, -xxhdpi기기에서 사용되는 리소스는 res/drawable-nodpi/nodpi_and_m.xml입니다. 알고리즘과 내 기대에 따라 res/drawable-mdpi/nodpi_and_m.png사용해야합니다. 그것은 일어나고있는 것이 아닙니다.
CommonsWare

2
결론 : 벡터를 drawable-anydpi-v21. support-vector-drawable 라이브러리가있는 경우 drawable-anydpi또는 간단히 drawable.
rds

17

소스 코드는 다음과 같은 의견 (라인 639)를 포함 :

/**
 * Value for {@link #densityDpi} for resources that scale to any density (vector drawables).
 * {@hide}
 */
public static final int DENSITY_DPI_ANY = 0xfffe;

/**
 * Value for {@link #densityDpi} for resources that are not meant to be scaled.
 * {@hide}
 */
public static final int DENSITY_DPI_NONE = 0xffff;

이것이 혼란을 없애기를 바랍니다.


8
"혼란이 해결되기를 바랍니다."-실제로는 아닙니다. 실제로 "모든 밀도로 확장"과 "확장되지 않음"의 차이가 무엇인지는 명확하지 않습니다. 에서 드로어 블 -nodpi디렉토리는 가장 확실하게 확장 드로어 블을 사용하는 방법은 장소에 어떤 규칙에 따라, 크기에 따라 얻을.
CommonsWare

"확장되지 않음"은 프로그래머가 수행하는 작업이나 밀도에 관계없이 확장되지 않음을 의미합니다.
Vishavjeet Singh 2015

밀도가 아무리 커도 모든 밀도 에 맞게 크기가 조정 되는 벡터 드로어 블을 가리키는 "모든 밀도로 크기 조정"이라는 문구를 의미한다고 생각 합니다.
Vishavjeet Singh 2015

3
android.googlesource.com/platform/frameworks/base/+/31245b4%5E 에 추가되었습니다 ! 그리고 그것에서 당신은 아마 몇 가지 버그 17007265 고정 배울 수 있습니다
marcinj

1
@ MarcinJędrzejewski : 사실, "정확히 요청 된 밀도와 일치하는 구성이없는 한 최상의 일치로 선택됩니다."해당 커밋에 대한 주석이 단서를 제공합니다. 감사!
CommonsWare

10

nodpi: 모든 밀도에 대한 리소스입니다. 이들은 밀도에 독립적 인 리소스입니다. 시스템은 현재 화면의 밀도에 관계없이이 한정자로 태그가 지정된 리소스를 확장하지 않습니다.

anydpi:이 한정자는 모든 화면 밀도와 일치하며 다른 한정자보다 우선합니다. 이것은 벡터 드로어 블에 유용합니다. API 레벨 21에 추가되었습니다.


9

나는 내 게임을위한 많은 큰 그래픽을 포함하여 모든 것에 drawable-nodpi를 사용합니다. 그래픽 확장의 문서화되지 않은 결과 중 하나는 메모리 사용이 기하 급수적으로 증가한다는 것입니다. 따라서 드로어 블에 1MB 그래픽이있는 경우 사용자 장치의 해상도에 따라 4MB, 16MB 또는 64MB로 조정됩니다. 그리고 장치 해상도는 계속 올라갑니다. 물론 이러한 확장이 실제로 그래픽의 선명도를 높이는 것은 아닙니다. 그리기 작업은 어쨌든 여러 그리기 폴더로 앱을 부 풀릴 필요없이 화면 크기와 관련하여 각 그래픽의 크기를 지시 할 수 있습니다.


3
과소 평가 된 답변. 같은 문제가 발생했습니다. 이미지가 100KB가 크지 만로드 할 때 자주 OOM 오류가 발생했습니다. 앱이 18MB를 할당 할 수 없다는 내용으로 충돌했습니다 !!! 이 100KB가 어떻게 18MB로 바뀔 수 있는지 이해할 수 없었지만 실제로는 그 확장의 결과였습니다. 이미지를 no-dpi로 전환하면 문제가 해결되었습니다.
Simon Ninon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.