Dapatkan lebar dan tinggi layar di Android

477

Bagaimana saya bisa mendapatkan lebar dan tinggi layar dan menggunakan nilai ini di:

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

Jawaban:

1002

Dengan menggunakan kode ini, Anda bisa mendapatkan lebar & tinggi tampilan runtime:

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

Dalam pandangan Anda perlu melakukan sesuatu seperti ini:

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

Dalam beberapa skenario, di mana perangkat memiliki bilah navigasi, Anda harus memeriksa saat runtime:

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

Jika perangkat memiliki bilah navigasi, maka hitung ketinggiannya:

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

Jadi ketinggian akhir perangkat adalah:

int height = displayMetrics.heightPixels + getNavigationBarHeight();
Parag Chauhan
sumber
33
Apakah lebar dan tinggi ditukar jika perangkat diputar?
Madeyedexter
14
@Madeyedexter ya itu akan.
Parag Chauhan
1
Tetapi Anda tidak dapat lagi berasumsi bahwa Anda menjalankan pada tampilan default.
satur9nine
1
atau cukup gunakan - getResources (). getDisplayMetrics (). heightPixels / getResources (). getDisplayMetrics (). widthPixels
Alex
1
@EpicPandaForce sebenarnya saya memikirkan Android Oreo yang memungkinkan meluncurkan aktivitas pada tampilan lain, lihat yang berikut: developer.android.com/reference/android/app/…
satur9nine
275

Ada jawaban yang sangat sederhana dan tanpa konteks lulus

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

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

Catatan: jika Anda ingin ketinggian termasuk bilah navigasi, gunakan metode di bawah ini

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;
    }
Weigan
sumber
3
Bagaimana cara mendapatkan tinggi layar total? Versi getScreenHeight ini tidak termasuk semua bilah.
Jaydev
1
ini berfungsi dalam banyak kasus, tetapi tidak bisa mendapatkan ketinggian layar nyata jika bilah navigasi terlihat. ketinggian tidak termasuk ketinggian bar.
L. Swifter
Ini menghasilkan hasil yang tidak biasa bagi saya dalam mode lansekap
Carson Holzheimer
1
Ini akan menyebabkan masalah pada layar dengan banyak tampilan (Laptop Foldable, Chrome OS)
EpicPandaForce
Ketinggian bilah navigasi tidak termasuk dalam Android 4.4
mstoic
45

Hanya untuk memperbarui jawaban dengan paragraf dan SpK untuk menyelaraskan dengan kompatibilitas mundur SDK saat ini dari metode yang ditinggalkan:

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(); 
}
digiphd
sumber
7
@digiphd tidak akankah kode Parang berfungsi di semua versi API? Semua metode diperkenalkan sebelum API level 8 dan saya tidak menemukan mereka ditinggalkan di situs dev android.
Sufian
@ Sufian Saya mengalami masalah dalam mendapatkan nilai pengembalian non-0 dari getSizeimplementasi pada Samsung Galaxy Mini (API 10) tetapi metode yang sudah usang dalam jawaban ini kembali dengan benar. Jadi ini berguna untuk Android versi lama.
Damien Diehl
@Sufian dapatkah kita mengatur dimensi baru ke lebar dan tinggi layar?
Srishti Roy
ini disusutkan sekarang :(
cegprakash
24

Kenapa tidak

DisplayMetrics displaymetrics = getResources (). GetDisplayMetrics ();

lalu gunakan

displayMetrics.widthPixels (heightPixels)

wangqi060934
sumber
13

Coba kode di bawah ini: -

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

atau

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

3.

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

metrics.heightPixels;
metrics.widthPixels;
Duggu
sumber
3
jangan Anda pikir 2 = 4
Trikaldarshi
Berarti metode Anda 2 sama dengan metode 4
Trikaldarshi
Apakah mungkin untuk mendapatkan resolusi "alami" dari perangkat? berarti bahwa tidak masalah jika Anda memutar layar, Anda akan mendapatkan nilai yang sama untuk lebar & tinggi, dan bahwa jika tablet yang dimaksudkan untuk digunakan secara horizontal, itu akan mengembalikan lebar sebagai yang besar, bukan tinggi?
pengembang android
12

Sangat mudah untuk masuk ke Android:

int width  = Resources.getSystem().getDisplayMetrics().widthPixels;
int height = Resources.getSystem().getDisplayMetrics().heightPixels;
Ness Tyagi
sumber
ini mengembalikan 0 pada sebuah emulator
l3ob
7

Untuk pengguna kotlin

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

Dan di Activity Anda bisa menggunakannya seperti

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

Atau dalam fragmen

    activity?.displayMetrics()?.run {
        val height = heightPixels
        val width = widthPixels
    }
Ali mohammadi
sumber
6
DisplayMetrics dimension = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dimension);
        int width = dimension.widthPixels;
        int height = dimension.heightPixels;
