2011-06-19 60 views
13

Tất cả các độ phân giải khác nhau của các sản phẩm Android khác nhau đều khiến tôi phát điên.Cách hỗ trợ tất cả các độ phân giải khác nhau của các sản phẩm Android

Ứng dụng android đầu tiên của tôi mà tôi đã viết được thiết kế để hỗ trợ ba độ phân giải thường được sử dụng: 240x320 (LDPI), 320x480 (MDPI) và 480x800 (HDPI). 480x854 không gây hại cho bố cục vì nó có cùng chiều rộng với 480x800.

Tôi cũng đã mua các thiết bị sau để kiểm tra các ứng dụng Android của tôi trên: Samsung Galaxy châu Âu (LDPI) HTC Desire Z (hdpi)

May mắn bạn gái của tôi có một HTC Wildfire S (mdpi) vì vậy tôi đã có nhiều nghị quyết nhất.

Nhưng hôm nay, anh tôi đã tải xuống ứng dụng của tôi trên HTC Sensation mới của mình mà vẫn có độ phân giải khác 540x960 (HDPI?). Mà không hiển thị ứng dụng của tôi như nó phải và có lẽ hầu hết các máy tính bảng sẽ không hiển thị nó một cách chính xác.

Những gì tôi đã làm với ứng dụng đầu tiên của tôi đã được đọc ra mật độ và sau đó thiết lập các thông số:

public void set_ui_parameters() { 
    DisplayMetrics metrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(metrics); 

    if(metrics.densityDpi == DisplayMetrics.DENSITY_HIGH){ 
     textSize = 35;  
     timeWidth = 80; 
     dayWidth = 110; 
     moneyWidth = 50; 
    } else if(metrics.densityDpi == DisplayMetrics.DENSITY_MEDIUM){ 
     textSize = 35;  
     timeWidth = 53; 
     dayWidth = 73; 
     moneyWidth = 33; 
    } else if(metrics.densityDpi == DisplayMetrics.DENSITY_LOW){ 
     textSize = 28; 
     timeWidth = 40; 
     dayWidth = 55; 
     moneyWidth = 25; 
    } 
} 

Bên cạnh các thông số tôi cũng đã tạo drawables cho LDPI, mdpi và hdpi. Điều này làm việc tốt cho các nghị quyết được mô tả ở trên, nhưng điều này phụ thuộc vào độ phân giải màn hình i.c.w. kích thước màn hình và không thành công, ví dụ như HTC sensatoin với 540x960.

Tôi biết rằng không phải tất cả các nghị quyết đều được sử dụng thường xuyên, nhưng tôi muốn hỗ trợ càng nhiều càng tốt. Stats of Screen Sizes and Densities

Tôi đã đọc Supporting Multiple Screens nhiều lần nhưng không tìm thấy câu trả lời rõ ràng cho "vấn đề" này.

Vì vậy, tôi nên đọc độ phân giải và đặt thông số theo độ phân giải thay vì mật độ? Đây có phải là một điều thông minh để làm hoặc làm thế nào để bạn đối phó với điều này?

Cảm ơn rất nhiều thông tin của bạn!

Trả lời

27

Bạn không phải làm điều đó để hỗ trợ mật độ khác nhau. Việc bạn làm là tạo các thư mục tài nguyên khác nhau:

res/values-ldpi/dimens.xml 
res/values-mdpi/dimens.xml 
res/values-hdpi/dimens.xml 

Sau đó, Android sẽ quyết định sử dụng tệp nào. Bạn có thể có một cái gì đó như:

<!-- in values-ldpi/dimens.xml --> 
<dimen name="textSize">25dip</dimen> 

và ..

<!-- in values-mdpi/dimens.xml --> 
<dimen name="textSize">20dip</dimen> 

vv Và bạn không nên quan tâm đến độ phân giải ... có rất nhiều độ phân giải kích thước khác nhau nên nó sẽ là một địa ngục đưa ra quyết định dựa trên điều đó.

