Nhận chiều rộng và chiều cao màn hình trong Android


477

Làm cách nào tôi có thể nhận được chiều rộng và chiều cao màn hình và sử dụng giá trị này trong:

@Override protected void onMeasure(int widthSpecId, int heightSpecId) {
    Log.e(TAG, "onMeasure" + widthSpecId);
    setMeasuredDimension(SCREEN_WIDTH, SCREEN_HEIGHT - 
        game.findViewById(R.id.flag).getHeight());
}

Câu trả lời:


1001

Sử dụng mã này, bạn có thể nhận được chiều rộng và chiều cao của màn hình thời gian chạy:

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels;

Theo quan điểm bạn cần làm một cái gì đó như thế này:

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

Trong một số trường hợp, nơi thiết bị có thanh điều hướng, bạn phải kiểm tra khi chạy:

public boolean showNavigationBar(Resources resources)
{
    int id = resources.getIdentifier("config_showNavigationBar", "bool", "android");
    return id > 0 && resources.getBoolean(id);
}

Nếu thiết bị có thanh điều hướng, thì hãy đếm chiều cao của nó:

private int getNavigationBarHeight() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        int usableHeight = metrics.heightPixels;
        getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
        int realHeight = metrics.heightPixels;
        if (realHeight > usableHeight)
            return realHeight - usableHeight;
        else
            return 0;
    }
    return 0;
}

Vì vậy, chiều cao cuối cùng của thiết bị là:

int height = displayMetrics.heightPixels + getNavigationBarHeight();

33
Là chiều rộng và chiều cao được hoán đổi nếu thiết bị được xoay?
Madeyedexter

14
@Madeyedexter thì có.
Parag Chauhan

1
Nhưng bạn không còn có thể cho rằng bạn đang chạy trên màn hình mặc định.
satur9nine

1
hoặc chỉ đơn giản là sử dụng - getResource (). getDisplayMetrics (). heightPixels / getResource (). getDisplayMetrics (). widthPixels
Alex

1
@EpicPandaForce thực sự tôi đã nghĩ đến Android Oreo cho phép khởi chạy một hoạt động trên một màn hình khác, xem phần sau: developer.android.com/reference/android/app/iêu
satur9nine

275

Có một câu trả lời rất đơn giản và không có bối cảnh vượt qua

public static int getScreenWidth() {
    return Resources.getSystem().getDisplayMetrics().widthPixels;
}

public static int getScreenHeight() {
    return Resources.getSystem().getDisplayMetrics().heightPixels;
}

Lưu ý: nếu bạn muốn chiều cao bao gồm thanh điều hướng, hãy sử dụng phương pháp bên dưới

WindowManager windowManager =
        (WindowManager) BaseApplication.getApplication().getSystemService(Context.WINDOW_SERVICE);
    final Display display = windowManager.getDefaultDisplay();
    Point outPoint = new Point();
    if (Build.VERSION.SDK_INT >= 19) {
        // include navigation bar
        display.getRealSize(outPoint);
    } else {
        // exclude navigation bar
        display.getSize(outPoint);
    }
    if (outPoint.y > outPoint.x) {
        mRealSizeHeight = outPoint.y;
        mRealSizeWidth = outPoint.x;
    } else {
        mRealSizeHeight = outPoint.x;
        mRealSizeWidth = outPoint.y;
    }

3
Làm thế nào để có được tổng chiều cao màn hình? Phiên bản getScreenHeight này không bao gồm tất cả các thanh.
Jaydev

1
điều này hoạt động trong hầu hết các trường hợp, nhưng nó không thể có được chiều cao màn hình thực nếu thanh điều hướng hiển thị. chiều cao không bao gồm chiều cao của thanh.
L. Swifter

Điều này tạo ra kết quả bất thường cho tôi ở chế độ phong cảnh
Carson Holzheimer

1
Điều này sẽ gây rắc rối trên màn hình có nhiều màn hình (Foldables, máy tính xách tay Chrome OS)
EpicPandaForce

Chiều cao của thanh điều hướng không được bao gồm trong Android 4.4
mstoic

45

Chỉ cần cập nhật câu trả lời bằng parag và SpK để phù hợp với khả năng tương thích ngược SDK hiện tại từ các phương thức không dùng nữa:

int Measuredwidth = 0;  
int Measuredheight = 0;  
Point size = new Point();
WindowManager w = getWindowManager();

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)    {
    w.getDefaultDisplay().getSize(size);
    Measuredwidth = size.x;
    Measuredheight = size.y; 
}else{
    Display d = w.getDefaultDisplay(); 
    Measuredwidth = d.getWidth(); 
    Measuredheight = d.getHeight(); 
}

7
@digiphd mã của Parang có hoạt động trên tất cả các phiên bản API không? Tất cả các phương pháp đã được giới thiệu trước khi API cấp 8 và tôi không thấy chúng bị phản đối tại trang web dành cho nhà phát triển Android.
Sufian

@Sufian Tôi gặp sự cố khi nhận các giá trị trả về 0 từ việc getSizetriển khai trên Samsung Galaxy Mini (API 10) nhưng các phương thức không dùng trong câu trả lời này trả về chính xác. Vì vậy, điều này rất hữu ích cho các phiên bản Android cũ hơn.
Damien Diehl

@Sufian chúng ta có thể đặt kích thước mới cho chiều rộng và chiều cao màn hình không?
Srishti Roy

cái này đã bị khấu hao ngay bây giờ :(
cegprakash

24

Tại sao không

DisplayMetrics displaymetrics = getResource (). GetDisplayMetrics ();

sau đó sử dụng

displayMetrics. thongPixels (heightPixels)


13

Hãy thử mã dưới đây: -

1.

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

2.

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();  // deprecated
int height = display.getHeight();  // deprecated

hoặc là

int width = getWindowManager().getDefaultDisplay().getWidth(); 
int height = getWindowManager().getDefaultDisplay().getHeight();

3.

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

metrics.heightPixels;
metrics.widthPixels;

3
bạn không nghĩ 2 = 4
Trikaldarshi

Có nghĩa là phương pháp 2 của bạn bằng với phương pháp 4
Trikaldarshi

Có thể có được độ phân giải "tự nhiên" của thiết bị? có nghĩa là không có vấn đề gì nếu bạn xoay màn hình, bạn sẽ nhận được các giá trị tương tự cho chiều rộng và chiều cao và nếu đó là một chiếc máy tính bảng được sử dụng theo chiều ngang, nó sẽ trả về chiều rộng như chiều rộng thay vì chiều cao?
nhà phát triển Android

12

Rất dễ dàng để truy cập Android:

int width  = Resources.getSystem().getDisplayMetrics().widthPixels;
int height = Resources.getSystem().getDisplayMetrics().heightPixels;

cái này trả về 0 trên trình giả lập
l3ob

7

Dành cho người dùng kotlin

fun Activity.displayMetrics(): DisplayMetrics {
   val displayMetrics = DisplayMetrics()
   windowManager.defaultDisplay.getMetrics(displayMetrics)
   return displayMetrics
}

Và trong Activity bạn có thể sử dụng nó như

     resources.displayMetrics.let { displayMetrics ->
        val height = displayMetrics.heightPixels
        val width = displayMetrics.widthPixels
    }

Hoặc trong đoạn

    activity?.displayMetrics()?.run {
        val height = heightPixels
        val width = widthPixels
    }

6
DisplayMetrics dimension = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dimension);
        int width = dimension.widthPixels;
        int height = dimension.heightPixels;

6
DisplayMetrics lDisplayMetrics = getResources().getDisplayMetrics();
int widthPixels = lDisplayMetrics.widthPixels;
int heightPixels = lDisplayMetrics.heightPixels;

6

Lấy giá trị của chiều rộng và chiều cao màn hình.

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

