Làm cách nào để xác định độ rộng màn hình theo dp hoặc nhúng khi chạy trong Android?


192

Tôi cần mã hóa bố cục của các widget Android bằng cách sử dụng dip / dp (trong các tệp java). Trong thời gian chạy nếu tôi mã ,

int pixel=this.getWindowManager().getDefaultDisplay().getWidth();

cái này trả về chiều rộng màn hình tính bằng pixel (px). Để chuyển đổi nó thành dp, tôi đã mã hóa:

int dp =pixel/(int)getResources().getDisplayMetrics().density ;

Điều này dường như không trả lời đúng. Tôi đã tạo trình giả lập của WVGA800 có độ phân giải màn hình là 480 x 800. Khi chạy trình giả lập và để mã in các giá trị của pixel và dp, nó đã lên tới 320 ở cả hai. Trình giả lập này là 240 dpi với hệ số tỷ lệ sẽ là 0,75.

Câu trả lời:


376

Thử cái này

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics ();
display.getMetrics(outMetrics);

float density  = getResources().getDisplayMetrics().density;
float dpHeight = outMetrics.heightPixels / density;
float dpWidth  = outMetrics.widthPixels / density;

HOẶC LÀ

Cảm ơn @ Tomáš Hubálek

DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();    
float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;

90
Tại sao cần phải gọi WindowManager? Mã này thì sao? DisplayMetrics displayMetrics = resource.getDisplayMetrics (); màn hình nổiWidthDp = displayMetrics. thongPixels / displayMetrics.d mật;
Tomáš Hubálek

2
Điều này đã không làm việc cho tôi bằng cách sử dụng một màn hình mật độ rất cao. Như thể nó chỉ có một phần nhỏ của màn hình. Giải pháp này hiệu quả với tôi: stackoverflow.com/a/18712361/956975 Hiển thị hiển thị = getWindowManager (). GetDefaultDisplay (); Kích thước điểm = điểm mới (); display.getSize (kích thước); int width = size.x; int height = size.y;
marienke

1
@dsdsdsdsd: bối cảnh là bất kỳ trường hợp nào của lớp Ngữ cảnh. Đáng chú ý nhất, Activity là một lớp con của Ngữ cảnh (vì vậy hãy sử dụng lớp này trong Activity và getActivity () trong một đoạn). Ứng dụng và Dịch vụ cũng là các lớp con của Ngữ cảnh.
François POYER

112

Tôi vấp phải câu hỏi này từ Google và sau đó tôi đã tìm thấy một giải pháp dễ dàng hợp lệ cho API> = 13.

Để tham khảo trong tương lai:

Configuration configuration = yourActivity.getResources().getConfiguration();
int screenWidthDp = configuration.screenWidthDp; //The current width of the available screen space, in dp units, corresponding to screen width resource qualifier.
int smallestScreenWidthDp = configuration.smallestScreenWidthDp; //The smallest screen size an application will see in normal operation, corresponding to smallest screen width resource qualifier.

Xem tham chiếu lớp cấu hình

Chỉnh sửa: Theo ghi nhận của Nick Baicoianu, điều này trả về chiều rộng / chiều cao có thể sử dụng của màn hình (nên là những thứ thú vị trong hầu hết các mục đích sử dụng). Nếu bạn cần kích thước hiển thị thực tế dính vào câu trả lời hàng đầu.


23
Một sự khác biệt quan trọng giữa việc sử dụng màn hình của Cấu hìnhWidthDp / screenHeightDp so với DisplayMetrics widthPixels / heightPixels là Cấu hình trả về kích thước hiển thị có thể sử dụng (trừ thanh trạng thái, v.v.), trong khi DisplayMetrics trả về kích thước toàn màn hình.
Nick Baicoianu

Đây là chỉ cho API Cấp 13 trở lên
ono

Để thêm vào nhận xét của @ NickBaicoianu, cả hai phương thức getConfiguration () và getDisplayMetrics () đều hoạt động ở chế độ nhiều cửa sổ. tức là kích thước phản ánh kích thước của cửa sổ, không phải màn hình.
nmw

7

Bạn đang thiếu giá trị mật độ mặc định là 160.

    2 px = 3 dip if dpi == 80(ldpi), 320x240 screen
    1 px = 1 dip if dpi == 160(mdpi), 480x320 screen
    3 px = 2 dip if dpi == 240(hdpi), 840x480 screen

