안드로이드에서 화면 크기를 픽셀로 얻는 방법


1842

일부 사용자 지정 요소를 만들고 프로그래밍 방식으로 오른쪽 위 모서리 ( n위쪽 가장자리의 m픽셀 및 오른쪽 가장자리의 픽셀)에 배치하려고합니다 . 따라서 화면 너비와 화면 높이를 얻은 다음 위치를 설정해야합니다.

int px = screenWidth - m;
int py = screenHeight - n;

어떻게받을 수 있나요 screenWidth및 screenHeight주요 활동에?


px 대신 dp를 사용하십시오. 그것은 다른 장치와 레이아웃을 왜곡하기 때문에 ..
— Jawad Zeb

디스플레이 스케일링을 설명하기 위해 getResources (). getDisplayMetrics (). density를 곱하는 것을 잊지 마십시오
— jmaculate

이것은 가장 많이 찬성 된 답변이 항상 최고인 것은 아님을 증명합니다 (많은 사람들이 담당자에 대한 답변을 반복합니다). getSize 및 더 이상 사용되지 않는 getWidth / getHeight 콤보 (오류 무시) 대신 Balaji.K를 사용해보십시오 getMetrics. Nik의 답변에 getDisplayMetrics따르면 시스템 / 상태 막대 크기를 고려할 수도 있습니다. 또한 jmaculate와 LoungeKatt가 밀도 를 사용 하여 EXACT 값을 설명했습니다 : DisplayMetrics dm = getResources().getDisplayMetrics(); float fwidth = dm.density * dm.widthPixels;Android v2.2 (API 8) 및 v4.0에서 테스트되었으며 좋은 결과와 오류 / 경고가 없습니다 .
— Armfoot

DisplayMetrics displaymetrics = 새로운 DisplayMetrics (); getWindowManager (). getDefaultDisplay (). getMetrics (displaymetrics); int 높이 = displaymetrics.heightPixels; int width = displaymetrics.widthPixels;
— Azahar

DisplayMetrics를 얻는 또 다른 방법 : Resources.getSystem().getDisplayMetrics(). 당신은 Context그들을 얻을 필요가 없습니다 .
— Täg

답변:


3478

디스플레이 치수를 픽셀 단위로 사용하려면 getSize다음을 사용할 수 있습니다 .

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

당신이없는 경우를 통해 Activity기본값 Display을 얻을 수 있습니다 WINDOW_SERVICE:

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();

조각에 있고 이것을 완료하려면 Activity.WindowManager (Xamarin.Android) 또는 getActivity (). getWindowManager () (Java)를 사용하십시오.

getSizeAPI 레벨 13에서 도입 되기 전에는 더 이상 사용되지 않는 getWidth및 getHeight메소드를 사용할 수 있습니다 .

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

그러나 유스 케이스의 경우 레이아웃의 여백 / 패딩이 더 적합합니다.

다른 방법은 다음과 같습니다. DisplayMetrics

크기, 밀도 및 글꼴 크기 조정과 같은 디스플레이에 대한 일반적인 정보를 설명하는 구조입니다. DisplayMetrics 멤버에 액세스하려면 다음과 같이 개체를 초기화하십시오.

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

다음에 widthPixels대한 정보를 얻는 데 사용할 수 있습니다 .

"디스플레이의 절대 너비 (픽셀)"

예:

Log.d("ApplicationTagName", "Display width in px is " + metrics.widthPixels);

13
getWidth () 또는 getSize ()? API <13 및 API> 13에서 앱을 실행하려면 어떻게해야합니까?
— Carol

52
시도 {display.getSize (size); 너비 = size.x; 높이 = size.y; } catch (NoSuchMethodError e) {너비 = display.getWidth (); 높이 = display.getHeight (); }
— Arnaud

248
왜 try/catch그런 검사 에 사용하고 싶은지 모르겠 습니까? if (android.os.Build.VERSION.SDK_INT >= 13)예외없이 전혀 사용 하지 않는 것이 어떻습니까? 나는 try/catch정상적인 앱 흐름에서 나쁜 습관으로 생각합니다.
— Patrik

