Cara mendapatkan dimensi layar sebagai piksel di Android

1843

Saya membuat beberapa elemen khusus, dan saya ingin secara terprogram menempatkannya di sudut kanan atas ( npiksel dari tepi atas dan mpiksel dari tepi kanan). Karena itu saya perlu mendapatkan lebar layar dan tinggi layar dan kemudian mengatur posisi:

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

Bagaimana saya mendapatkan screenWidthdan screenHeightdalam Kegiatan utama?

Niko Gamulin
sumber
Gunakan dp bukan px. karena itu akan mengubah tata letak Anda dengan perangkat lain ..
Jawad Zeb
Jangan lupa untuk mengalikan dengan getResources (). GetDisplayMetrics (). Density ke akun penskalaan tampilan
jmaculate
Ini membuktikan jawaban yang paling banyak dipilih tidak selalu yang terbaik (& banyak orang mengulangi jawaban untuk perwakilan). Alih-alih getSize dan kombo getWidth / getHeight (mengabaikan kesalahan), coba Balaji.K's getMetrics. Komentar Nik dalam jawabannya bahkan menjelaskan getDisplayMetricsuntuk mempertimbangkan ukuran sistem / status bar. Anda juga dapat menggunakan kepadatan sebagai jmaculate dan LoungeKatt menjelaskan memiliki nilai EXACT : DisplayMetrics dm = getResources().getDisplayMetrics(); float fwidth = dm.density * dm.widthPixels;Diuji di Android v2.2 (API 8) dan v4.0 dengan hasil yang baik dan tidak ada kesalahan / peringatan .
Armfoot
DisplayMetrics displaymetrics = DisplayMetrics baru (); getWindowManager (). getDefaultDisplay (). getMetrics (displaymetrics); int height = displaymetrics.heightPixels; int width = displaymetrics.widthPixels;
Azahar
cara lain untuk mendapatkan DisplayMetrics: Resources.getSystem().getDisplayMetrics(). Anda tidak akan memerlukannya Contextuntuk mendapatkannya.
Täg

Jawaban:

3479

Jika Anda ingin dimensi tampilan dalam piksel, Anda dapat menggunakan getSize:

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

Jika Anda tidak dalam, ActivityAnda bisa mendapatkan default Displaymelalui WINDOW_SERVICE:

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

Jika Anda berada dalam fragmen dan ingin menyelesaikan ini cukup gunakan Activity.WindowManager (di Xamarin.Android) atau getActivity (). GetWindowManager () (dalam java).

Sebelum getSizediperkenalkan (di API level 13), Anda bisa menggunakan getWidthdan getHeightmetode yang sudah usang:

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

Namun untuk kasus penggunaan yang Anda gambarkan, margin / padding di tata letak tampaknya lebih tepat.

Cara lain adalah: DisplayMetrics

Struktur yang menjelaskan informasi umum tentang tampilan, seperti ukurannya, kerapatan, dan penskalaan font. Untuk mengakses anggota DisplayMetrics, inisialisasi objek seperti ini:

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

Kita dapat menggunakan widthPixelsuntuk mendapatkan informasi untuk:

"Lebar absolut layar dalam piksel."

Contoh:

Log.d("ApplicationTagName", "Display width in px is " + metrics.widthPixels);
Josef Pfleger
sumber
13
getWidth () atau getSize ()? Apa yang akan saya gunakan jika saya membutuhkan aplikasi saya untuk berjalan di API <13 dan juga API> 13?
Carol
52
coba {display.getSize (ukuran); width = size.x; tinggi = size.y; } catch (NoSuchMethodError e) {width = display.getWidth (); tinggi = display.getHeight (); }
Arnaud
248
Saya tidak mengerti mengapa Anda ingin menggunakan try/catchcek semacam itu? Mengapa tidak menggunakan if (android.os.Build.VERSION.SDK_INT >= 13)saja tanpa ada pengecualian sama sekali? Saya menganggap try/catchdalam aliran aplikasi normal sebagai praktik buruk.
Patrik
2
@ A-Live maka aplikasi akan rusak juga (tetapi tidak menabrak). Kami, pengembang, harus memeriksa dulu versi os baru dan ini mungkin hanya menyembunyikan masalah. Juga dengan argumen ini kita bisa / harus mengelilingi setiap beberapa baris kode dengan try / catch, yang menurut saya adalah praktik buruk seperti yang sudah disebutkan.
Patrik
11
bagaimana jika Anda ingin mendapatkan ukuran layar tidak termasuk bilah navigasi dan / atau bilah pemberitahuan
pengembang android
375

