Soru Ekran boyutlarını piksel olarak al


Bazı özel öğeler yarattım ve bunları programsal olarak sağ üst köşeye yerleştirmek istiyorum (n üst kenardan pikseller ve m sağ kenardan pikseller). Bu yüzden ekran genişliğini ve ekran yüksekliğini almalı ve sonra pozisyonunu ayarlamalıyım:

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

Nasıl alabilirim screenWidth ve screenHeight ana faaliyette?


1672
2018-06-19 08:25


Menşei


Px yerine dp kullanın. çünkü düzeninizi diğer cihazlarla deforme edecektir. - Nepster
Ekran ölçeklendirmesini hesaba katmak için getResources (). GetDisplayMetrics (). - jmaculate
Bu, en çok oylanan yanıtın her zaman en iyisi olmadığını kanıtlıyor (ve birçok kişi rep için cevapları tekrarlıyor). GetSize yerine getWidth / getHeight combo'yu (hataları göz ardı ederek) onayladıktan sonra Balaji.K'yi deneyin. getMetrics. Nik'in cevabındaki yorumu bile açıklıyor getDisplayMetrics Sistem / durum çubuğu boyutunu dikkate almak. Ayrıca kullanabilirsiniz yoğunluk jmaculate ve LoungeKatt sahip olduğu açıkladı TAM değeri:DisplayMetrics dm = getResources().getDisplayMetrics(); float fwidth = dm.density * dm.widthPixels; Android v2.2 (API 8) ve v4.0'da iyi sonuçlarla test edildi ve hata / uyarı yok. - Armfoot
DisplayMetrics displaymetrics = new DisplayMetrics (); . GetWindowManager () getDefaultDisplay () getMetrics (displaymetrics.); int height = displaymetrics.heightPixels; int width = displaymetrics.widthPixels; - Azahar


Cevaplar:


Görüntüleme boyutlarının piksel cinsinden olmasını isterseniz getSize:

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

Eğer içinde değilsen Activity varsayılanı alabilirsiniz Display üzerinden WINDOW_SERVICE:

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

Önce getSize (API düzeyinde 13) tanıtıldı, kullanabilirsiniz getWidth ve getHeight şimdi kullanımdan kaldırılan yöntemler:

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

Ancak, açıkladığınız kullanım durumu için, düzende bir kenar boşluğu / dolgu daha uygun görünüyor.

Başka bir yol: DisplayMetrics

Boyutu, yoğunluğu ve yazı tipi ölçeklendirme gibi bir ekran hakkında genel bilgileri açıklayan bir yapı. DisplayMetrics üyelerine erişmek için, böyle bir nesneyi başlangıç ​​durumuna getirin:

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

Kullanabiliriz widthPixels bilgi almak için:

"Ekranın piksel cinsinden mutlak genişliği."

Örnek:

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

3328
2018-06-19 08:41



developer.android.com/reference/android/view/Display.html - gcb
getWidth () veya getSize ()? Uygulamamın API <13 yanı sıra API> 13 üzerinde çalışabilmesi için ne gerekir? - Carol
{display.getSize (boyut) deneyin; width = size.x; yükseklik = size.y; } yakalamak (NoSuchMethodError e) {width = display.getWidth (); yükseklik = display.getHeight (); } - Arnaud
Neden kullanmak istediğini anlamıyorum try/catch böyle bir çek için? Neden sadece kullanımı değil if (android.os.Build.VERSION.SDK_INT >= 13) Hiç atılma istisnası olmadan? Düşünüyorum try/catch Kötü bir uygulama olarak normal bir uygulama akışında. - CipherCom
Gezinme çubuğu ve / veya bildirim çubuğu hariç ekran boyutunu almak isterseniz - android developer


Tek yol:

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

Kullanımdan kaldırıldı ve bunun yerine aşağıdaki kodu denemelisiniz. İlk iki kod satırı size DisplayMetrics nesnelerini verir. Bu nesneler heightPixels, widthPixels gibi alanları içerir.

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

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

350
2018-01-31 02:01



