2016-07-10 16 views
8

Hai màn hình, ngoài mật độ, gần như cùng kích thước:Hai màn hình, cùng kích thước với mật độ khác nhau

Màn hình bên trái là trình mô phỏng 768x1280 160dpi (MDPI). Màn hình bên phải là bộ mô phỏng 720x1280 320dpi (XHDPI).

enter image description here

Tôi đang sử dụng 300dp width và height 300dp. XML:

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ImageView 
     android:id="@+id/picture" 
     android:layout_width="300dp" 
     android:layout_height="300dp" 
     android:src="@drawable/picture" 
     android:layout_centerInParent="true"/> 
</RelativeLayout> 

Bất kể chất lượng cripsness/hình ảnh, nên không phải cả hai hình ảnh lấp đầy không gian như nhau trong cả hai (và những người khác) màn hình? Có một câu trả lời xác nhận tuyên bố này here

EDIT: Tôi đã thấy người nói rằng bạn phải lặp lại trong XML tương tự cho màn hình khác nhau, do đó bạn có thể thay đổi các giá trị của các yếu tố DP. Nếu điều này là đúng, Tôi nghĩ rằng tôi hiểu lầm mục đích của đơn vị DP. Tôi nghĩ rằng nó đã được intented để có hình ảnh với chính xác cùng kích thước trên màn hình khác nhau bằng cách sử dụng cùng một giá trị DP. Bạn có thể làm rõ điều đó không?

+2

Xin lỗi, bạn đã kiểm tra nếu bạn không có hình ảnh kích thước khác nhau tại các thư mục drawable (mdpi và xhdpi) của dự án của bạn? – statosdotcom

+0

Có. Hiện tại, tôi chỉ có một phiên bản của hình ảnh để thử nghiệm. Nhưng tôi đã thử nghiệm bằng cách bao gồm tất cả các nhóm và vẫn không có may mắn. – AndroidDev

Trả lời

14

Tôi nghĩ thực tế là trình mô phỏng đang được sử dụng đang gây ra một chút nhầm lẫn ở đây.

Chỉ định đơn vị dp như bạn đã thực hiện ở đây, có nghĩa là hình ảnh gần bằng cùng một kích thước vật lý trên các thiết bị khác nhau. Trong câu hỏi của bạn, bạn đã nói rằng chúng tôi đang so sánh hai màn hình có kích thước gần như giống nhau, nhưng đó không phải là trường hợp!

Với độ phân giải bạn đã nêu trong câu hỏi, chúng tôi đang thực sự xem (khoảng) một máy tính bảng 9 inch ở bên trái và điện thoại 4,5 inch ở bên phải. Vì đây là những thiết bị ảo và có thể được thay đổi kích thước trên màn hình, chúng có thể được tạo ra để xuất hiện cùng kích thước nhưng chúng đại diện cho những điều rất khác nhau trong thực tế.

Trên trái chúng ta có thể nhìn thấy từ các nút trên thanh trạng thái và hệ thống này thực sự trông giống như một viên thuốc, và tôi đã sử dụng các biểu tượng trong thanh trạng thái như một biện pháp sơ bộ quy mô ở đây:

enter image description here

Điều này sao lưu kỳ vọng rằng nếu bạn thực sự có một máy tính bảng và điện thoại ở phía trước của bạn (hoặc nếu giả lập là tỷ lệ chính xác), hình ảnh sẽ có cùng kích thước vật lý trên cả hai.

Sửa-thêm chi tiết để đáp ứng với các ý kiến ​​về câu trả lời này:

Mục đích của mô tả kích thước trong dp là họ sẽ được kích thước vật lý như nhau trên các thiết bị với mật độ điểm ảnh khác nhau. Đây là những gì bạn đã làm ở trên. Ví dụ, nếu phần tử là 2 inch ở mỗi bên thì sẽ là 2 inch trên điện thoại có độ phân giải cao hoặc có độ phân giải thấp và sẽ có kích thước 2 inch trên máy tính bảng có độ phân giải cao hoặc độ phân giải thấp.

Nếu những gì bạn muốn không cho phần tử có cùng kích thước thực, nhưng luôn luôn có cùng tỷ lệ màn hình (như luôn luôn 90% chiều rộng của màn hình) thì có một vài loại bố cục bạn có thể chọn.

LinearLayout sử dụng khái niệm về Trọng số để phân bổ các tỷ lệ khác nhau của không gian.

Thư viện hỗ trợ bao gồm PercentRelativeLayout and PercentFrameLayout hoạt động như bố cục thông thường nhưng cho phép bạn chỉ định kích thước bằng cách sử dụng tỷ lệ phần trăm.

The new ConstraintLayout hiện chỉ khả dụng trong Android Studio 2.2 Phiên bản xem trước. Tôi chưa tự mình sử dụng nó, nhưng có vẻ như nó bao gồm các tỷ lệ phần trăm và các khái niệm dựa trên tỷ lệ riêng của nó mà cũng có thể cho phép điều này.