Salah satu caranya adalah:

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

Itu sudah usang, dan Anda harus mencoba kode berikut sebagai gantinya. Dua baris kode pertama memberi Anda DisplayMetricsobjek. Benda ini berisi bidang-bidang seperti heightPixels, widthPixels.

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

int height = metrics.heightPixels;
int width = metrics.widthPixels;
Balaji.K
sumber
14
Perhatikan bahwa metrik (lebar, tinggi) berubah tergantung pada rotasi perangkat.
Tony Chan
8
Metrik akan mengembalikan ukuran tampilan, tetapi HoneyComb dan yang lebih tinggi, aktivitas Anda akan memiliki lebih sedikit ruang daripada yang dikembalikan karena bilah sistem.
Guy
3
@Beli itu tergantung pada implementasi Anda. Anda dapat menyembunyikan bilah status: requestWindowFeature (Window.FEATURE_NO_TITLE); getWindow (). setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
Hagai L
79
Juga ada cara ini: getContext (). GetResources (). GetDisplayMetrics (). WidthPixels
Nik
skala float akhir = getResources (). getDisplayMetrics (). density; int width = (int) (metrics.widthPixels * scale + 0.5f); - Anda harus memperhitungkan kepadatan perangkat saat melakukannya dengan cara itu.
Abandoned Cart
120

Mungkin tidak menjawab pertanyaan Anda, tetapi mungkin berguna untuk mengetahui (saya mencari sendiri ketika saya sampai pada pertanyaan ini) bahwa jika Anda memerlukan dimensi Tampilan tetapi kode Anda sedang dieksekusi ketika tata letaknya belum ditata (misalnya dalam onCreate()) Anda dapat mengatur ViewTreeObserver.OnGlobalLayoutListenerdengan View.getViewTreeObserver().addOnGlobalLayoutListener()dan memasukkan kode yang relevan yang membutuhkan dimensi tampilan di sana. Callback pendengar akan dipanggil ketika tata letak akan ditata.

Francesco Feltrinelli
sumber
atau cukup tulis view.post
Lukas Hanacek
view.post tidak dijamin berfungsi. Itu hanya solusi.
marsbear
@ marsbear di mana dikatakan View.post()tidak dijamin bekerja? Saya ingin tahu karena saya juga mengandalkan metode ini untuk mendapatkan ukuran Tampilan setelah tata letak dan tidak menyadarinya tidak dapat diandalkan.
Tony Chan
@ Turbo Saya mengatakan bahwa: p Kami menggunakan solusi itu sebelumnya dan ternyata tidak bisa diandalkan. Solusi itu didasarkan pada asumsi, bahwa tata letak awalnya dilakukan dalam giliran UIThread yang sama dengan inisialisasi. Karenanya Anda dapat menjadwalkan kode Anda untuk berjalan sebelum UI berikutnya melalui pos () dan baik-baik saja. Ternyata tata letak mungkin memakan waktu lebih lama dalam keadaan tertentu dan tampilan itu masih belum ditata ketika kode yang diposting berjalan. Apa yang saya lakukan sekarang adalah menambahkan ViewTreeObserver di onCreate dan menghapusnya setelah onLayout pertama. Init barang-barang Anda selama onLayout pertama itu.
marsbear
@ marsbear, apa bedanya dengan yang ViewAnda dapatkan ViewTreeObserver? Atau apakah mereka semua berbagi yang sama?
Tony Chan
109