Metrelerin (genişlik, yükseklik) cihazın dönüşüne bağlı olarak değiştiğini unutmayın. - Tony Chan
Metrikler ekranın boyutunu döndürür, ancak HoneyComb ve yukarı, etkinliğiniz sistem çubuğuna bağlı olarak geri döndürüldüğünden daha az alana sahip olacaktır. - Guy
@Guy uygulamanıza bağlıdır. Durum çubuğunu gizleyebilirsiniz: requestWindowFeature (Window.FEATURE_NO_TITLE); getWindow (). setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); - Hagai L
Ayrıca şu şekilde var: getContext (). GetResources (). GetDisplayMetrics (). WidthPixels - Nik
son float ölçeği = getResources (). getDisplayMetrics (). int width = (int) (metrics.widthPixels * ölçek + 0.5f); - Bunu yaparken cihaz yoğunluğunu hesaba katmalısınız. - Abandoned Cart


Sorunuza cevap vermeyebilir, ancak (bu soruya geldiğimde kendimi arıyordum) bilmeniz faydalı olabilir. Eğer bir Görüşün boyutuna ihtiyacınız varsa ancak düzeniniz henüz düzenlenmemişse kodunuz yürütülür. (örneğin onCreate() ) bir kurulum yapabilirsiniz ViewTreeObserver.OnGlobalLayoutListener ile View.getViewTreeObserver().addOnGlobalLayoutListener() ve görünümün boyutuna ihtiyacı olan ilgili kodu oraya koyun. Yerleşim düzenlendiğinde dinleyicinin geri çağrısı çağrılacaktır.


111
2018-04-06 21:23



veya sadece view.post yazın - Lukas Hanacek
hızlı uygulama için bir özlem :) gist.github.com/doridori/9208247 - Dori
Ancak, view.post'un çalışması garanti edilmez. Bu sadece bir çözümdür. - marsbear
@marsbear nerede diyor View.post() çalışmak garanti edilmiyor mu? Merak ediyorum, çünkü aynı zamanda, bir Görünümün düzeninden sonra boyutunu elde etmek için bu yönteme güveniyorum ve güvenilmez olduğunu bilmiyordum. - Tony Chan
@Turbo Şunu söylüyorum: p Daha önce bu çözümü kullandık ve güvenilmez olduğu ortaya çıktı. Bu geçici çözüm varsayımına dayanır, başlangıçta yerleşim düzeni başlatma ile aynı UIThread dönüşünde yapılır. Bu nedenle, kodunuzu bir sonraki UI'nin önüne post () ile dönmeden önce çalışacak şekilde planlayabilir ve iyi olabilirsiniz. Düzenlemenin, belirli koşullar altında daha uzun sürebildiği ve yayınlanan kod çalıştırıldığında görünümün henüz düzenlenmediği ortaya çıktı. Şu anda yaptığım şey, ViewChieldObserver'ı onCreate'a eklemek ve ilk onLayout'tan sonra kaldırmaktır. İlk çıkıştaki eşyalarını init. - marsbear


(2012 cevabı güncel olmayabilir) Ön Honeycomb'u desteklemek istiyorsanız, API 13'den önce geriye dönük uyumluluk sağlamanız gerekecektir.

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

Elbette, kullanımdan kaldırılan yöntemler en son SDK'lardan çıkarılacak olsa da, Android 2.1, 2.2 ve 2.3'e sahip kullanıcılarımızın çoğuna hala güveniyoruz.


103
2017-07-24 03:14



Evet, bu 2012'de geri döndü. - digiphd
üzgünüm, ne demek istediğimi açıklamama izin ver. 6/22/2015 tarihinden itibaren API <14'ü destekleyecek herkes çok olası değildir. - sudocoder


Tüm olası "çözümleri" denemeyi denedim ve Elliott Hughes'un "Dalvik Explorer" uygulamasının her zaman Android cihaz / OS sürümünde doğru boyutu gösterdiğinin farkına vardım. Burada bulunan açık kaynak projesine baktım: https://code.google.com/p/enh/

İşte bütün ilgili kod:

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

DÜZENLEME: biraz geliştirilmiş sürüm (desteklenmeyen işletim sistemi sürümünde istisnaları önlemek için):

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

62
2018-03-29 08:15



