Độ phân giải khác nhau hỗ trợ android


80

Câu hỏi đã chỉnh sửa:

Độ phân giải di động:
Tôi muốn thiết kế dpi màn hình khác nhau như độ phân giải sau.
320x480,
480 × 800,
540x960,
720x1280 (Samsung S3),
1080x1920 (S4, Nexus5, Nexus 5x, Moto G4),
2560 x 1440 (Nexus 6, Nexus 6p, Samsung edge)

Độ phân giải máy tính bảng:
480x800 (micromax),
600x1024 ( samsung tab2),
800x1280 (nexus 7),
1200x1920 (nexus 7 mới),
2048x1536 (nexus 9)

Tôi muốn sử dụng các kích thước phông chữ khác nhau tùy thuộc vào độ phân giải màn hình thiết bị.

Q1) bestCách giải quyết điều này là problemgì?

Q2) Lựa chọn tốt nhất khi viết mã hoặc XML là gì?

Q3) Thư mục có thể kéo được đại diện cho độ phân giải thiết bị nào?

Q4) Kích thước biểu tượng Trình khởi chạy ứng dụng cho độ phân giải khác nhau?


16
Độ phân giải màn hình không thành vấn đề. Mật độ màn hình là vấn đề.
CommonsWare

2
Hãy xem [câu trả lời SO này] [1] và thử mã của bạn. [1]: stackoverflow.com/questions/9877946/…
JJ86,

Vui lòng ngừng đặt câu hỏi của bạn bằng những chỉnh sửa tầm thường. Nếu điều này tiếp tục, chúng tôi sẽ khóa câu hỏi.
Brad Larson

2
@Sotti: Kích thước màn hình! = Độ phân giải màn hình.
CommonsWare

1
@Sotti: Nếu bạn đọc bình luận của tôi, bạn sẽ nhận thấy rằng tôi đã viết rằng độ phân giải màn hình không quan trọng. Tôi đã không viết rằng kích thước màn hình không quan trọng.
CommonsWare

Câu trả lời:


188

Kích thước biểu tượng trình khởi chạy ứng dụng tính bằng pixel cho các độ phân giải khác nhau

Độ phân giải di động

  • mipmap-mdpi (48X48)
  • mipmap-hdpi (72X72)
  • mipmap-xhdpi (96X96)
  • mipmap-xxhdpi (144X144)
  • mipmap-xxxhdpi (192X192)

Bố cục Máy tính bảng:

Sử dụng các thư mục sau nếu bạn muốn có bố cục dành riêng cho máy tính bảng:

layout-large-mdpi   (1024x600)
layout-large-tvdpi  (800x1280)
layout-large-xhdpi  (1200x1920)
layout-xlarge-mdpi  (1280x800)
layout-xlarge-xhdpi (2560x1600)

Các thư mục có thể vẽ:

  1. Di động

    res/drawable        (default)
    res/drawable-ldpi/  (240x320 and nearer resolution)
    res/drawable-mdpi/  (320x480 and nearer resolution)
    res/drawable-hdpi/  (480x800, 540x960 and nearer resolution)
    res/drawable-xhdpi/  (720x1280 - Samsung S3, Micromax Canvas HD etc)
    res/drawable-xxhdpi/ (1080x1920 - Samsung S4, HTC one, Nexus 5, etc)
    res/drawable-xxxhdpi/ (1440X2560 - Nexus 6,Samsung S6edge).
    
  2. Độ phân giải máy tính bảng: nhập mô tả hình ảnh ở đây

    Kích thước phông chữ:

