2015-12-08 47 views
71

Nếu bạn sử dụng trình hướng dẫn Vector nội dung trong Android Studio 1.5.0, mọi XML có thể vẽ vector mà bạn nhập bằng thuật sĩ đó sẽ đi vào res/drawable/.Sự khác biệt giữa -anydpi và -nodpi là gì?

Tuy nhiên, thư mục build/ và APK kết quả cho thấy rằng các tệp XML đó được chuyển vào thư mục tài nguyên res/drawable-anydpi-v21/. Phần -v21 có ý nghĩa, vì VectorDrawable chỉ được hỗ trợ trên Cấp API 21+. Tuy nhiên, -anydpi dường như không có giấy tờ. Tôi đã có thể mong đợi -nodpi, cả hai cho đích nhập ban đầu và cho nơi hệ thống xây dựng chọn để di chuyển nó.

Có ai nhìn thấy tuyên bố chính thức về những gì -anydpi có nghĩa là, và mối quan hệ của nó là gì với -nodpi? Tôi đang tìm kiếm các hiệu ứng thiết thực, không chỉ đơn thuần là những gì một số ý kiến ​​mã gợi ý.

+0

[Đọc tóm tắt riêng của OP tại đây.] (Https://commonsware.com/blog/2015/12/21/nodpi-anydpi-wtf.html) – Suragch

Trả lời

63

nodpi

Đây là những nguồn tài nguyên mật độ độc lập. Hệ thống không quy mô tài nguyên được gắn thẻ với vòng loại này, bất kể mật độ của màn hình hiện tại.

Ví dụ:

  • drawable- nodpi /dot.png

Dấu chấm sẽ xuất hiện nhỏ trên xxhdpi, lớn trên ldpi.

Tuy nhiên, trình phân giải tài nguyên sẽ khớp với một vòng loại cụ thể nếu nó tồn tại.

Ví dụ

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

Trên một Lollipop (API 21) Thiết bị hdpi , bitmap được sử dụng.

Trên thiết bị xSLpi Lollipop (API 21), véc tơ được sử dụng.

anydpi

Các tài nguyên này được ưu tiên trong bất kỳ dpi nào.

Ví dụ

  • drawable- hdpi /eg.png
  • drawable- anydpi -v21/ví dụ.xml

Trên thiết bị hdpi Lollipop (API 21), vector được sử dụng.

Trên thiết bị xSLpi Lollipop (API 21), véc tơ được sử dụng.

Phản hồi ban đầu

Dưới đây là những gì tôi hiểu ban đầu từ mô tả thay đổi, nhưng đó không phải là cách thiết bị của tôi hoạt động. Điều này có thể đúng cho các công cụ SDK cũ hơn.

nodpi

Không làm việc như dự định: Tuy nhiên, nodpi không được ưu tiên. Ví dụ, nếu bạn có

  • drawable- mdpi /eg.png
  • drawable- hdpi /eg.png
  • drawable- nodpi /eg.xml

Sau đó,

  • Bật mdpi, khung công tác sẽ lấy bitmap mdpi.
  • Trên xxxdpi, khung sẽ chụp ảnh bitmap hdpi.

Giải pháp cho vector drawables: Nếu bạn muốn sử dụng một drawable vector, sau đó bạn phải tàu:

  • drawable- mdpi /eg.png
  • drawable- mdpi /eg.xml
  • drawable- hdpi /eg.png
  • drawable- hdpi /eg.xml

anydpi

gia tăng với change Ic3288d0236fe0bff20bb1599aba2582c25b0db32 các "anydpi" vòng loại tài nguyên được chọn theo khuôn khổ nếu một dpi chính xác không được tìm thấy bằng cách khác.

Điều này rất lớn đối với bất kỳ ai sử dụng các đối tượng vẽ vector.

Bây giờ, nếu bạn có

  • drawable- mdpi /eg.png
  • drawable- hdpi/ví dụ.png
  • drawable- anydpi /eg.xml

Sau đó

  • Trên một mdpi, khung sẽ mất bitmap mdpi.
  • Trên xxxdpi, khung sẽ lấy vectơ.
+0

Đó không phải là những gì tôi thấy. Trích dẫn tiền thưởng của tôi: "Cho hai phiên bản của cùng một tài nguyên trong res/drawable-nodpi/và res-drawable-mdpi /, tôi nhận được res/drawable-nodpi/edition trên Nexus 5 chạy Android 6.0, là một -xxhdpi thiết bị ". Bạn có một dự án mẫu thể hiện hành vi mà bạn đang trích dẫn không? – CommonsWare

+0

Đó là vì bạn đã sử dụng 'drawable'. Các bahaviour của SDK có thể đã thay đổi. Xem [VectorDrawable: Android tải xhdpi PNG thay vì tài nguyên vectơ] (http://stackoverflow.com/questions/290/vectordrawable-android-loads-xhdpi-pngs-instead-of-the-vector-resource/32271246#32271246) – rds

+0

"Đó là bởi vì bạn sử dụng drawable" - do đó, bạn đã làm trong câu trả lời của bạn. Mỗi thư mục tài nguyên mà bạn trích dẫn trong câu trả lời của bạn là một thư mục tài nguyên 'drawable', giống như cả hai thư mục mà tôi trích dẫn trong tiền thưởng của tôi là các thư mục tài nguyên' drawable'. – CommonsWare

13

Các source code chứa những ý kiến ​​sau (dòng 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; 

Hy vọng điều này gạt bỏ sự nhầm lẫn.

+5

"Hy vọng điều này sẽ xóa nhầm lẫn "- không thực sự. Không rõ sự khác biệt giữa "tỷ lệ với mật độ bất kỳ" và "không có nghĩa là để được thu nhỏ" có nghĩa là trong thực tế. Các bản vẽ trong thư mục '-nodpi' chắc chắn nhất được thu nhỏ dựa trên kích thước, theo bất kỳ quy tắc nào được áp dụng cho cách sử dụng drawable. – CommonsWare

+0

"Không có nghĩa là để thu nhỏ" có nghĩa là chúng sẽ không được chia tỷ lệ bất kể lập trình viên làm gì hoặc mật độ là bao nhiêu. –

+0

Tôi nghĩ rằng họ có nghĩa là bởi cụm từ "quy mô đến bất kỳ mật độ" mà họ đang đề cập đến vector drawables mà ** quy mô để phù hợp với ** bất kỳ mật độ không có vấn đề lớn như thế nào mật độ. –

4

nodpi: Tài nguyên cho tất cả các mật độ. Đây là những tài nguyên độc lập về mật độ. Hệ thống không quy mô tài nguyên được gắn thẻ với vòng loại này, bất kể mật độ của màn hình hiện tại.

anydpi: Vòng loại này khớp với tất cả mật độ màn hình và được ưu tiên so với các loại vòng loại khác. Điều này rất hữu ích cho các đối tượng vẽ vector. Đã thêm vào Cấp API 21.

Các vấn đề liên quan