2
@ A-Live를 사용하면 앱도 중단됩니다 (그러나 충돌하지는 않습니다). 그럼에도 불구하고 개발자는 새로운 OS 버전을 미리 확인해야하며 이는 문제를 숨길 수도 있습니다. 또한이 인수를 사용하면 try / catch로 모든 코드 줄을 둘러 쌀 수 있어야합니다. 내 의견으로는 이미 언급 한 것처럼 나쁜 습관입니다.
— Patrik

11
탐색 표시 줄 및 / 또는 알림 표시 줄을 제외한 화면 크기를 얻으려면 어떻게해야
— Android 개발자

374

한 가지 방법은 다음과 같습니다.

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

더 이상 사용되지 않으며 대신 다음 코드를 시도해야합니다. 코드의 처음 두 줄은 목표를 제공합니다 DisplayMetrics. 이 객체가 같은 필드를 포함 heightPixels, widthPixels.

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

int height = metrics.heightPixels;
int width = metrics.widthPixels;

14
장치의 회전에 따라 메트릭 (너비, 높이)이 변경됩니다.
— Tony Chan

8
측정 항목은 디스플레이의 크기를 반환하지만 HoneyComb 이상은 시스템 표시 줄로 인해 반환 된 것보다 공간이 적습니다.
— Guy

3
@Guy 구현에 따라 다릅니다. 상태 표시 줄을 숨길 수 있습니다. requestWindowFeature (Window.FEATURE_NO_TITLE); getWindow (). setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
— Hagai L

79
getContext (). getResources (). getDisplayMetrics (). widthPixels
— Nik

최종 float 스케일 = getResources (). getDisplayMetrics (). density; int width = (int) (metrics.widthPixels * scale + 0.5f); -그렇게 할 때 장치 밀도를 고려해야합니다.
— 버려진 카트

119

귀하의 질문에 대답하지 않을 수도 있지만 View의 차원이 필요하지만 레이아웃이 아직 배치되지 않았을 때 코드가 실행되고 있음을 알면 유용합니다 (이 질문에 왔을 때 직접 찾고있었습니다) (예 :에서 onCreate()) ViewTreeObserver.OnGlobalLayoutListenerwith를 설정 View.getViewTreeObserver().addOnGlobalLayoutListener()하고 뷰의 크기가 필요한 관련 코드를 거기에 넣을 수 있습니다 . 레이아웃이 배치되면 리스너의 콜백이 호출됩니다.


또는 view.post를 작성하십시오
— Lukas Hanacek

view.post는 작동하지 않을 수 있습니다. 해결 방법 일뿐입니다.
— marsbear

@marsbear View.post()작동이 보장되지 않는 곳은 어디 입니까? 레이아웃 후에 View의 크기를 얻기 위해이 방법을 사용하고 신뢰할 수 없다는 것을 알고 있기 때문에 궁금합니다.
— Tony Chan

@Turbo 나는 다음과 같이 말한다 : p 우리는 이전에 그 해결 방법을 사용했으며 신뢰할 수없는 것으로 판명되었습니다. 이 해결 방법은 초기 레이아웃이 초기화와 동일한 UIThread 회전 내에서 수행된다는 가정을 기반으로합니다. 따라서 다음 UI가 post ()를 통해 전환되기 전에 코드가 실행되도록 예약하고 괜찮을 수 있습니다. 특정 상황에서 레이아웃이 훨씬 오래 걸릴 수 있으며 게시 된 코드가 실행될 때 뷰가 여전히 레이아웃되지 않았습니다. 내가 지금하는 일은 onCreate에 ViewTreeObserver를 추가하고 첫 번째 onLayout 후에 제거합니다. 첫 번째 onLayout 동안 물건을 초기화하십시오.
— marsbear

