Sự khác biệt giữa -anydpi và -nodpi là gì?


108

Nếu bạn sử dụng trình hướng dẫn Nội dung vectơ trong Android Studio 1.5.0, bất kỳ XML có thể vẽ vectơ nào bạn nhập bằng trình hướng dẫn đó sẽ được đưa vào res/drawable/.

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

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


Câu trả lời:


106

gật đầu

Đây là những tài nguyên không phụ thuộc vào mật độ. Hệ thống không chia tỷ lệ tài nguyên được gắn thẻ với bộ định lượng này, bất kể mật độ màn hình hiện tại.

Ví dụ:

  • drawable- gật gù /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 định tính cụ thể nếu nó tồn tại.

Ví dụ

  • drawable- hdpi /eg.png
  • drawable- gật gù -v21 / eg.xml

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

Trên thiết bị xhdpi Lollipop (API 21), vectơ đượ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 / eg.xml

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

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

Tài liệu tham khảo

Lưu ý : anydpi đã được thêm vào thay đổi Ic3288d0236fe0bff20bb1599aba2582c25b0db32 .


Đó không phải là những gì tôi đang thấy. Trích dẫn tiền thưởng của tôi: "Với hai phiên bản của cùng một tài nguyên ở res / drawable-gật đầu / và res-drawable-mdpi /, tôi nhận được res / drawable-gật đầu / ấn bản trên Nexus 5 chạy Android 6.0, là -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

Đó là bởi vì bạn đã sử dụng drawable. Bahaviour của SDK có thể đã thay đổi. Xem VectorDrawable: Android tải xhdpi PNG thay vì tài nguyên vectơ
rds

"Đó là bởi vì bạn đã sử dụng drawable" - bạn cũng vậy trong câu trả lời của mình. Mỗi thư mục tài nguyên duy nhất mà bạn trích dẫn trong câu trả lời của mình là một drawablethư mục tài nguyên, cũng như cả hai thư mục mà tôi đã trích dẫn trong phần thưởng của mình đều là drawablethư mục tài nguyên.
CommonsWare

"Trên xxxdpi, khung sẽ lấy bitmap hdpi." - đó là điều cụ thể không xảy ra, mặc dù thử nghiệm của tôi là trên một -xxhdpithiết bị. Tôi có res/drawable-mdpi/nodpi_and_m.pngres/drawable-nodpi/nodpi_and_m.xml. Trên thiết bị Nexus 5, -xxhdpitài nguyên được sử dụng là res/drawable-nodpi/nodpi_and_m.xml. Theo thuật toán của bạn và mong đợi của tôi, res/drawable-mdpi/nodpi_and_m.pngnên được sử dụng. Đó không phải là những gì đang xảy ra.
CommonsWare

2
Điểm mấu chốt: bạn nên đặt vectơ vào drawable-anydpi-v21. Nếu bạn có thư viện support-vector-drawable, bạn có thể đặt chúng vào drawable-anydpihoặc đơn giản drawable.
rds

17

Các mã nguồn chứa các ý 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 làm rõ ràng sự nhầm lẫn.


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

"Không được chia tỷ lệ" có nghĩa là chúng sẽ không được chia tỷ lệ cho dù lập trình viên làm gì hoặc mật độ là bao nhiêu.
Vishavjeet Singh

Tôi nghĩ rằng họ muốn nói đến cụm từ "chia tỷ lệ theo bất kỳ mật độ nào" mà họ đang đề cập đến các đồ vật có thể kéo được vectơ sẽ chia tỷ lệ để phù hợp với bất kỳ mật độ nào cho dù mật độ có lớn đến đâu.
Vishavjeet Singh

3
nó đã được thêm vào android.googlesource.com/platform/frameworks/base/+/31245b4%5E! , Và từ đó bạn có thể tìm hiểu nó có thể cố định một số lỗi 17007265
marcinj

1
@ MarcinJędrzejewski: Trên thực tế, nhận xét "được chọn là phù hợp nhất trừ khi có cấu hình khớp với mật độ được yêu cầu chính xác" trên cam kết đó cho tôi manh mối. Cảm ơn!
CommonsWare

10

nodpi: Tài nguyên cho tất cả các mật độ. Đây là những tài nguyên không phụ thuộc vào mật độ. Hệ thống không chia tỷ lệ tài nguyên được gắn thẻ với bộ định lượng này, bất kể mật độ màn hình hiện tại.

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


9

Tôi sử dụng drawable-nodepi cho mọi thứ, bao gồm nhiều đồ họa lớn cho trò chơi của tôi. Một hậu quả không có tài liệu của việc mở rộng đồ họa của bạn là nó làm tăng mức sử dụng bộ nhớ theo cấp số nhân. Vì vậy, nếu bạn có một đồ họa 1MB có thể vẽ, nó sẽ được chia tỷ lệ thành 4MB, 16MB hoặc 64MB tùy thuộc vào độ phân giải của thiết bị người dùng. Và độ phân giải thiết bị tiếp tục tăng lên. Tất nhiên, việc mở rộng quy mô đó không thực sự làm tăng độ sắc nét của đồ họa. Dù sao thì các thao tác vẽ cũng có thể định hướng kích thước của mỗi đồ họa so với kích thước màn hình, không cần phải làm cồng kềnh ứng dụng với nhiều thư mục vẽ.


3
câu trả lời bị đánh giá thấp. Tôi gặp phải vấn đề tương tự: có hình ảnh lớn 100KB, nhưng thường xuyên có lỗi OOM khi tải nó. Ứng dụng bị lỗi nói rằng nó không thể phân bổ 18MB !!! Không hiểu bằng cách nào mà 100KB này có thể được chuyển thành 18MB, nhưng nó thực sự là kết quả của việc mở rộng quy mô đó. Chuyển hình ảnh sang không có dpi đã giải quyết được vấn đề.
Simon Ninon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.