Cristiana Chavez
sumber
6
DisplayMetrics lDisplayMetrics = getResources().getDisplayMetrics();
int widthPixels = lDisplayMetrics.widthPixels;
int heightPixels = lDisplayMetrics.heightPixels;
Shubham
sumber
6

Dapatkan nilai lebar dan tinggi layar.

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
width = size.x;
height = size.y;
Anil Singhania
sumber
4
Display display = ((WindowManager) this.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int mWidthScreen = display.getWidth();
int mHeightScreen = display.getHeight();
Rahul Yadav
sumber
Sudah usang
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;
    }
}
Habibur Rahman Ovie
sumber
4

Tidak ada satu pun jawaban di sini yang berfungsi dengan baik untuk beberapa tampilan Chrome OS, atau Lipat yang akan segera datang.

Saat mencari konfigurasi saat ini, selalu gunakan konfigurasi dari aktivitas Anda saat ini di getResources().getConfiguration(). Jangan gunakan konfigurasi dari aktivitas latar belakang Anda atau yang dari sumber daya sistem. Aktivitas latar belakang tidak memiliki ukuran, dan konfigurasi sistem mungkin berisi beberapa jendela dengan ukuran dan orientasi yang saling bertentangan , sehingga tidak ada data yang dapat digunakan yang dapat diekstraksi.

Jadi jawabannya adalah

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

Metode yang ditampilkan di sini sudah usang / ketinggalan zaman tetapi ini masih berfungsi. Memerlukan API 13

coba lihat

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

Cara lengkap untuk melakukannya, yang mengembalikan resolusi sebenarnya:

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

Dan karena ini dapat berubah pada orientasi yang berbeda, inilah solusinya (di Kotlin), untuk memperbaikinya terlepas dari orientasinya:

/**
 * 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)
}
pengembang android
sumber
1

Cukup gunakan fungsi di bawah ini yang mengembalikan lebar dan tinggi ukuran layar sebagai array bilangan bulat

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;

    }

Pada fungsi atau tombol onCreate Anda, klik tambahkan kode berikut untuk menampilkan ukuran layar seperti yang ditunjukkan di bawah ini

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

Coba kode ini untuk Kotlin

 val display = windowManager.defaultDisplay
 val size = Point()
 display.getSize(size)
 var DEVICE_WIDTH = size.x
 var DEVICE_HEIGHT = size.y
Najib Ahmed Puthawala
sumber
1

Saya menggunakan kode berikut untuk mendapatkan dimensi layar

getWindow().getDecorView().getWidth()
getWindow().getDecorView().getHeight()
Harsha
sumber
1

Saya memperbarui jawaban untuk bahasa Kotlin!

Untuk Kotlin: Anda harus memanggil Window Manager dan mendapatkan metrik. Setelah itu dengan cara mudah.

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

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

Bagaimana kita dapat menggunakannya secara efektif dalam aktivitas mandiri dengan bahasa Kotlin?

Di sini, saya membuat metode di kelas Kotlin umum. Anda bisa menggunakannya di semua aktivitas.

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

Hubungi: @canerkaseler

canerkaseler
sumber
1
Mungkin solusi yang lebih baik adalah dengan membuat fungsi ekstensi untuk kelas Activity.
Micer
0

Saya menemukan jawaban weigan terbaik di halaman ini, berikut adalah bagaimana Anda dapat menggunakannya di Xamarin.Android:

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

public int GetScreenHeight()
{
    return Resources.System.DisplayMetrics.HeightPixels;
}
Mehdi Dehghani
sumber
0

Resolusi layar adalah jumlah total piksel dalam layar. Program berikut akan mengekstraksi resolusi layar perangkat. Ini akan mencetak lebar dan tinggi layar. Nilai-nilai itu dalam 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;

}

Faxriddin Abdullayev
sumber
0

Ini set utilitas untuk bekerja dengan Ukuran abstraksi di Android.

Ini berisi kelas SizeFromDisplay.java Anda dapat menggunakannya seperti ini:

ISize size = new SizeFromDisplay(getWindowManager().getDefaultDisplay());
size.width();
size.hight();
Oleh Sokolov
sumber
0

Dua langkah. Pertama, rentangkan kelas Activity

class Example extends Activity

Kedua: Gunakan kode ini

 DisplayMetrics displayMetrics = new DisplayMetrics();
 WindowManager windowmanager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
 windowmanager.getDefaultDisplay().getMetrics(displayMetrics);
 int deviceWidth = displayMetrics.widthPixels;
 int deviceHeight = displayMetrics.heightPixels;
dgamer
sumber
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;
    }
pruthwiraj.kadam
sumber
-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);
        }
Aruttan Aru
sumber
tolong tulis beberapa penjelasan beserta kodenya. kode hanya jawaban yang umumnya tidak disarankan dalam SO --Review
Ram Ghadiyaram