@marsbear View당신이 어느 것을 얻는 것이 중요 ViewTreeObserver합니까? 아니면 모두 같은 것을 공유합니까?
— Tony Chan

109

(2012 답변, 오래되었을 수 있습니다.) Honeycomb 이전 버전을 지원하려면 API 13 이전 버전과의 호환성을 설정해야합니다.

int measuredWidth = 0;
int measuredHeight = 0;
WindowManager w = getWindowManager();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    Point size = new Point();
    w.getDefaultDisplay().getSize(size);
    measuredWidth = size.x;
    measuredHeight = size.y;
} else {
    Display d = w.getDefaultDisplay();
    measuredWidth = d.getWidth();
    measuredHeight = d.getHeight();
}

물론 더 이상 사용되지 않는 메소드는 최신 SDK에서 제거되지만 Android 2.1, 2.2 및 2.3을 사용하는 대부분의 사용자에게 여전히 의존하지만 이것이 우리에게 남아 있습니다.


예, 이것은 2012 년에 다시 시작되었습니다.
— digiphd

죄송합니다. 제가 의미하는 바를 명확히하겠습니다.
— 2015 년

69

가능한 모든 "솔루션"을 시도했지만 Elliott Hughes의 "Dalvik Explorer"앱은 항상 모든 Android 기기 / OS 버전에서 올바른 치수를 표시합니다. https://code.google.com/p/enh/ 에서 찾을 수있는 그의 오픈 소스 프로젝트를 보았습니다.

모든 관련 코드는 다음과 같습니다.

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
try {
    // used when 17 > SDK_INT >= 14; includes window decorations (statusbar bar/menu bar)
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
try {
    // used when SDK_INT >= 17; includes window decorations (statusbar bar/menu bar)
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}

편집 : 약간 개선 된 버전 (지원되지 않는 OS 버전에서 발생하는 예외는 피하십시오) :

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
try {
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 17)
try {
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}

9
이것은 창 장식 (상태 표시 줄 / 메뉴 표시 줄)을 고려한 유일한 게시물입니다. 나를 위해 일했다.
— Andy Cochrane

5
그러나 비즈니스 로직 화재 예외를 예상해서는 안됩니다. 예외 발생 (발견 된 경우에도)은 성능이 끔찍합니다. 또한 SDK_INT가 13보다 큰 경우 필요한 것보다 많은 작업을 수행하고 있습니다. 대신 Build.VERSION.SDK_INT에 if를 추가해야합니다.
— Erik B

3
@Erik B, 동의합니다. 개선 된 버전을 추가했습니다. 여전히 시도 / 캐치에서 문제가 발생하는 경우를 대비하여 "SDK 1부터"부분을 남겼습니다. (안드로이드에서 특히 잘못된 것이 불가능하다고 생각할 때 많은 나쁜 점을 보았으므로 안전하게 유지하고 싶습니다.) . 어쨌든이 계산은 한 번만 수행되어야하기 때문에 너무 많은 오버 헤드가 발생하지 않아야합니다 (예 : 값은 일부 정적 속성에 유지 될 수 있음).
— Dragan Marjanović 2016 년

8
이 코드는 프로덕션 앱에서 사용하기 위해 GPL v3에 따라 라이센스가 부여됩니다.
— TalkLittle

GPL 및 향후 Android 버전에는 없을 수있는 호출 메소드 반영에 따라 다릅니다. Mhhh
— Michel

47

가장 간단한 방법 :

 int screenHeight = getResources().getDisplayMetrics().heightPixels;
 int screenWidth = getResources().getDisplayMetrics().widthPixels; 

46

Android 기기의 상태 표시 줄 높이에 액세스하려면 프로그래밍 방식으로 얻는 것이 좋습니다.

샘플 코드

int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
    result = getResources().getDimensionPixelSize(resId);
}

변수 result는 픽셀의 높이를 제공합니다.

빠른 액세스

여기에 이미지 설명을 입력하십시오