+1

Vì vậy, tôi không thể mong đợi sử dụng cùng một giá trị DP cho tất cả các màn hình. Tôi phải tạo các tệp XML khác nhau cho mỗi kích thước màn hình? – AndroidDev

+0

bạn đang cố gắng đạt được điều gì? –

+0

Chạy ứng dụng của tôi trên các thiết bị khác nhau tương ứng. – AndroidDev

2

bạn cũng có thể làm điều này trong lập trình, vì vậy với kích thước màn hình khác nhau (cũng cho mật độ khác nhau) bạn có thể đặt kích thước hình ảnh theo tỷ lệ phần trăm bằng cách lấy kích thước màn hình và sau đó tính số pixel (theo tỷ lệ phần trăm) cần thiết cho cả chiều rộng và chiều cao như thế này.

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.your_layout_xml); 

    DisplayMetrics metrics = getResources().getDisplayMetrics(); 
    int screenWidthInPixels = metrics.widthPixels; 
    int screenHeightInPixels = metrics.heightPixels; 

    int imageWidth = Math.round (screenWidthInPixels * (58.57/100)); //58.57 is the percentage value for image width 
    int imageHeight = Math.round (screenHeightInPixels * (58.57/100)); //58.57 is the percentage value for image height 

    ImageView picture= (ImageView)findViewById(R.id.your_image_id); 
    picture.setLayoutParams(new RelativeLayout.LayoutParams((int) imageWidth , (int) imageHeight)); 


    } 
0

Làm rõ đơn giản:

màn hình đầu tiên với 160 [mdpi]:

đây 1 dp [Được sử dụng bởi bạn rộng ImageView xml của] = 1 pixel [px]. Vì nó là đặc điểm kỹ thuật của Android. Vì vậy, hình ảnh được hiển thị hoàn chỉnh 300 pixel ở cả chiều rộng và chiều cao.

Màn hình thứ hai với 320 [xhdpi]:

đây 1 dp [Được sử dụng bởi bạn rộng ImageView xml của] = 2 pixels [px].

Và khi bạn đã sử dụng "300dp" chiều rộng và chiều cao, có nghĩa là bạn đang yêu cầu Android sử dụng "pixel mật độ" [dp] thay vì pixel vật lý [px].

Vì vậy, 300 dp = 600 pixel [px]

Đó là lý do ImageView có kích thước gấp đôi trong 2 Emulator.

Hy vọng, điều này rõ ràng là không chắc chắn.

Giải pháp:

Nếu bạn muốn ImageView của bạn là có cùng chiều rộng và chiều cao, sau đó bạn có thể sử dụng android: cân thuộc tính trong cả android: chiều rộng và android: chiều cao. Mà sẽ phân bổ không gian bằng nhau trên cả hai mặt của imageview của bạn.

Mẫu mã cho việc tìm kiếm mật độ trong thời gian chạy:

private static String getDensityName(Context context){ 
    float density = getResources().getDisplayMetrics().density; 

    if(density >= 4.0){ 
     return “xxxhdpi”; 
    } 
    if(density >= 3.0){ 
     return “xxhdpi”; 
    } 
    if(density >= 2.0){ 
     return “xhdpi”; 
    } 
    if(density >= 1.5){ 
     return “hdpi”; 
    } 
    if(density >= 1){ 
     return “mdpi”; 
    } 
    return “ldpi”; 

} 
+0

Hi Anish, tôi nhận được lời giải thích của bạn và nó có ý nghĩa.Nhưng sau đó những gì tôi không hiểu là thuật ngữ "pixel độc lập mật độ". Nó không có ý nghĩa với tôi .. Nếu nó là độc lập, sau đó hiển thị cùng một hình ảnh với cùng một giá trị dp trong mật độ khác nhau không nên tạo ra kết quả khác biệt, phải không? – AndroidDev

+1

@LevySchiavetti: Xin chào, Trên thực tế, khái niệm "pixel độc lập mật độ" có trong hình khi "Kích thước màn hình giống nhau, nhưng số lượng pixel khác nhau". Trong trường hợp đó, mã của bạn sẽ hiển thị hình ảnh trên cả hai màn hình chính xác. Trong trường hợp của bạn, nó là ngược lại. Vì vậy, bạn cần 2 hình ảnh: 1 cho mật độ mdpi và một cho mật độ xhdpi. Chỉ cần đặt 2 diff. hình ảnh trong các thư mục riêng biệt này và bạn đã hoàn tất. –

+0

Cố gắng tìm mật độ của cả hai trình giả lập. Và kiểm tra xem chúng có phù hợp với cái bạn đã chỉ định ở trên không? Tôi đặt mã để tìm mật độ trong câu trả lời ở trên của tôi. –

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