Pencere süslemeleri (statusbar / menu bar) göz önüne alındığında burada tek mesaj budur. benim için harika çalıştı. - Andy Cochrane
Harika, ancak hiçbir zaman iş mantığı ile ilgili yangın istisnalarını beklememelisiniz. İstisna ateşleme (yakalandığında bile) performans için korkunçtur. Ayrıca, SDK_INT değeri> 13 ise, ihtiyaç duyduğunuzdan daha fazla iş yapıyorsunuz. Bunun yerine, Build.VERSION.SDK_INT üzerinde bazı iflar eklemelisiniz. - Erik B
@Erik B, katılıyorum. Geliştirilmiş versiyonu ekledim. Yine de "SDK 1'den beri" denemeye başladım, sadece bir şeyler denemede / yakalamada (Android'de çok kötü şeyler gördüm, özellikle de yanlış giden bir şeyin imkansız olduğunu düşündüğümde bu yüzden onu güvende tutmak istiyorum :)) . Her neyse, bu hesaplama sadece bir kez yapılmalıdır (ör. Değerler bazı statik özelliklerde tutulabilir). - Dragan Marjanović
Bu kodun, üretim uygulamalarında kullanım için sonuçları olan GPL v3 kapsamında lisanslandığını unutmayın. - TalkLittle
GPL ve gelecekteki Android sürümlerinde bulunmayabilecek arama yöntemlerine yansıma bağlı. mhhh - Michel


Android cihazlar için durum çubuğunun yüksekliğine erişmek için, onu almak için programatik bir yol tercih ediyoruz:

Basit kod

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

Değişken result pikselde yüksekliği verir.

Hızlı erişim için

Enter image description here

Yüksekliği hakkında daha fazla bilgi için Title bar, Navigation bar ve Content View, lütfen dikkat et Android Cihaz Ekran Boyutları.


43
2017-08-27 13:12



Sadece ihtiyacım olan şey! getResources().getDisplayMetrics().heightPixels + result gerçek tam ekran yüksekliği verir. Dragan Marjanović'in cevabı da işe yarıyor, ancak bu daha kısa ve daha basit bir çözümü tercih ediyorum. - Michel
Bu yaklaşım Android Marshmallow'un eseridir. Durum çubuğu yüksekliği cihazdan veya Android sürümünden değişebilir. Daha iyi kullanım OnApplyWindowInsetsListener. - Heinrich


En basit yol:

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

42
2017-11-26 10:47



Ayrıca, benim için çalışan tüm bu çözümlerden sadece bir tanesi - ShadowGod
yol budur. (E) - Ahsan Sher
Aynı şeyi yapmak için basit fonksiyon .. Bu mesajı gör whats-online.info/science-and-tutorials/121/... - Daniel Nyamasyo


İlk önce görünüm alın (ör., findViewById()) ve sonra kullanabilirsiniz GetWidth () görünümün kendisi.


28
2018-06-19 08:38



Bu aslında belgelerin size bunu yapmasını söyler ... ama bir manzara kullanmıyorsanız anlamsızdır. Başka bir şey kullanıyor olabilirsiniz, ör. mglsurfaceview. - gcb
Ebeveyn görüşü ekranın boyutu olmayabilir, bu daha iyidir. Ancak, bunun, büyüklüğü sorgulandıran görünümün önceden düzenlenmiş olduğu, genellikle onCreate () içinde olmayacağı bir noktada yapıldığından emin olun. Tüm görünümler ölçüldükten sonra çağrılacak olan onWindowFocusChanged'den (boolean hasFocus) özel bir geri çağırma kullanabilir ve ilginizi çeken görünüm için yanlış boyutlar almazsınız. - Dori


İçeriği göndermek için diğeri piksel cinsinden yüksekliği ve genişliği almak için iki fonksiyonum var:

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

ve

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

24
2017-10-17 14:44



Eklemelisin @SuppressLint("NewApi") Derlemek için fonksiyon imzasının hemen üstünde. - Adil Malik
API'lara yapılan ayrı çağrılardan ziyade boy ve genişliği bir seferde elde etmek daha iyi olur, çünkü aksi halde senkronizasyon dışı olabilir. Kod çalışırken ekran yönlendirmesi değişiyorsa bu olabilir. - Sam


XML kullanarak dinamik ölçekleme için "android: layout_weight" adında bir özellik var.

Aşağıdaki örnek, senkronizasyonun yanıtından değiştirilmiştir bu konuEkranın% 75'ini (ağırlık = .25) ve ekranın kalan% 25'ini alan bir metin görünümünü (ağırlık = .75) alan bir düğme gösterir.

<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
2017-12-22 06:11





Bu görev için kullandığım kod:

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

Yeterince temiz görünüyor, ve kullanımdan mahrum bırakıyor.


17
2017-12-27 14:31