높이에 대한 자세한 내용은 Title bar, Navigation bar과 Content View에, 친절하게 살펴 Android 기기 화면 크기 .


내가 필요한 것! getResources().getDisplayMetrics().heightPixels + result실제 전체 화면 높이를 제공합니다. Dragan Marjanović의 답변도 효과가 있지만 더 짧고 간단한 솔루션을 선호합니다.
— Michel

이 접근법은 Android Marshmallow부터 구식입니다. 상태 표시 줄 높이는 기기 또는 Android 버전에서 변경 될 수 있습니다. 더 나은 사용 OnApplyWindowInsetsListener.
— 하인리히

32

먼저보기 (예 : by ) 를 얻은 다음보기 자체에서 getWidth () 를 findViewById()사용할 수 있습니다 .


3
이것은 실제로 문서가 지시하는 방법입니다 ...하지만보기를 사용하지 않으면 다소 의미가 없습니다. mglsurfaceview와 같은 다른 것을 사용하고있을 수 있습니다.
— gcb

2
부모보기가 디스플레이 크기가 아닐 수 있으므로 더 좋습니다. 그러나 크기를 쿼리하는 뷰가 이미 배치되어있는 시점 (일반적으로 onCreate () 안에 있지 않음)에서 수행해야합니다. onWindowFocusChanged (boolean hasFocus)에서 사용자 정의 콜백을 사용할 수 있습니다.이 뷰는 모든 뷰가 측정 된 후 호출되어 원하는 뷰에 대해 잘못된 치수를받지 않도록합니다.
— Dori

27

컨텍스트를 보내고 다른 하나는 높이와 너비를 픽셀 단위로 가져 오는 두 가지 기능이 있습니다.

public static int getWidth(Context mContext){
    int width=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>12){
        Point size = new Point();
        display.getSize(size);
        width = size.x;
    }
    else{
        width = display.getWidth();  // Deprecated
    }
    return width;
}

과

public static int getHeight(Context mContext){
    int height=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>12){
        Point size = new Point();
        display.getSize(size);
        height = size.y;
    }
    else{
        height = display.getHeight();  // Deprecated
    }
    return height;
}

@SuppressLint("NewApi")컴파일하려면 함수 서명 바로 위에 추가해야합니다 .
— Adil Malik

API에 대한 별도의 호출보다는 높이와 너비를 한 번에 얻는 것이 더 좋다고 생각합니다. 그렇지 않으면 동기화되지 않을 수 있기 때문입니다. 코드가 실행되는 동안 화면 방향이 변경되면 발생할 수 있습니다.
— Sam

17

XML을 사용하여 동적으로 확장하려면 "android : layout_weight"라는 속성이 있습니다.

이 스레드에 대한 synic의 응답에서 수정 된 아래 예제 는 화면의 75 % (무게 = .25)를 차지하는 버튼과 화면의 나머지 25 % (무게 = .75)를 차지하는 텍스트보기를 보여줍니다.

<LinearLayout android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight=".25"
        android:text="somebutton">

    <TextView android:layout_width="fill_parent"
        android:layout_height="Wrap_content"
        android:layout_weight=".75">
</LinearLayout>

17

이것은 작업에 사용하는 코드입니다.

// `activity` is an instance of Activity class.
Display display = activity.getWindowManager().getDefaultDisplay();
Point screen = new Point();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    display.getSize(screen);
} else {            
    screen.x = display.getWidth();
    screen.y = display.getHeight();
}

충분히 깨끗해 보이지만 더 이상 사용되지 않습니다.


17

이것이 훨씬 더 나은 해결책이 아닙니까? DisplayMetrics 는 API 1부터 필요한 모든 기능을 제공합니다.

public void getScreenInfo(){
    DisplayMetrics metrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);

    heightPixels = metrics.heightPixels;
    widthPixels = metrics.widthPixels;
    density = metrics.density;
    densityDpi = metrics.densityDpi;
}

