Android에서 화면 너비 및 높이 가져 오기


477

화면 너비와 높이를 얻고이 값을 다음에서 사용하려면 어떻게해야합니까?

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

답변:


1000

이 코드를 사용하면 런타임 디스플레이의 너비 및 높이를 얻을 수 있습니다.

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

보기에서 다음과 같이해야합니다.

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

장치에 탐색 표시 줄이있는 일부 시나리오에서는 런타임에 확인해야합니다.

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

장치에 탐색 표시 줄이 있으면 높이를 계산하십시오.

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;
}

따라서 장치의 최종 높이는 다음과 같습니다.

int height = displayMetrics.heightPixels + getNavigationBarHeight();

33
장치가 회전하면 너비와 높이가 바뀌 었습니까?
Madeyedexter

14
@Madeyedexter 그렇습니다.
Parag Chauhan

1
그러나 더 이상 기본 디스플레이에서 실행되고 있다고 가정 할 수 없습니다.
satur9nine

1
또는 그냥 사용하십시오-getResources (). getDisplayMetrics (). heightPixels / getResources (). getDisplayMetrics (). widthPixels
Alex

1
: @EpicPandaForce 실제로 내가 다른 디스플레이에 활동을 시작 허용 안드로이드 오레오의 생각은 다음을 참조 developer.android.com/reference/android/app/...
satur9nine

275

패스 컨텍스트가없는 매우 간단한 답변이 있습니다.

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

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

참고 : 높이에 탐색 막대가 포함되도록하려면 아래 방법을 사용하십시오.

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
총 화면 높이를 얻는 방법? 이 getScreenHeight 버전은 모든 막대를 제외합니다.
Jaydev

1
대부분의 경우 작동하지만 탐색 모음이 표시되면 실제 화면 높이를 얻을 수 없습니다. 높이는 막대의 높이를 제외합니다.
L. Swifter

이 가로 모드에서 나를 위해 특별한 결과를 생산
카슨 Holzheimer에게

1
이것은 다중 디스플레이 (Foldables, 크롬 OS 노트북)와 화면에 문제의 원인이됩니다
EpicPandaForce

네비게이션 바의 높이는 안드로이드 4.4에 포함되어 있지 않습니다
mstoic

45

더 이상 사용되지 않는 메소드의 현재 SDK 이전 버전과 호환되도록 parag 및 SpK로 답변을 업데이트하십시오.

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는 Parang의 코드가 모든 API 버전에서 작동하지 않습니까? 모든 메소드는 API 레벨 8 이전에 도입되었으며 안드로이드 개발 사이트에서 더 이상 사용되지 않습니다.
Sufian

@Sufian getSizeSamsung Galaxy Mini (API 10) 의 구현 에서 0이 아닌 반환 값을 얻는 데 문제가 있었지만이 답변에서 더 이상 사용되지 않는 메소드는 올바르게 반환됩니다. 따라서 이것은 이전 버전의 Android에 유용합니다.
Damien Diehl

@Sufian 화면 너비와 높이에 새로운 치수를 설정할 수 있습니까?
Srishti Roy

이 :( 이제 감가 상각
cegprakash

24

왜 안돼?

DisplayMetrics displaymetrics = getResources (). getDisplayMetrics ();

그런 다음 사용

displayMetrics.widthPixels (높이 픽셀)


13

아래 코드를보십시오 :-

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

또는

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

삼.

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

metrics.heightPixels;
metrics.widthPixels;

3
당신은 생각하지 않습니다 2 = 4
Trikaldarshi

방법 2가 방법 4와 동일 함을 의미합니다
Trikaldarshi

장치의 "자연"해상도를 얻을 수 있습니까? 즉, 화면을 회전하더라도 너비와 높이에 대해 동일한 값을 얻을 수 있으며 가로로 사용하려는 태블릿 인 경우 너비 대신 높이 대신 큰 너비를 반환합니다.
안드로이드 개발자

12

안드로이드에 들어가는 것은 매우 쉽습니다.

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

이것은 에뮬레이터에서 0을 반환합니다
l3ob

7

kotlin 사용자의 경우

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

그리고 활동에서 당신은 그것을 사용할 수 있습니다

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

또는 조각

    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

화면 너비 및 높이 값을 가져옵니다.

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();

더 이상 사용되지 않음, 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

여기에 Chrome OS 다중 디스플레이 또는 곧 출시 될 Foldable에 대한 답변이 올바르게 작동하지 않습니다.

현재 구성을 찾을 때는 항상의 현재 활동 구성을 사용하십시오 getResources().getConfiguration(). 백그라운드 활동 또는 시스템 자원의 구성을 사용하지 마십시오. 백그라운드 활동에는 크기가 없으며 시스템 구성에는 크기와 방향이 충돌하는 여러 개의 창이 포함될 수 있으므로 사용 가능한 데이터를 추출 할 수 없습니다.

답은

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

3

여기에 표시된 메소드는 더 이상 사용되지 않거나 오래되었지만 여전히 작동합니다. API 13 필요

확인 해봐

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

3

그것을하는 완전한 방법은 진정한 해상도를 반환합니다.

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

그리고 이것은 다른 방향으로 바뀔 수 있기 때문에 방향에 상관없이 올바른 해결책을 제시합니다 (Kotlin).

/**
 * 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

화면 크기의 너비와 높이를 정수 배열로 반환하는 아래 함수를 사용하십시오.

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;

    }

onCreate 기능 또는 버튼을 클릭하면 다음 코드를 추가하여 화면 크기를 아래와 같이 출력하십시오.

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

1

Kotlin 에이 코드를 사용해보십시오

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

1

다음 코드를 사용하여 화면 크기를 가져옵니다.

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

1

Kotlin language에 대한 답변을 업데이트했습니다!

Kotlin의 경우 : Window Manager에 전화하여 메트릭을 가져와야합니다. 그 쉬운 방법 후.

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

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

Kotlin 언어를 사용하여 어떻게 독립적 인 활동 방식으로 효과적으로 사용할 수 있습니까?

여기에서는 일반적인 Kotlin 클래스의 메소드를 작성했습니다. 모든 활동에서 사용할 수 있습니다.

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
    }
}

연락처 : @canerkaseler


1
아마도 더 좋은 해결책은 Activity 클래스에 대한 확장 함수를 만드는 것입니다.
Micer

0

이 페이지 에서 weigan 의 답변 중 가장 좋은 것을 발견 했습니다 Xamarin.Android.

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

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

0

화면 해상도는 화면의 총 픽셀 수입니다. 다음 프로그램은 장치의 화면 해상도를 추출합니다. 화면 너비와 높이를 인쇄합니다. 그 값은 픽셀입니다.

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

두 단계. 먼저, 활동 클래스를 확장하십시오

class Example extends Activity

둘째 :이 코드를 사용하십시오

 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);
        }

코드와 함께 몇 가지 설명을 작성하십시오. 코드 만 답변은 일반적으로 SO --Review에 낙담
램 Ghadiyaram을
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.