(Jawaban 2012, mungkin kedaluwarsa) Jika Anda ingin mendukung pra Honeycomb, Anda harus memasukkan kompatibilitas sebelum API 13. Sesuatu seperti:

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

Tentu saja metode yang sudah usang pada akhirnya akan dikeluarkan dari SDK terbaru, tetapi sementara kami masih mengandalkan sebagian besar pengguna kami yang memiliki Android 2.1, 2.2 dan 2.3, inilah yang tersisa.

digiphd
sumber
Ya, ini kembali pada 2012.
digiphd
maaf, izinkan saya untuk menjelaskan apa yang saya maksud. Sangat tidak mungkin ada orang yang mendukung API <14 pada
6/22/2015
69

Saya telah mencoba semua "solusi" yang mungkin gagal dan saya perhatikan bahwa aplikasi "Dalvik Explorer" Elliott Hughes selalu menunjukkan dimensi yang benar pada perangkat Android / versi OS. Saya akhirnya melihat proyek open source-nya yang dapat ditemukan di sini: https://code.google.com/p/enh/

Inilah semua kode yang relevan:

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

EDIT: versi yang sedikit ditingkatkan (hindari pengecualian menembak pada versi OS yang tidak didukung):

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) {
}
Dragan Marjanović
sumber
9
Ini adalah satu-satunya posting di sini yang memperhitungkan dekorasi jendela (statusbar / menu bar). bekerja sangat baik untuk saya.
Andy Cochrane
5
Luar biasa, namun Anda seharusnya tidak pernah mengharapkan pengecualian logika bisnis. Pengecualian menembak (bahkan ketika tertangkap) mengerikan untuk kinerja. Plus Anda melakukan lebih banyak pekerjaan daripada yang diperlukan jika SDK_INT> 13. Sebaliknya, Anda hanya perlu menambahkan beberapa jika pada Build.VERSION.SDK_INT.
Erik B
3
@Erik B, saya setuju. Saya menambahkan versi yang ditingkatkan. Masih saya meninggalkan bagian "sejak SDK 1" kalau-kalau ada sesuatu yang salah dalam mencoba / menangkap (saya telah melihat banyak hal buruk di Android terutama ketika Anda berpikir itu tidak mungkin ada sesuatu yang salah jadi saya ingin tetap aman :)) . Lagi pula seharusnya tidak ada terlalu banyak overhead mouch karena perhitungan ini harus dilakukan hanya sekali (misalnya nilai dapat disimpan dalam beberapa atribut statis).
Dragan Marjanović
8
Perhatikan bahwa kode ini dilisensikan di bawah GPL v3 yang memiliki implikasi untuk digunakan dalam aplikasi produksi.
TalkLittle
GPL dan tergantung pada refleksi untuk memanggil metode yang mungkin tidak ada dalam versi Android yang akan datang. Mhhh
Michel
47

Cara termudah:

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

Untuk mengakses ketinggian bilah status untuk perangkat Android, kami lebih memilih cara terprogram untuk mendapatkannya:

Kode sampel

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

Variabel resultmemberikan tinggi dalam piksel.

Untuk akses cepat

Masukkan deskripsi gambar di sini

Untuk informasi lebih lanjut tentang ketinggian Title bar, Navigation bardan Content View, silakan lihat Ukuran Layar Perangkat Android .

Swapnil Sonar
sumber
Apa yang saya butuhkan! getResources().getDisplayMetrics().heightPixels + resultmemberikan tinggi layar penuh sebenarnya. Jawaban Dragan Marjanović juga bekerja tetapi saya lebih suka solusi yang jauh lebih singkat dan lebih sederhana ini.
Michel
Pendekatan ini sudah ketinggalan zaman pada Android Marshmallow. Tinggi bilah status dapat berubah dari perangkat atau versi Android. Lebih baik digunakan OnApplyWindowInsetsListener.
Heinrich
32

