Android'de çalışma zamanında dp veya dip açısından ekran genişliği nasıl belirlenir?


194

Dip / dp (java dosyalarında) kullanarak android widget düzenini kodlamak gerekiyor. Çalışma zamanında ben kod eğer

int pixel=this.getWindowManager().getDefaultDisplay().getWidth();

bu, ekran genişliğini piksel (piksel) olarak döndürür. Bunu dp'ye dönüştürmek için kodladım:

int dp =pixel/(int)getResources().getDisplayMetrics().density ;

Bu doğru cevabı vermiyor gibi görünüyor. Ekran çözünürlüğü 480 x 800 olan WVGA800'ün emülatörünü yaptım. Emülatörü çalıştırıp kodun piksel ve dp değerlerini yazdırmasına izin verdiğinizde, her ikisinde de 320'ye geldi. Bu emülatör ölçek faktörü 0.75 olan 240 dpi'dir.

Yanıtlar:


378

Bunu dene

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics ();
display.getMetrics(outMetrics);

float density  = getResources().getDisplayMetrics().density;
float dpHeight = outMetrics.heightPixels / density;
float dpWidth  = outMetrics.widthPixels / density;

VEYA

Teşekkürler @ Tomáš Hubálek

DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();    
float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;

91
WindowManager'ı aramak neden gereklidir? Bu kod ne olacak? DisplayMetrics displayMetrics = resources.getDisplayMetrics (); float screenWidthDp = displayMetrics.widthPixels / displayMetrics.density;
Tomáš Hubálek

2
Çok yüksek yoğunluklu bir ekran kullanarak bu benim için işe yaramadı. Ekranın sadece küçük bir kısmı varmış gibi. Bu çözüm benim için çalıştı: stackoverflow.com/a/18712361/956975 Display display = getWindowManager (). GetDefaultDisplay (); Nokta boyutu = yeni Nokta (); display.getSize (boyut); int width = size.x; int yükseklik = boyut. y;
marienke

1
@dsdsdsdsd: context, Context sınıfının herhangi bir örneğidir. En önemlisi, Etkinlik bir Bağlam alt sınıfıdır (bu yüzden bunu bir Etkinlikte kullanın ve bir Parçada getActivity () kullanın). Uygulama ve Hizmet aynı zamanda Bağlamın alt sınıflarıdır.
François POYER

112

Google'dan bu soru üzerine tökezledim ve daha sonra API> = 13 için geçerli kolay bir çözüm buldum.

İleride referans almak için:

Configuration configuration = yourActivity.getResources().getConfiguration();
int screenWidthDp = configuration.screenWidthDp; //The current width of the available screen space, in dp units, corresponding to screen width resource qualifier.
int smallestScreenWidthDp = configuration.smallestScreenWidthDp; //The smallest screen size an application will see in normal operation, corresponding to smallest screen width resource qualifier.

Bkz. Yapılandırma sınıfı başvurusu

Düzenleme: Nick Baicoianu tarafından belirtildiği gibi, bu ekranın kullanılabilir genişliği / yüksekliğini döndürür (en çok ilginç olanlar olmalıdır). Gerçek ekran boyutlarına ihtiyacınız varsa üst cevaba sadık kalın.


23
Configuration'ın screenWidthDp / screenHeightDp ile DisplayMetrics widthPixels / heightPixels arasındaki farklardan biri, Configuration'ın kullanılabilir ekran boyutlarını (eksi durum çubuğu vb.), DisplayMetrics ise tam ekran boyutlarını döndürmesidir.
Nick Baicoianu

Bu yalnızca API Seviye 13 ve yukarı
ono

@ NickBaicoiani'nin yorumuna eklemek için, hem getConfiguration () hem de getDisplayMetrics () yöntemleri çoklu pencere modunda çalışır. yani boyutlar ekranın değil pencereninkini yansıtır.
nmw

7

160'ın varsayılan yoğunluk değerini kaçırıyorsunuz.

    2 px = 3 dip if dpi == 80(ldpi), 320x240 screen
    1 px = 1 dip if dpi == 160(mdpi), 480x320 screen
    3 px = 2 dip if dpi == 240(hdpi), 840x480 screen