getRealMetrics를 사용하여 실제 표시 (상태 표시 줄 또는 소프트웨어 탐색 표시 줄과 같은 화면 장식 포함)를 가져올 수도 있지만 17+에서만 작동합니다.

뭔가 빠졌습니까?


1
화면 제어 (예 : 태블릿 또는 Nexus 기기)를위한 공간을 빼지 않습니다. 또한, 나는 계산이 완료되면 활동의 활성화 여부에 따라, 제 10 "태블릿에 다른 값 (800 대 750)를 얻을하지만 내 목적이 더 잘보다 주셔서 감사합니다..!
— 스티븐 L

15

프란체스코의 답변에 추가하십시오. 창에서 위치 또는 화면에서 위치를 찾으려면 더 적합한 다른 관찰자는 ViewTreeObserver.OnPreDrawListener ()입니다.

또한 onCreate () 시간에 주로 알려지지 않은 뷰의 다른 속성 (예 : 스크롤 된 위치, 축척 된 위치)을 찾는 데 사용할 수 있습니다.


15

활동에서 다음 코드 사용

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int wwidth = metrics.widthPixels;

15

화면의 너비와 높이를 찾으십시오.

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

이를 사용하여 최신 SDK 13 이상을 얻을 수 있습니다.

// New width and height
int version = android.os.Build.VERSION.SDK_INT;
Log.i("", " name == "+ version);
Display display = getWindowManager().getDefaultDisplay();
int width;
if (version >= 13) {
    Point size = new Point();
    display.getSize(size);
    width = size.x;
    Log.i("width", "if =>" +width);
}
else {
    width = display.getWidth();
    Log.i("width", "else =>" +width);
}

15
DisplayMetrics dimension = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dimension);
int w = dimension.widthPixels;
int h = dimension.heightPixels;

12

나는 이것이 속임수임을 알았다.

Rect dim = new Rect();
getWindowVisibleDisplayFrame(dim);

5
쿨하지만 소스 코드 에서이 방법에 대한 무서운 것입니다 : 이 의견
— Norbert

12

말할 필요가 없지만에 Activity있지만 View(또는 View범위 에 유형 변수가있는 경우) 사용할 필요는 없습니다 WINDOW_SERVICE. 그런 다음 두 가지 이상의 방법을 사용할 수 있습니다.

먼저:

DisplayMetrics dm = yourView.getContext().getResources().getDisplayMetrics();

둘째:

DisplayMetrics dm = new DisplayMetrics();
yourView.getDisplay().getMetrics(dm);

여기서 호출하는이 모든 방법은 더 이상 사용되지 않습니다.


12
public class AndroidScreenActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        String str_ScreenSize = "The Android Screen is: "
                                   + dm.widthPixels
                                   + " x "
                                   + dm.heightPixels;

        TextView mScreenSize = (TextView) findViewById(R.id.strScreenSize);
        mScreenSize.setText(str_ScreenSize);
    }
}

11

화면 크기를 얻으려면 디스플레이 측정 항목을 사용하십시오.

DisplayMetrics displayMetrics = new DisplayMetrics();
if (context != null) 
      WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
      Display defaultDisplay = windowManager.getDefaultDisplay();
      defaultDisplay.getRealMetrics(displayMetrics);
    }

높이와 너비를 픽셀 단위로 가져옵니다

int width  =displayMetrics.widthPixels;
int height =displayMetrics.heightPixels;

9

실제 픽셀 단위의 디스플레이 크기를 원했기 때문에 이것은 OP에 대한 대답이 아닙니다. "장치 독립적 픽셀"의 치수를 원했고 여기 https://stackoverflow.com/a/17880012/253938 과 여기 https://stackoverflow.com/a/6656774/253938 에서 답변을 모았 습니다. 이것으로 :

    DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();
    int dpHeight = (int)(displayMetrics.heightPixels / displayMetrics.density + 0.5);
    int dpWidth = (int)(displayMetrics.widthPixels / displayMetrics.density + 0.5);

9

