Vâng, có vẻ như bạn đã khám phá ra lý do tại sao cả hai đều có sự khác biệt, đó là vì họ báo cáo các yếu tố quy mô mật độ khác nhau:
- Nexus 7: tvdpi: Scale Factor = 1.333
- Kindle Fire HD: HDPI: Yếu tố tỷ lệ = 1,5
Vậy tại sao họ báo cáo khác nhau khi về mặt kỹ thuật có cùng kích thước và độ phân giải vật lý?
Sự cố CORE thực sự tồn tại do một thiết bị là thiết bị Google Play (Nexus) và thiết bị kia không phải là (Kindle). Tất cả các thiết bị Android có Google Play (và các ứng dụng khác của Google) chỉ có thể thực hiện việc này bằng cách chuyển một cái gì đó được gọi là Bộ kiểm tra tương thích (CTS), xác minh rằng các cài đặt như thế này tuân thủ các tiêu chuẩn mà chúng đã đưa ra. Bản thân các tiêu chuẩn được ghi lại trong một Tài liệu Định nghĩa Tương thích (CDD) cho mỗi bản phát hành. Here is a link to the CDD for Android 4.0 (Phần 7.1 đề cập đến kích thước và mật độ màn hình). CDD nói với một nhà sản xuất thiết bị rằng họ nên báo cáo yếu tố tỷ lệ gần bằng số DPI thực tế của màn hình, thực tế là TVDPI trong trường hợp này.
Thiết bị Amazon không sử dụng bất kỳ ứng dụng nào của Google, bao gồm cả Google Play. Trong khi nó có thể được quan tâm tốt nhất của họ để làm theo các tiêu chuẩn tương tự, họ không bị ràng buộc bởi họ, và thường không được theo sau. Loại TVDPI đã thu hút mọi người khi nó xuất hiện trên Nexus 7, nhưng Amazon sẽ biết về nó nếu họ tham chiếu CDD trong quá trình thiết kế.
Điều này khiến chúng hoạt động khác nhau như thế nào?
Sự khác biệt không nằm trong lựa chọn bố cục của bạn. Rõ ràng từ ảnh chụp màn hình của bạn cả hai thiết bị được chọn lên bố trí thích hợp như bạn mong đợi họ. Thay đổi giá trị sw
trên một thư mục bố cục chỉ ảnh hưởng đến thiết bị nào sẽ chọn bố cục đó ... nó không thay đổi bất cứ điều gì về cách mọi thứ sẽ được chia tỷ lệ. Đừng bận tâm cố gắng đặt bố cục trong các thư mục mật độ cụ thể ... bố trí được cho là linh hoạt. Thay vào đó, vấn đề nằm ở bất kỳ kích thước hoặc kích thước nào được thực hiện trên đơn vị pixel độc lập (ví dụ: nhúng hoặc dp), chẳng hạn như kích thước văn bản, mọi kích thước chế độ xem cố định mà bạn có thể đã tạo và kích thước có thể vẽ.
Vì hai thiết bị này có chọn để chia tỷ lệ tài sản khác nhau, bất kỳ tài nguyên có thể vẽ nào bạn sử dụng hoặc bất kỳ giá trị nào bạn xác định trong "dp" sẽ dẫn đến một thay đổi nhỏ.Hãy để tôi cung cấp cho bạn hai ví dụ:
Bạn xác định kích thước văn bản cho TextView
là 16dp
. Trên Nexus 7, điều này sẽ vẽ văn bản ở 21px. Kindle Fire HD sẽ vẽ cùng một văn bản ở 24px. Sự khác biệt là nhỏ ... nhưng nó tồn tại.
Điều này cũng đúng với hình ảnh có thể kéo. Nếu bạn chỉ xác định một hình ảnh trong drawable-mdpi
ở 48x48 và cùng một hình ảnh trong drawable-hdpi
ở 72x72, Kindle có hình ảnh 72px để sử dụng trực tiếp và Nexus sẽ tạo hình ảnh 64px có kích thước, do đó có sự khác biệt 8 pixel giữa hai nội dung .
Tôi có thể làm gì để làm cho hai trông giống nhau hơn?
Trong hầu hết các trường hợp, tôi sẽ nói bạn không nên. Thông thường việc thực hiện mở rộng quy mô không ảnh hưởng lớn đến kết quả của ứng dụng trừ khi các ràng buộc của bố cục được thiết lập với quá nhiều kích thước được mã hóa cứng. Tuy nhiên, nhìn chung, nếu có một phần giao diện người dùng của bạn mà bạn cần phải thay đổi cụ thể cho mục đích này, giải pháp là xác định tài nguyên và kích thước cụ thể cho trường hợp -tvdpi
nơi bạn cảm thấy cần thiết (một lần nữa, tôi sẽ không làm như vậy) t khuyên bạn nên mở rộng mọi thứ trong ứng dụng của bạn để đáp ứng trường hợp này).
Đối với những thứ như văn bản hoặc kích thước chế độ xem, điều đó có nghĩa là bạn có thể muốn tệp values-tvdpi/dimensions.xml
và tệp mặc định values/dimensions.xml
. Sử dụng ví dụ trên, bạn có thể xác định kích thước văn bản mặc định là 16dp, nhưng ở vị trí -tvdpi
, xác định cùng kích thước như 18dp. Điều này sẽ làm cho cả hai thiết bị mở rộng văn bản cuối cùng lên đến 24px. Trong mã của bạn, trong đó kích thước thực tế được sử dụng, hãy tham chiếu nó dưới dạng @dimen/myTextSize
thay vì trực tiếp 16dp
.
Đối với mục drawable, thêm một thư mục drawable-tvdpi
và quy mô tài sản đó để phù hợp với cách bạn nghĩ rằng họ nên vẽ trên các thiết bị như Nexus 7. Một lần nữa với ví dụ trước, sao chép các tập tin cùng một hình ảnh từ thư mục drawable-hdpi
vào thư mục drawable-tvdpi
do đó cả hai thiết bị sẽ vẽ cùng một hình ảnh ở 72px.
Để tránh sao chép cùng một nội dung ở nhiều nơi, bạn cũng có thể thực hiện việc này bằng cách đánh răng. Đặt chính hình ảnh đó vào drawable/
với tên đặc biệt và sử dụng values-tvdpi/drawables.xml
và values-hdpi/drawables.xml
để tham chiếu nội dung đơn ở hai nơi. Để biết thêm thông tin về việc đánh răng, see this documentation. Các ví dụ dành cho bố cục, nhưng cùng một mô hình hoạt động cho các bản vẽ (hoặc bất kỳ tài nguyên nào) bằng cách thay đổi thành type="drawable"
.
Thú vị, bạn có thể cung cấp cho chúng tôi SS không cho thấy sự khác biệt (tôi biết điều này có thể khó khăn như bạn đang phát triển trên dự án) không? – Warpzit
Nexus7 có hiển thị ứng dụng như bố cục mặc định của bạn không? [Ed Burnette] (https://plus.google.com/106300001086744879268/posts/Wa9xtQjZHJx) đã nói về một vấn đề liên quan đến độ phân giải của TVDPI và đặc biệt là Nexus7. Tôi đoán Nexus đang nhận bố cục mặc định thay thế. – Korcholis
Chúng tôi cần biết chính xác "có gì khác" để giúp bạn. –