Pertama dapatkan view (mis. Oleh findViewById()) dan kemudian Anda bisa menggunakan getWidth () pada view itu sendiri.

Marcin Gil
sumber
3
Ini sebenarnya bagaimana dokumentasi memberitahu Anda untuk melakukannya ... tapi agak tidak ada gunanya jika Anda TIDAK menggunakan tampilan. Anda mungkin menggunakan sesuatu yang lain, misalnya mglsurfaceview.
gcb
2
ini lebih baik karena tampilan induk mungkin bukan ukuran layar. Tetapi pastikan bahwa ini dilakukan pada titik di mana tampilan yang Anda tanyakan ukurannya telah diletakkan, yang biasanya tidak akan berada di dalam onCreate (). Anda dapat menggunakan panggilan balik khusus dari onWindowFocusChanged (boolean hasFocus) yang akan dipanggil setelah semua tampilan telah diukur dan seterusnya, memastikan Anda tidak akan menerima dimensi yang salah untuk tampilan yang Anda minati ...
Dori
27

Saya memiliki dua fungsi, satu untuk mengirim konteks dan yang lainnya mendapatkan tinggi dan lebar dalam piksel:

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

dan

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;
}
Jorgesys
sumber
Anda perlu menambahkan @SuppressLint("NewApi")tepat di atas tanda tangan fungsi agar dapat dikompilasi.
Adil Malik
Saya pikir lebih baik mendapatkan tinggi dan lebar dalam sekali jalan daripada dalam panggilan terpisah ke API karena jika tidak mereka bisa tidak sinkron. Ini bisa terjadi jika orientasi layar berubah saat kode Anda sedang berjalan.
Sam
17

Untuk penskalaan dinamis menggunakan XML ada atribut yang disebut "android: layout_weight"

Contoh di bawah ini, yang dimodifikasi dari respons synic pada utas ini , memperlihatkan tombol yang mengambil 75% layar (bobot = .25) dan tampilan teks mengambil 25% layar yang tersisa (bobot = .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>
Crbreingan
sumber
17

Ini adalah kode yang saya gunakan untuk tugas:

// `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();
}

Tampak cukup bersih, namun tetap harus menjaga penghinaan.

Pijusn
sumber
17

Bukankah ini solusi yang jauh lebih baik? DisplayMetrics hadir dengan semua yang Anda butuhkan dan berfungsi dari 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;
}

Anda juga bisa mendapatkan tampilan aktual (termasuk dekorasi layar, seperti Bilah Status atau bilah navigasi perangkat lunak) menggunakan getRealMetrics , tetapi ini hanya berfungsi pada 17+ saja.

Apakah saya melewatkan sesuatu?

David Corsalini
sumber
1
Ini bukan mengurangi ruang untuk kontrol di layar (seperti pada Tablet atau perangkat Nexus). Juga, saya mendapatkan nilai yang berbeda (750 vs 800) pada Tablet 10 "saya, tergantung pada apakah Aktivitas aktif saat perhitungan dilakukan. Tetapi untuk tujuan saya, ini lebih dari cukup. Terima kasih!
Steven L
15

Hanya menambah jawaban Francesco. Pengamat lain yang lebih tepat, jika Anda ingin mengetahui lokasi di jendela atau lokasi di layar adalah ViewTreeObserver.OnPreDrawListener ()

Ini juga dapat digunakan untuk menemukan atribut lain dari tampilan yang sebagian besar tidak diketahui pada waktu onCreate () misalnya posisi yang digulir, posisi yang diskalakan.

pellucide
sumber
15

Menggunakan kode berikut dalam Aktivitas.

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

Temukan lebar dan tinggi layar:

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