다음을 사용하여 높이 크기를 얻을 수 있습니다 .

getResources().getDisplayMetrics().heightPixels;

상기 폭 의 크기가 사용

getResources().getDisplayMetrics().widthPixels; 

8

try / catch 혼잡함을 피하는 DisplayMetrics (API 1)를 사용하여이 작업을 수행하는 데 사용되지 않는 방법이 있습니다.

 // initialize the DisplayMetrics object
 DisplayMetrics deviceDisplayMetrics = new DisplayMetrics();

 // populate the DisplayMetrics object with the display characteristics
 getWindowManager().getDefaultDisplay().getMetrics(deviceDisplayMetrics);

 // get the width and height
 screenWidth = deviceDisplayMetrics.widthPixels;
 screenHeight = deviceDisplayMetrics.heightPixels;

8

다음과 같이 getSize 코드를 래핑합니다.

@SuppressLint("NewApi")
public static Point getScreenSize(Activity a) {
    Point size = new Point();
    Display d = a.getWindowManager().getDefaultDisplay();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        d.getSize(size);
    } else {
        size.x = d.getWidth();
        size.y = d.getHeight();
    }
    return size;
}

Android 4.0 (API 14)을 실행하는 에뮬레이터에서 충돌이 발생합니다.
— jww

6

Swapnil의 답변 덕분에 상태 표시 줄 및 작업 표시 줄 없이 사용 가능한 화면 크기 를 검색하는 사람 :

DisplayMetrics dm = getResources().getDisplayMetrics();
float screen_w = dm.widthPixels;
float screen_h = dm.heightPixels;

int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
    screen_h -= getResources().getDimensionPixelSize(resId);
}

TypedValue typedValue = new TypedValue();
if(getTheme().resolveAttribute(android.R.attr.actionBarSize, typedValue, true)){
    screen_h -= getResources().getDimensionPixelSize(typedValue.resourceId);
}

6

먼저 XML 파일을로드 한 후 다음 코드를 작성하십시오.

setContentView(R.layout.main);      
Display display = getWindowManager().getDefaultDisplay();
final int width = (display.getWidth());
final int height = (display.getHeight());

화면 해상도에 따라 너비와 높이를 표시하십시오.


6

아래 방법을 따르십시오.

public static int getWidthScreen(Context context) {
    return getDisplayMetrics(context).widthPixels;
}

public static int getHeightScreen(Context context) {
    return getDisplayMetrics(context).heightPixels;
}

private static DisplayMetrics getDisplayMetrics(Context context) {
    DisplayMetrics displayMetrics = new DisplayMetrics();
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    wm.getDefaultDisplay().getMetrics(displayMetrics);
    return displayMetrics;
}

6

코 틀린

fun getScreenHeight(activity: Activity): Int {
    val metrics = DisplayMetrics()
    activity.windowManager.defaultDisplay.getMetrics(metrics)
    return metrics.heightPixels
}

fun getScreenWidth(activity: Activity): Int {
    val metrics = DisplayMetrics()
    activity.windowManager.defaultDisplay.getMetrics(metrics)
    return metrics.widthPixels
}

5

활동의 onCreate에있을 때 레이아웃에 사용 가능한 공간의 정확한 크기를 알아야하는 경우가 있습니다. 몇 가지 생각을 한 후에 나는이 작업을 수행했습니다.

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startActivityForResult(new Intent(this, Measure.class), 1);
        // Return without setting the layout, that will be done in onActivityResult.
    }

    @Override
    protected void onActivityResult (int requestCode, int resultCode, Intent data) {
        // Probably can never happen, but just in case.
        if (resultCode == RESULT_CANCELED) {
            finish();
            return;
        }
        int width = data.getIntExtra("Width", -1);
        // Width is now set to the precise available width, and a layout can now be created.            ...
    }
}