Nói cách khác, nếu bạn thiết kế bố cục của bạn với chiều rộng bằng 160dip ở chế độ dọc, nó sẽ là một nửa màn hình trên tất cả các thiết bị ldpi / mdpi / hdpi (trừ máy tính bảng, tôi nghĩ vậy)


Những gì bạn đã trả lời là lý luận hợp lý đằng sau câu hỏi của tôi. Tôi hiểu điều này. Làm thế nào tôi nên mã này trong java để trong thời gian chạy bất kể độ phân giải màn hình là gì, độ rộng dpi chính xác được chọn bởi mã?
Khushboo

Hy vọng tôi có được nó ngay lúc này :) Sử dụng DisplayMetrics outMetrics = null; getWindowManager().getDefaultDisplay().getMetrics(outMetrics);trong Activity. Sau đó, outMetrics.densitysẽ cung cấp cho bạn hệ số tỷ lệ của thiết bị hiện tại, như đã nêu trong tài liệu
Mykhailo Gaidai

6

Làm thế nào về việc sử dụng này thay thế?

final DisplayMetrics displayMetrics=getResources().getDisplayMetrics();
final float screenWidthInDp=displayMetrics.widthPixels/displayMetrics.density;
final float screenHeightInDp=displayMetrics.heightPixels/displayMetrics.density;

6
DisplayMetrics displayMetrics = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

int width_px = Resources.getSystem().getDisplayMetrics().widthPixels;

int height_px =Resources.getSystem().getDisplayMetrics().heightPixels;

int pixeldpi = Resources.getSystem().getDisplayMetrics().densityDpi;


int width_dp = (width_px/pixeldpi)*160;
int height_dp = (height_px/pixeldpi)*160;

8
Xem xét đưa ra một số lời giải thích
bigbounty

5

Trả lời bằng kotlin:

  context?.let {
        val displayMetrics = it.resources.displayMetrics
        val dpHeight = displayMetrics.heightPixels / displayMetrics.density
        val dpWidth = displayMetrics.widthPixels / displayMetrics.density
    }

4

Đơn giản hóa cho Kotlin:

val widthDp = resources.displayMetrics.run { widthPixels / density }
val heightDp = resources.displayMetrics.run { heightPixels / density }

2

Nhận chiều rộng và chiều cao màn hình về DP với một số trang trí tốt:

Bước 1: Tạo giao diện

public interface ScreenInterface {

   float getWidth();

   float getHeight();

}

Bước 2: Tạo lớp người thực hiện

public class Screen implements ScreenInterface {
    private Activity activity;

    public Screen(Activity activity) {
        this.activity = activity;
    }

    private DisplayMetrics getScreenDimension(Activity activity) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        return displayMetrics;
    }

    private float getScreenDensity(Activity activity) {
        return activity.getResources().getDisplayMetrics().density;
    }

    @Override
    public float getWidth() {
        DisplayMetrics displayMetrics = getScreenDimension(activity);
        return displayMetrics.widthPixels / getScreenDensity(activity);
    }

    @Override
    public float getHeight() {
        DisplayMetrics displayMetrics = getScreenDimension(activity);
        return displayMetrics.heightPixels / getScreenDensity(activity);
    }
} 

Bước 3: Nhận chiều rộng và chiều cao trong hoạt động:

Screen screen = new Screen(this); // Setting Screen
screen.getWidth();
screen.getHeight();

Điều này có trả lại chiều cao và chiều rộng tính bằng pixel hoặc dp không?
TASlim Oseni

như được gọi là mật độ đó là lý do tại sao nó cung cấp cho bạn trong dp
Ali Azaz Alam

Tôi không nghĩ nên thêm tông màu vào ứng dụng của mình để giải quyết một nhiệm vụ đơn giản
Ruslan Berozov

Thưa ông, liệu bạn có nên triển khai lớp hay mã trực tiếp không. Từ lớp được xác định, bạn có thể dễ dàng trích xuất mã để thực hiện trực tiếp.
Ali Azaz Alam

0

Nếu bạn chỉ muốn biết về chiều rộng màn hình của mình, bạn chỉ có thể tìm kiếm "chiều rộng màn hình nhỏ nhất" trong tùy chọn nhà phát triển của mình. Bạn thậm chí có thể chỉnh sửa nó.


0

Thử cái này:

Display display   = getWindowManager().getDefaultDisplay();
Point displaySize = new Point();
display.getSize(displaySize);
int width  = displaySize.x;
int height = displaySize.y;

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.