4
Display display = ((WindowManager) this.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int mWidthScreen = display.getWidth();
int mHeightScreen = display.getHeight();

Không dùng nữa, hãy sử dụng DisplayMetrics ()
deyanm

4
public class DisplayInfo {
    int screen_height=0, screen_width=0;
    WindowManager wm;
    DisplayMetrics displaymetrics;

    DisplayInfo(Context context) {
        getdisplayheightWidth(context);
    }

    void getdisplayheightWidth(Context context) {
        wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        displaymetrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(displaymetrics);
        screen_height = displaymetrics.heightPixels;
        screen_width = displaymetrics.widthPixels;
    }

    public int getScreen_height() {
        return screen_height;
    }

    public int getScreen_width() {
        return screen_width;
    }
}

4

Không có câu trả lời nào ở đây hoạt động chính xác cho nhiều màn hình Chrome OS hoặc các thư mục sắp ra mắt.

Khi tìm cấu hình hiện tại, luôn luôn sử dụng cấu hình từ hoạt động hiện tại của bạn getResources().getConfiguration(). Không sử dụng cấu hình từ hoạt động nền của bạn hoặc cấu hình từ tài nguyên hệ thống. Hoạt động nền không có kích thước và cấu hình của hệ thống có thể chứa nhiều cửa sổ với kích thước và hướng xung đột nhau , do đó không có dữ liệu có thể sử dụng được.

Vì vậy, câu trả lời là

val config = context.getResources().getConfiguration()
val (screenWidthPx, screenHeightPx) = config.screenWidthDp.dp to config.screenHeightDp.dp

3

Các phương thức hiển thị ở đây không dùng nữa / lỗi thời nhưng điều này vẫn hoạt động. API 13 đầy đủ

kiểm tra nó

Display disp= getWindowManager().getDefaultDisplay();
Point dimensions = new Point();
disp.getSize(size);
int width = size.x;
int height = size.y;

3

Cách đầy đủ để làm điều đó, trả về độ phân giải thực:

            WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            Point size = new Point();
            wm.getDefaultDisplay().getRealSize(size);
            final int width = size.x, height = size.y;

Và vì điều này có thể thay đổi theo các hướng khác nhau, đây là một giải pháp (trong Kotlin), để làm cho đúng, bất kể định hướng:

/**
 * returns the natural orientation of the device: Configuration.ORIENTATION_LANDSCAPE or Configuration.ORIENTATION_PORTRAIT .<br></br>
 * The result should be consistent no matter the orientation of the device
 */
@JvmStatic
fun getScreenNaturalOrientation(context: Context): Int {
    //based on : http://stackoverflow.com/a/9888357/878126
    val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
    val config = context.resources.configuration
    val rotation = windowManager.defaultDisplay.rotation
    return if ((rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) && config.orientation == Configuration.ORIENTATION_LANDSCAPE || (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) && config.orientation == Configuration.ORIENTATION_PORTRAIT)
        Configuration.ORIENTATION_LANDSCAPE
    else
        Configuration.ORIENTATION_PORTRAIT
}

/**
 * returns the natural screen size (in pixels). The result should be consistent no matter the orientation of the device
 */
@JvmStatic
fun getScreenNaturalSize(context: Context): Point {
    val screenNaturalOrientation = getScreenNaturalOrientation(context)
    val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
    val point = Point()
    wm.defaultDisplay.getRealSize(point)
    val currentOrientation = context.resources.configuration.orientation
    if (currentOrientation == screenNaturalOrientation)
        return point
    else return Point(point.y, point.x)
}

1

Chỉ cần sử dụng hàm bên dưới trả về chiều rộng và chiều cao của kích thước màn hình dưới dạng một mảng các số nguyên

private int[] getScreenSIze(){
        DisplayMetrics displaymetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        int h = displaymetrics.heightPixels;
        int w = displaymetrics.widthPixels;

        int[] size={w,h};
        return size;

    }

Trên chức năng hoặc nút onCreate của bạn, nhấp vào thêm đoạn mã sau để xuất kích thước màn hình như bên dưới

 int[] screenSize= getScreenSIze();
        int width=screenSize[0];
        int height=screenSize[1];
        screenSizes.setText("Phone Screen sizes \n\n  width = "+width+" \n Height = "+height);

1

Hãy thử mã này cho Kotlin

 val display = windowManager.defaultDisplay
 val size = Point()
 display.getSize(size)
 var DEVICE_WIDTH = size.x
 var DEVICE_HEIGHT = size.y

1

Tôi sử dụng mã sau đây để có được kích thước màn hình

getWindow().getDecorView().getWidth()
getWindow().getDecorView().getHeight()

1

Tôi đã cập nhật câu trả lời cho ngôn ngữ Kotlin!

Đối với Kotlin: Bạn nên gọi Trình quản lý cửa sổ và lấy số liệu. Sau cách dễ dàng đó.

val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(displayMetrics)

var width = displayMetrics.widthPixels
var height = displayMetrics.heightPixels

Làm thế nào chúng ta có thể sử dụng nó một cách hiệu quả theo cách hoạt động độc lập với ngôn ngữ Kotlin?

Ở đây, tôi đã tạo một phương thức trong lớp Kotlin nói chung. Bạn có thể sử dụng nó trong tất cả các hoạt động.

private val T_GET_SCREEN_WIDTH:String = "screen_width"
private val T_GET_SCREEN_HEIGHT:String = "screen_height"

private fun getDeviceSizes(activity:Activity, whichSize:String):Int{

    val displayMetrics = DisplayMetrics()
    activity.windowManager.defaultDisplay.getMetrics(displayMetrics)

    return when (whichSize){
        T_GET_SCREEN_WIDTH -> displayMetrics.widthPixels
        T_GET_SCREEN_HEIGHT -> displayMetrics.heightPixels
        else -> 0 // Error
    }
}

Liên hệ: @canerkaseler


1
Có lẽ giải pháp tốt hơn nữa là tạo một hàm mở rộng cho lớp Activity.
Micer

0

Tôi tìm thấy câu trả lời hay nhất của Weigan trong trang này, đây là cách bạn có thể sử dụng nó trong Xamarin.Android:

public int GetScreenWidth()
{
    return Resources.System.DisplayMetrics.WidthPixels;
}

public int GetScreenHeight()
{
    return Resources.System.DisplayMetrics.HeightPixels;
}

0

Độ phân giải màn hình là tổng số pixel trong màn hình. Chương trình sau sẽ trích xuất độ phân giải màn hình của thiết bị. Nó sẽ in chiều rộng và chiều cao màn hình. Những giá trị đó được tính bằng pixel.

public static Point getScreenResolution(Context context) {
// get window managers
WindowManager manager =  (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
Display display = manager.getDefaultDisplay();
Point point = new Point();
display.getSize(point);

 // get width and height
 int width = point.x;
 int height = point.y;

 return point;

}


0

Bộ tiện ích này hoạt động với tính trừu tượng Kích thước trong Android.

Nó chứa một lớp SizeFromDisplay.java Bạn có thể sử dụng nó như thế này:

ISize size = new SizeFromDisplay(getWindowManager().getDefaultDisplay());
size.width();
size.hight();

0

Hai bước. Đầu tiên, mở rộng lớp Activity

class Example extends Activity

Thứ hai: Sử dụng mã này

 DisplayMetrics displayMetrics = new DisplayMetrics();
 WindowManager windowmanager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
 windowmanager.getDefaultDisplay().getMetrics(displayMetrics);
 int deviceWidth = displayMetrics.widthPixels;
 int deviceHeight = displayMetrics.heightPixels;

0
    int getScreenSize() {
        int screenSize = getResources().getConfiguration().screenLayout &
                Configuration.SCREENLAYOUT_SIZE_MASK;
//        String toastMsg = "Screen size is neither large, normal or small";
        Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
        int orientation = display.getRotation();

        int i = 0;
        switch (screenSize) {

            case Configuration.SCREENLAYOUT_SIZE_NORMAL:
                i = 1;
//                toastMsg = "Normal screen";
                break;
            case Configuration.SCREENLAYOUT_SIZE_SMALL:
                i = 1;
//                toastMsg = "Normal screen";
                break;
            case Configuration.SCREENLAYOUT_SIZE_LARGE:
//                toastMsg = "Large screen";
                if (orientation == Surface.ROTATION_90
                        || orientation == Surface.ROTATION_270) {
                    // TODO: add logic for landscape mode here
                    i = 2;
                } else {
                    i = 1;
                }


                break;
            case Configuration.SCREENLAYOUT_SIZE_XLARGE:
                if (orientation == Surface.ROTATION_90
                        || orientation == Surface.ROTATION_270) {
                    // TODO: add logic for landscape mode here
                    i = 4;
                } else {
                    i = 3;
                }

                break;


        }
//        customeToast(toastMsg);
        return i;
    }

-2
       @Override
        protected void onPostExecute(Drawable result) {
            Log.d("width",""+result.getIntrinsicWidth());
            urlDrawable.setBounds(0, 0, 0+result.getIntrinsicWidth(), 600);

            // change the reference of the current drawable to the result
            // from the HTTP call
            urlDrawable.drawable = result;

            // redraw the image by invalidating the container
            URLImageParser.this.container.invalidate();

            // For ICS
            URLImageParser.this.container.setHeight((400+URLImageParser.this.container.getHeight()
                    + result.getIntrinsicHeight()));

            // Pre ICS`enter code here`
            URLImageParser.this.container.setEllipsize(null);
        }

xin vui lòng viết một số giải thích cùng với mã. mã chỉ có câu trả lời thường không được khuyến khích trong SO --Review
Ram Ghadiyaram
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.