Ngoài ra, nếu bạn sử dụng dp thay vì pixel, bạn hầu như không bao giờ phải tạo các tệp thứ nguyên khác nhau cho từng mật độ. Tất nhiên, đôi khi bạn phải, nhưng nó phụ thuộc vào ứng dụng.

+0

Cảm ơn các giá trị rất sử dụng, nhưng điều này không giải quyết được sự cố với độ phân giải 540x960 hoặc tôi sai. Vì SQRT (540^2 + 960^2) /4.3 = 256,15 (HTC Sensation) giống như SQRT (480^2 + 800^2) /3.7 = 252,15 (HTC Desire Z) và cả hai sẽ được lập chỉ mục dưới dạng HDPI khi màn hình của Sensation rộng hơn 60px. – patrick

+2

Vâng ... vấn đề ở đây là bạn sẽ không thể xử lý 100% kích thước màn hình. Vì vậy, ví dụ ... nếu bạn muốn xem văn bản bao trùm chính xác chiều rộng của màn hình, ngay cả khi bạn áp dụng tất cả các kỹ thuật có thể, sẽ có một số thiết bị sẽ bao bọc văn bản hoặc nội dung nào đó. Quan điểm của tôi là, bạn không thể làm cho ứng dụng của bạn trông chính xác như bạn muốn trên tất cả các thiết bị ... bạn phải phù hợp với việc làm cho nó trông tốt hơn hết mức có thể. – Cristian

0

Bây giờ, tôi chỉ đoán ở đây kể từ khi phần còn lại của việc thực hiện không được hiển thị, nhưng tôi giả sử bạn đang sử dụng những phép đo có nguồn gốc như px

Hãy xem dp. Về cơ bản, tất cả những thứ bạn đã làm, tự động, cho bất kỳ thiết bị nào.(Thiết bị độc lập Pixel)

0

Đừng lo lắng về sự khác biệt nhỏ về độ phân giải: 540x960 chỉ hơi lớn hơn 480x800. Không gian dọc phụ là dễ dàng: nó cung cấp cho bạn nhiều chỗ cho danh sách của bạn. Đối với không gian ngang, miễn là bạn đang xử lý bố trí của bạn một cách chính xác bạn sẽ chỉ có thêm đệm (30pix ea) ở hai bên.

Thật không may, hình ảnh có chiều rộng đầy đủ (480 độ rộng) là một vấn đề lớn hơn một chút. Nếu bạn muốn hình ảnh hoàn hảo pixel, bạn sẽ muốn sử dụng scaleType = "center" để hình ảnh trung tâm chứ không phải tỷ lệ. Nếu bạn muốn có chiều rộng đầy đủ, bạn có thể sử dụng scaleType = "fitCenter" để làm đầy. Nó sẽ hơi mờ ... nhưng rất nhiều thứ trên Android là ;-)

0

Tôi cũng gặp phải vấn đề này, ngoại trừ ứng dụng của tôi là một trò chơi có một Canvas SurfaceView vẽ hình nền và hình ảnh đến (tương tự như ví dụ LunarLander).

Cách bạn xử lý ở đây là mở rộng ảnh nền thành kích thước lớn nhất bạn sẵn sàng hỗ trợ (540x960) nhưng giữ tất cả những thứ quan trọng (như nút, văn bản, thông tin, v.v.) trong một hình chữ nhật nhỏ hơn 480x800. Bạn có thể tự mở rộng hình ảnh hoặc chỉ thêm đường viền. Điều quan trọng là không có gì quan trọng là có.

Những người có điện thoại 480x800 sẽ nhìn thấy ứng dụng thông thường của bạn. Những người có điện thoại 540x960 sẽ nhìn thấy một đường viền nhỏ hơn.

1

Điều duy nhất bạn phải làm là bạn đặt android: minSdkVersion thành 7 hoặc cao hơn trong tệp kê khai của mình. Có thể một số chế độ xem sẽ xuất hiện hơi khác nhưng ứng dụng là có thể áp dụng và trên toàn bộ màn hình.

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