Başka bir deyişle, dikey modda 160dip'e eşit genişliğe sahip bir düzen tasarlarsanız, tüm ldpi / mdpi / hdpi cihazlarında ekranın yarısı olacaktır (tabletler hariç, sanırım)


Yanıtladığınız, sorumun arkasındaki mantıksal akıl yürütmedir. Bunu anladım. Java'da bunu nasıl kodlamalıyım ki, çalışma zamanında ekran çözünürlüğü ne olursa olsun, kod tarafından doğru dpi genişliği seçilir?
Khushboo

Umarım bu sefer doğru anladım :) DisplayMetrics outMetrics = null; getWindowManager().getDefaultDisplay().getMetrics(outMetrics);Aktivite içinde kullanın . Ardından, dokümanlardaoutMetrics.density belirtildiği gibi mevcut cihazın ölçek faktörünü verecektir
Mykhailo Gaidai

6

Bunun yerine kullanmaya ne dersiniz?

final DisplayMetrics displayMetrics=getResources().getDisplayMetrics();
final float screenWidthInDp=displayMetrics.widthPixels/displayMetrics.density;
final float screenHeightInDp=displayMetrics.heightPixels/displayMetrics.density;

6
DisplayMetrics displayMetrics = new DisplayMetrics();

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

int width_px = Resources.getSystem().getDisplayMetrics().widthPixels;

int height_px =Resources.getSystem().getDisplayMetrics().heightPixels;

int pixeldpi = Resources.getSystem().getDisplayMetrics().densityDpi;


int width_dp = (width_px/pixeldpi)*160;
int height_dp = (height_px/pixeldpi)*160;

8
Bazı açıklamalar
yapmayı

5

Kotlin'de cevap:

  context?.let {
        val displayMetrics = it.resources.displayMetrics
        val dpHeight = displayMetrics.heightPixels / displayMetrics.density
        val dpWidth = displayMetrics.widthPixels / displayMetrics.density
    }

4

Kotlin için basitleştirildi:

val widthDp = resources.displayMetrics.run { widthPixels / density }
val heightDp = resources.displayMetrics.run { heightPixels / density }

2

Bazı iyi dekorasyonlarla DP açısından Ekran Genişliği ve Yüksekliği alın:

1. Adım: Arayüz oluşturun

public interface ScreenInterface {

   float getWidth();

   float getHeight();

}

2. Adım: Uygulayıcı sınıfı oluşturma

public class Screen implements ScreenInterface {
    private Activity activity;

    public Screen(Activity activity) {
        this.activity = activity;
    }

    private DisplayMetrics getScreenDimension(Activity activity) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        return displayMetrics;
    }

    private float getScreenDensity(Activity activity) {
        return activity.getResources().getDisplayMetrics().density;
    }

    @Override
    public float getWidth() {
        DisplayMetrics displayMetrics = getScreenDimension(activity);
        return displayMetrics.widthPixels / getScreenDensity(activity);
    }

    @Override
    public float getHeight() {
        DisplayMetrics displayMetrics = getScreenDimension(activity);
        return displayMetrics.heightPixels / getScreenDensity(activity);
    }
} 

3. Adım: Etkinlikte genişlik ve yükseklik elde edin:

Screen screen = new Screen(this); // Setting Screen
screen.getWidth();
screen.getHeight();

Bu, piksel veya dp cinsinden yükseklik ve genişlik döndürüyor mu?
Taslim Oseni

denenity olarak adlandırılan bu yüzden onun dp vermek
Ali Azaz Alam

Basit bir görevi çözmek için uygulamanıza kod tonları eklemenin iyi bir fikir olduğunu sanmıyorum
Ruslan Berozov

Efendim, sınıfı uygulamak veya doğrudan kodlamak size kalmış. Tanımlanan sınıftan, doğrudan uygulama için kodu kolayca çıkarabilirsiniz.
Ali Azaz Alam

0

Sadece ekran genişliğinizi öğrenmek istiyorsanız, geliştirici seçeneklerinizde "en küçük ekran genişliği" ni arayabilirsiniz. Hatta düzenleyebilirsiniz.


0

Bunu dene:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.