public final class Measure extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
       // Create a LinearLayout with a MeasureFrameLayout in it.
        // Just putting a subclass of LinearLayout in works fine, but to future proof things, I do it this way.
        LinearLayout linearLayout = new LinearLayout(this);
        LinearLayout.LayoutParams matchParent = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
        MeasureFrameLayout measureFrameLayout = new MeasureFrameLayout(this);
        measureFrameLayout.setLayoutParams(matchParent);
        linearLayout.addView(measureFrameLayout);
        this.addContentView(linearLayout, matchParent);
        // measureFrameLayout will now request this second activity to finish, sending back the width.
    }

    class MeasureFrameLayout extends FrameLayout {
        boolean finished = false;
        public MeasureFrameLayout(Context context) {
            super(context);
        }

        @SuppressLint("DrawAllocation")
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            if (finished) {
                return;
            }
            finished = true;
            // Send the width back as the result.
            Intent data = new Intent().putExtra("Width", MeasureSpec.getSize(widthMeasureSpec));
            Measure.this.setResult(Activity.RESULT_OK, data);
            // Tell this activity to finish, so the result is passed back.
            Measure.this.finish();
        }
    }
}

어떤 이유로 Android 매니페스트에 다른 활동을 추가하지 않으려는 경우 다음과 같이 할 수 있습니다.

public class MainActivity extends Activity {
    static Activity measuringActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        Bundle extras = getIntent().getExtras();
        if (extras == null) {
            extras = new Bundle();
        }
        int width = extras.getInt("Width", -2);
        if (width == -2) {
            // First time in, just start another copy of this activity.
            extras.putInt("Width", -1);
            startActivityForResult(new Intent(this, MainActivity.class).putExtras(extras), 1);
            // Return without setting the layout, that will be done in onActivityResult.
            return;
        }
        if (width == -1) {
            // Second time in, here is where the measurement takes place.
            // Create a LinearLayout with a MeasureFrameLayout in it.
            // Just putting a subclass of LinearLayout in works fine, but to future proof things, I do it this way.
            LinearLayout linearLayout = new LinearLayout(measuringActivity = this);
            LinearLayout.LayoutParams matchParent = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            MeasureFrameLayout measureFrameLayout = new MeasureFrameLayout(this);
            measureFrameLayout.setLayoutParams(matchParent);
            linearLayout.addView(measureFrameLayout);
            this.addContentView(linearLayout, matchParent);
            // measureFrameLayout will now request this second activity to finish, sending back the width.
        }
    }

    @Override
    protected void onActivityResult (int requestCode, int resultCode, Intent data) {
        // Probably can never happen, but just in case.
        if (resultCode == RESULT_CANCELED) {
            finish();
            return;
        }
        int width = data.getIntExtra("Width", -3);
        // Width is now set to the precise available width, and a layout can now be created. 
        ...
    }

class MeasureFrameLayout extends FrameLayout {
    boolean finished = false;
    public MeasureFrameLayout(Context context) {
        super(context);
    }

    @SuppressLint("DrawAllocation")
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (finished) {
            return;
        }
        finished = true;
        // Send the width back as the result.
        Intent data = new Intent().putExtra("Width", MeasureSpec.getSize(widthMeasureSpec));
        MainActivity.measuringActivity.setResult(Activity.RESULT_OK, data);
        // Tell the (second) activity to finish.
        MainActivity.measuringActivity.finish();
    }
}    

분명히 번들의 높이를 다시 전달할 수도 있습니다.
— Steve Waring 12

5

WindowManager, Points 또는 Displays의 오버 헤드를 원하지 않는 경우, 높이와 너비가 match_parent로 설정되어 있으면 XML에서 최상위 View 항목의 높이와 너비 속성을 가져올 수 있습니다. 레이아웃이 전체 화면을 차지하는 한 사실입니다.

예를 들어, XML이 다음과 같이 시작되는 경우 :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/entireLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

그런 다음 findViewById(R.id.entireLayout).getWidth()화면 너비 findViewById(R.id.entireLayout).getHeight()를 반환하고 화면 높이를 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.