Dengan ini, kita bisa mendapatkan SDK 13 terbaru dan di atas.

// 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);
}
NagarjunaReddy
sumber
15
DisplayMetrics dimension = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dimension);
int w = dimension.widthPixels;
int h = dimension.heightPixels;
Cristiana Chavez
sumber
12

Saya menemukan ini berhasil.

Rect dim = new Rect();
getWindowVisibleDisplayFrame(dim);
Justin
sumber
5
Keren tapi satu hal yang menakutkan tentang metode ini dalam kode sumber: komentar ini
Norbert
12

Perlu dikatakan, bahwa jika Anda tidak berada di Activity, tetapi di View(atau memiliki variabel Viewtipe dalam cakupan Anda), tidak perlu digunakan WINDOW_SERVICE. Maka Anda dapat menggunakan setidaknya dua cara.

Pertama:

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

Kedua:

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

Semua metode yang kami sebut di sini tidak usang.

Sergei Pikalev
sumber
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);
    }
}
Shoaib Ahmed
sumber
12

Untuk mendapatkan dimensi layar gunakan metrik tampilan

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

Dapatkan tinggi dan lebar dalam piksel

int width  =displayMetrics.widthPixels;
int height =displayMetrics.heightPixels;
Sharath kumar
sumber
9

Ini bukan jawaban untuk OP, karena ia ingin dimensi tampilan dalam piksel nyata. Saya ingin dimensi dalam "perangkat-independen-piksel", dan menyusun jawaban dari sini https://stackoverflow.com/a/17880012/253938 dan di sini https://stackoverflow.com/a/6656774/253938 saya datang dengan ini:

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

Anda bisa mendapatkan ukuran tinggi menggunakan:

getResources().getDisplayMetrics().heightPixels;

dan ukuran lebar menggunakan

getResources().getDisplayMetrics().widthPixels; 
Jéwôm '
sumber
8

Ada cara non-usang untuk melakukan ini menggunakan DisplayMetrics (API 1), yang menghindari kekacauan mencoba / menangkap:

 // 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;
paulrehkugler
sumber
8

Saya akan membungkus kode getSize seperti ini:

@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;
}
Simon
sumber
Ini macet pada emulator yang menjalankan Android 4.0 (API 14).
jww
6

Untuk yang mencari dimensi layar yang dapat digunakan tanpa Bilah Status dan Bilah Tindakan (juga berkat jawaban 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);
}
Francesco Vadicamo
sumber
6

Pertama-tama muat file XML dan kemudian tulis kode ini:

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

Tampilkan lebar dan tinggi sesuai resolusi layar Anda.

Duggu
sumber
6

Ikuti metode di bawah ini:

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;
}
sonida
sumber
6

Kotlin

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
}
Khemraj
sumber
5

Ada kalanya Anda perlu mengetahui dimensi tepat ruang yang tersedia untuk tata letak saat berada di aktivitas onCreate. Setelah beberapa pemikiran saya berhasil dengan cara ini.

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

Jika karena alasan tertentu Anda tidak ingin menambahkan aktivitas lain ke manifes Android, Anda dapat melakukannya dengan cara ini:

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
sumber
Jelas, Anda juga dapat melewatkan kembali tinggi dalam bungkusan juga.
Steve Waring
5

Jika Anda tidak ingin overhead WindowManagers, Points, atau Display, Anda dapat mengambil atribut tinggi dan lebar dari item View paling atas di XML Anda, asalkan tinggi dan lebarnya diatur ke match_parent. (Ini berlaku selama tata letak Anda memenuhi seluruh layar.)

Misalnya, jika XML Anda dimulai dengan sesuatu seperti ini:

<?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" >

Kemudian findViewById(R.id.entireLayout).getWidth()akan mengembalikan lebar layar dan findViewById(R.id.entireLayout).getHeight()akan mengembalikan tinggi layar.

Christinac
sumber