2012-10-31 28 views
15

Tôi đang phát triển một ứng dụng cho máy tính bảng Kindle Fire HD 7 inch và Nexus 7. Hai ứng dụng này có cùng kích thước và cùng độ phân giải màn hình. Tuy nhiên, tôi chạy ứng dụng của mình, nó rất khác. Tại sao?Nexus 7 và Kindle Fire HD, suy nghĩ khác nhau

có vẻ như điều này là do nexus 7 được phát hiện là TVDPI và Kindle Fire HD là HDPI. Làm cách nào để có cùng một kết xuất dựa trên mô hình 1280 * 800?

Cảm ơn bạn

+0

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

+0

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

+0

Chúng tôi cần biết chính xác "có gì khác" để giúp bạn. –

Trả lời

25

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 TextView16dp. 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.xmlvalues-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".

+3

Đây là một câu trả lời tuyệt vời, một trong những caveat tôi sẽ thêm là mật khẩu dựa trên răng cưa chỉ là một sửa chữa tạm thời. Khi máy tính bảng xuất hiện tuân thủ CDD và thực sự là HDPI, tất cả những điều trên sẽ bị hỏng. Đây là tình huống tương tự chúng tôi đã ở với Galaxy Tab 7 ". Nó báo cáo như HDPI khi nó đã thực sự MDPI. Mọi người đều bí danh để làm cho nó hoạt động nhưng khi Nexus 7" ra tất cả các hacks đã được tiếp xúc và hầu hết các công ty đã phải thả hỗ trợ cho Tab 7 "để hỗ trợ dòng mới của các thiết bị có độ phân giải cao hơn. Hiện tại tôi đang hướng tới các bố cục mới sử dụng -sw533dp nhưng tôi vẫn không hài lòng. – JustinMorris

1

Vì Vỏ đựng Nexus 7 là một thiết bị tvdpi nó sử dụng tài sản bố trí sw600dp (dựa trên các tính toán ở 213dpi), các FireHD là một thiết bị hdpi và kết thúc bằng cách sử dụng tài sản bố trí sw533dp (tính toán dựa trên 240dpi)

+3

tại sao mật độ được tính bằng pixel/inch. cả hai thiết bị đều có cùng độ phân giải, cả hai thiết bị đều có cùng kích thước hiển thị. một sự khác biệt về mật độ? – stoefln

1

Có lẽ bạn nên sử dụng layout-tvdpi và layout-hdpi?

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