LƯU Ý: Luôn cố gắng sử dụng SP bất cứ khi nào bạn xử lý textSize, nhưtextsize=12sp

  1. Sử dụng được xác định trước textAppearance:

    Nó sẽ tự động đặt kích thước văn bản theo mật độ thiết bị.

    <TextView android:textAppearance="?android:attr/textAppearanceSmall"/>
    <TextView android:textAppearance="?android:attr/textAppearanceMedium"/>
    <TextView android:textAppearance="?android:attr/textAppearanceLarge" />
    

    Sử dụng mẫu:

    <TextView
        style="@android:style/TextAppearance.Small"
        android:text="Sample Text - Small" />
    <TextView
        style="@android:style/TextAppearance.Medium"
        android:text="Sample Text  - Medium" />
    <TextView
        style="@android:style/TextAppearance.Large"
        android:text="Sample Text  - Large" />
    
  2. Sử dụng dimension.xmlcho từng thiết bị:

    Từ Google IO Pdf , chúng tôi thấy cấu trúc bên dưới:

    1. Di động:

      res/values/dimens.xml(default)
      res/values-ldpi/dimens.xml   (240x320 and nearer resolution)
      res/values-mdpi/dimens.xml   (320x480 and nearer resolution)
      res/values-hdpi/dimens.xml   (480x800, 540x960 and nearer resolution)
      res/values-xhdpi/dimens.xml  (720x1280 - Samsung S3, Micromax Canvas HD, etc)
      res/values-xxhdpi/dimens.xml (1080x1920 - Samsung S4, HTC one, etc)
      

      res / values-xxxhdpi /mens.xml (1440X2560 - Nexus 6, Samsung S6edge).

    2. Máy tính bảng:

      Cho máy tính bảng, bạn có thể sử dụng nhiều thư mục cụ thể như values-xlarge, values-large.

      res/values-large/dimens.xml      (480x800)
      res/values-large-mdpi/dimens.xml (600x1024)
      

      hoặc là

      res/values-sw600dp/dimens.xml      (600x1024)
      res/values-sw720dp/dimens.xml      (800x1280)
      res/values-xlarge-xhdpi/dimens.xml (2560x1600 - Nexus 10")
      res/values-large-xhdpi/dimens.xml  (1200x1920 - Nexus 7"(latest))
      

Để biết thêm thông tin:

  1. Tham khảo Hỗ trợ nhiều màn hình .

  2. Xem Trang # 77 của Google IO Pdf để biết Mật độ thiết bị thiết kế . Trong đó, bạn sẽ tìm ra cách xử lý dimens.xmlcho các thiết bị khác nhau.

  3. Chuẩn bị sẵn sàng ứng dụng của bạn cho Nexus 6 và Nexus 9 .

Trích từ Hỗ trợ Nhiều Màn hình :

Pixel không phụ thuộc vào mật độ tương đương với một pixel vật lý trên màn hình 160 dpi, là mật độ đường cơ sở do hệ thống giả định cho màn hình có mật độ "trung bình" . Trong thời gian chạy, hệ thống xử lý minh bạch mọi tỷ lệ của các đơn vị dp, nếu cần, dựa trên mật độ thực của màn hình đang sử dụng. Việc chuyển đổi các đơn vị dp để pixel màn hình rất đơn giản: px = dp * (dpi / 160). Ví dụ: trên màn hình 240 dpi, 1 dp bằng 1,5 pixel vật lý. Bạn nên luôn sử dụng các đơn vị dp khi xác định giao diện người dùng của ứng dụng, để đảm bảo giao diện người dùng của bạn hiển thị chính xác trên các màn hình có mật độ khác nhau.


3
Vì vậy, có thực sự không cần phải thực hiện bất kỳ mã nào? chỉ cần tạo thứ nguyên và ứng dụng sẽ tự động kiểm tra độ mờ nào để áp dụng?
John R

1
+1: Đừng quên rằng bạn có thể hỗ trợ tất cả các thiết bị bằng cách sử dụng bố cục.
S.M_Emamian

1
@ S.M_Emamian dành cho máy tính bảng: 1024X600 (bố cục-lớn-mdpi) 800X1280 (bố cục-lớn-tvdpi) 1200X1920 (bố cục-lớn-xhdpi) 1280X800 (bố cục-xlarge-mdpi) 2560X1600 (bố cục-xlarge-xhdpi) vui lòng đăng ký thiết bị hơn là giả lập.
Bhavesh Jethani

2
xin vui lòng kiểm tra liên kết dưới đây có thể giúp bạn. stackoverflow.com/questions/14151121/...
Bhavesh Jethani


28

Đầu tiên, bạn tạo các thư mục giá trị khác nhau cho các màn hình khác nhau. Và đặt kích thước theo các màn hình trong res->values->dimens.xmltệp và gọi kích thước phông chữ đơn giản bằng cách sử dụng "@dimen/text_size".

res/values/dimens.xml    
res/values-small/dimens.xml    
res/values-normal/dimens.xml    
res/values-xlarge/dimens.xml

//for small    
<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="text_size">15sp</dimen>
</resources>

//for normal    
<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="text_size">20sp</dimen>
</resources>

//for large    
<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="text_size">30sp</dimen>
</resources>

//for xlarge    
<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="text_size">40sp</dimen>
</resources>

và truy xuất kích thước phông chữ TextViewnhư được cung cấp bên dưới.

<TextView
    android:id="@+id/lblHeader"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"           
    android:textSize="@dimen/text_size"
    android:textStyle="bold"
    android:typeface="serif" />

vậy làm thế nào bạn đã cung cấp các kích thước ở đây cho các bố cục khác nhau? chẳng hạn như bạn đã sử dụng bất kỳ tỷ lệ nào (1: 1.5: 2: 3: 4) - (mdpi-hdpi: xhdpi: xxhdpi: xxxhdpi) - (2sp: 3sp: 4sp: 6sp: 8sp) như thế này? Tôi bối rối ..!
Asif Sb

@AsifSb nếu bạn sẽ cung cấp cho nó bằng tỷ lệ bạn phải cài đặt nó programatically.Otherwise bạn cần phải đặt Kích thước theo cách tĩnh trong diemens.xml khác nhau trong các thư mục có giá trị
PankajSharma

9

Để tránh các vấn đề về độ phân giải màn hình khác nhau và mật độ khác nhau, tôi định kích thước và định vị mọi thứ dựa trên phần trăm chiều rộng và chiều cao của màn hình. Nếu văn bản được thay đổi kích thước dựa trên phần trăm chiều rộng hoặc chiều cao của màn hình, thì phông chữ sẽ có kích thước chính xác trên mọi thiết bị và mọi độ phân giải. Để có được kích thước phông chữ chính xác dựa trên chiều rộng và chiều cao của không gian, chỉ cần sử dụng chức năng này:

private float SetTextSize(String text, int width, int height)
{
    Paint paint = new Paint();
    float textWidth = paint.measureText(text);
    float textSize = (int) ((width / textWidth) * paint.getTextSize());
    paint.setTextSize(textSize);

    textWidth = paint.measureText(text);
    textSize = (int) ((width / textWidth) * paint.getTextSize());

    // Re-measure with font size near our desired result
    paint.setTextSize(textSize);

    // Check height constraints
    FontMetricsInt metrics = paint.getFontMetricsInt();
    float textHeight = metrics.descent - metrics.ascent;
    if (textHeight > height)
    {
        textSize = (int) (textSize * (height / textHeight));
        paint.setTextSize(textSize);
    }
    return textSize;
}

Đây là mã để lấy chiều rộng và chiều cao của màn hình:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2)
{
    Point size = new Point();
    getWindowManager().getDefaultDisplay().getSize(size);
    screenWidth = size.x;
    screenHeight = size.y; 
}
else
{
    Display display = getWindowManager().getDefaultDisplay(); 
    screenWidth = display.getWidth(); 
    screenHeight = display.getHeight(); 
}

Để có được kích thước phông chữ bạn muốn, chỉ cần tạo một khu vực dựa trên chiều rộng màn hình và chiều cao màn hình và điều chỉnh nó cho đến khi kích thước phông chữ phù hợp. Sau khi bạn làm cho nó trông đúng, nó sẽ trông đúng trên tất cả các thiết bị.

float textSize = SetTextSize("text", (int) (screenWidth * 0.1), (int) (screenHeight * 0.15));

Tôi hy vọng cái này sẽ giúp bạn


1
Re " .. phần trăm chiều rộng / chiều cao của màn hình ". LƯU Ý: Chiến lược này hoàn hảo cho các màn hình có số lượng mục cố định; trên màn hình hiển thị danh sách các mục đang cuộn, đối với điện thoại lớn, tôi thích sự thỏa hiệp giữa "lớn hơn" và "hiển thị nhiều hàng hơn". Một công thức có thể là nhân tất cả các kích cỡ phông chữ bằng sqrt(phoneWidthInches / defaultWidthInches), nơi mà defaultWidthIncheslà kích cỡ điện thoại ban đầu bạn thiết kế cho. Vì vậy, điện thoại lớn hơn 2 lần sẽ có phông chữ lớn hơn 1,4 lần. (thay vào đó sử dụng heighthoặc diagonalcông thức nếu thích hợp). Quan trọng : KHÔNG SỬ DỤNG chiều rộng tính bằng pixel . inches = pixels / dpi.
ToolmakerSteve

8

Về cơ bản, bạn cần tạo một Kiểu văn bản như sau:

<style name="CodeFont">
    <item name="android:textSize">30sp</item>
</style>

đọc thêm về nó tại đây http://developer.android.com/guide/topics/ui/themes.html

Và sử dụng hướng dẫn hỗ trợ android cho các màn hình khác nhau để tạo các kích thước khác nhau mà bạn muốn cho các màn hình khác nhau trong các thư mục res phù hợp như được mô tả trong: http://developer.android.com/guide/practices/screens_support.html

Lưu ý phụ: Tôi không thực sự hiểu bạn muốn làm điều đó trong tình huống nào, việc sử dụng đơn vị SP cho kích thước phông chữ sẽ chia tỷ lệ phông chữ trông giống hoặc ít hơn cùng kích thước trên các điện thoại khác nhau.


4

Đầu tiên, thiết kế ứng dụng của bạn cho một độ phân giải.

ví dụ: giả sử độ phân giải điện thoại di động của bạn là 380 * 480

       mobile screen width:380

       textView size is 80dp   
       Assume : if width is 380dp then 100 % then

               textview width 80dp then how many %(per).

            ower answer is: 25 %

tìm kích thước màn hình theo chương trình bằng công thức belove

    DisplayMetric  displaymetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    ScreenHeight = displaymetrics.heightPixels;
    ScreenWidth = displaymetrics.widthPixels;
        txt_height = (int)((ScreenHeight*14.58)/100);
    txt_width = (int)((ScreenWidth*37.5)/100);


    LinearLayout.LayoutParams normal_param = new LinearLayout.LayoutParams(txt_height ,txt_width );

    txt_Name.setLayoutParams(normal_param);

tôi muốn cung cấp kích thước văn bản .. cho các kích thước thiết bị khác nhau.
Bhavesh Jethani

@BhaveshJethani tính toán tỷ lệ phần trăm kích thước văn bản bằng cách sử dụng mã trên, hãy thử xem mã này phù hợp với tôi.
Hemantvc

3
tôi đang nói về kích thước phông chữ .. không phải kích thước chế độ xem văn bản
Bhavesh Jethani

3

Tôi nghĩ đây là một câu trả lời hay:

Kích thước văn bản và các kích thước màn hình android khác nhau

Nhưng đây là cách bạn có thể làm điều đó với độ phân giải màn hình:

Bạn có thể tạo thư mục tài nguyên "giá trị" cho mỗi độ phân giải như

values-wWIDTHp-hHEIGHTdp (you can also use values-wWIDTHp or values-hHEIGHTdp)
for example: 320*480 will be values-w320p-h480dp

Trong mỗi dir (bao gồm cả các giá trị mặc định là dir), hãy tạo một tệp có tên "mens.xml "với nội dung:

 for exmaple (the value related to the resolution):
 <dimen name="def_font_size">10sp</dimen>

Bây giờ bạn có thể sử dụng "@ dimen / def_font_size" hoặc tạo một kiểu trong thư mục giá trị mặc định.

Thêm cái này vào "styles.xml":

<style name="FontSize">
    <item name="android:textSize">@dimen/def_font_size</item>
</style>

1

Tôi đã tạo một hàm chuyển đổi kích thước dp thành kích thước theo kích thước màn hình và nó đang hoạt động tốt đối với tôi. Bất kỳ ai gặp vấn đề với kích thước văn bản theo màn hình nên thử điều này.

public float convertFromDp(int input) {
    final float scale = getResources().getDisplayMetrics().density;
    return ((input - 0.5f) / scale);
}

đơn giản, cung cấp giá trị do nó cung cấp cho kích thước chế độ xem văn bản theo chương trình như bên dưới

tvTextView1.setTextSize(convertFromDp(24));

câu trả lời này làm việc cho tôi. giảm khối lượng công việc và tính toán
Ranjith Kumar

1

Để hỗ trợ thiết bị nexus 6, hãy tạo thư mục drawable-560dpi và đặt tất cả hình ảnh vào đó.


Tôi nghĩ rằng nó không cần thiết và tốt để thực hiện một kiểu layout như vậy, Tuy nhiên drawable-xxxhdpi sẽ còn dễ dàng hơn và hữu ích
Abhilash

nó sẽ không dành cho nexus 6. Vì nexus 6 có độ phân giải 560dpi. Nếu bạn không khai báo thư mục 560dpi, nó sẽ sử dụng hình ảnh của thư mục xxxhdpi.
Anand Savjani

Có để làm cho nó đơn giản và không phải là điểm ghim chỉ riêng nexus 6, tôi đã đề xuất điều đó. hình ảnh sẽ không khác nhau nhiều nên xxxhdpi dễ dàng hơn.
Abhilash
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.