Bir Android cihazının HDPI ekranı veya MDPI ekranı olup olmadığı nasıl kontrol edilir?


121

İnternet üzerinden farklı görüntüler almak için bunu kontrol etmek istiyorum. Bu nasıl yapılır?

Yanıtlar:


221
density = getResources().getDisplayMetrics().density;

// return 0.75 if it's LDPI
// return 1.0 if it's MDPI
// return 1.5 if it's HDPI
// return 2.0 if it's XHDPI
// return 3.0 if it's XXHDPI
// return 4.0 if it's XXXHDPI


1
@SteD bir cihazın ne olacağını söylemek mümkün mü? Örneğin, dpi'nin kepçe aralığının ortasında 140 olduğu durumu düşünün. aşağı veya yukarı yuvarlanıyor mu?
— vel

tvdpi yaklaşık 1.3
— Ethan_AI

3
Nexus 6p için 3.5 alıyorum, hangi kategoriye girecek?
— Manohar Reddy

2
oneplus3T'de 2.625 var, bunu ne olarak düşünmeliyiz?
— Parth Anjaria

188

Ekran yoğunluğunu aşağıdakilerle kontrol edebilirsiniz:

switch (getResources().getDisplayMetrics().densityDpi) {
case DisplayMetrics.DENSITY_LOW:
    // ...
    break;
case DisplayMetrics.DENSITY_MEDIUM:
    // ...
    break;
case DisplayMetrics.DENSITY_HIGH:
    // ...
    break;
case DisplayMetrics.DENSITY_XHIGH:
    // ...
    break;
}

DÜZENLE Android geliştikçe switchvakalara başka değerlerin de dahil edilmesi gerektiğini unutmayın . Bu düzenleme itibariyle, buna DisplayMetrics.DENSITY_TVve dahildir DisplayMetrics.DENSITY_XXHIGH. Consult docs son bilgi için; Bu cevabı sürdürmeye zahmet etmeyeceğim.


SDK seviye 4 (platform 1.6) ve üzerinde var olması gerekiyordu. Hangi SDK seviyesini kullanıyorsunuz? (SDK 3'te, densitySteD tarafından önerildiği gibi kullanabilirsiniz .)
— Ted Hopp

Platform1.5'i hedeflemem gerekiyor. Aşağıdaki cevap benim isteğim için uygun olabilir.
— virsir

4
Aşağıdaki cevap şimdi yukarıdaki cevaptır, daha genel olması gerekir;)
— Neil

Bilginize, bazı yeni cihazlarda (Nexus 7 gibi) DENSITY_TV'yi de eklemelisiniz.
— annie

1
@annie - İyi nokta. Teşekkürler. API seviyesi 16'dan itibaren, bunu da içermelidir DENSITY_XXHIGH. Gelecekteki tüm vakaları kapsayacak şekilde cevaba bir sorumluluk reddi beyanı ekledim. :)
— Ted Hopp

10

2018 itibariyle aşağıdaki yöntemi kullanabilirsiniz -

    public static String getDeviceDensityString(Context context) {
    switch (context.getResources().getDisplayMetrics().densityDpi) {
        case DisplayMetrics.DENSITY_LOW:
            return "ldpi";
        case DisplayMetrics.DENSITY_MEDIUM:
            return "mdpi";
        case DisplayMetrics.DENSITY_TV:
        case DisplayMetrics.DENSITY_HIGH:
            return "hdpi";
        case DisplayMetrics.DENSITY_260:
        case DisplayMetrics.DENSITY_280:
        case DisplayMetrics.DENSITY_300:
        case DisplayMetrics.DENSITY_XHIGH:
            return "xhdpi";
        case DisplayMetrics.DENSITY_340:
        case DisplayMetrics.DENSITY_360:
        case DisplayMetrics.DENSITY_400:
        case DisplayMetrics.DENSITY_420:
        case DisplayMetrics.DENSITY_440:
        case DisplayMetrics.DENSITY_XXHIGH:
            return "xxhdpi";
        case DisplayMetrics.DENSITY_560:
        case DisplayMetrics.DENSITY_XXXHIGH:
            return "xxxhdpi";
    }
}

Ancak @Ted'in işaret ettiği gibi kullanmadan önce her zaman resmi belgelere başvurun.


4

Yukarıdaki cevaplardan onları birleştirdim ve aşağıdaki işlevi oluşturdum:

    public static String getDeviceDensity(Context context){
    String deviceDensity = "";
    switch (context.getResources().getDisplayMetrics().densityDpi) {
        case DisplayMetrics.DENSITY_LOW:
            deviceDensity =  0.75 + " ldpi";
            break;
        case DisplayMetrics.DENSITY_MEDIUM:
            deviceDensity =  1.0 + " mdpi";
            break;
        case DisplayMetrics.DENSITY_HIGH:
            deviceDensity =  1.5 + " hdpi";
            break;
        case DisplayMetrics.DENSITY_XHIGH:
            deviceDensity =  2.0 + " xhdpi";
            break;
        case DisplayMetrics.DENSITY_XXHIGH:
            deviceDensity =  3.0 + " xxhdpi";
            break;
        case DisplayMetrics.DENSITY_XXXHIGH:
            deviceDensity =  4.0 + " xxxhdpi";
            break;
        default:
            deviceDensity = "Not found";
    }
    return deviceDensity;
}

Şimdi, yoğunluk bilgisini hangi cihazda almak istediğiniz ve hangi klasörün kullanılacağı, sadece yukarıdaki yöntemi o aktiviteye ekleyin ve aşağıdaki satırı onCreate'e ekleyin.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    Log.d("Screen Density: ", Helper.getDeviceDensity(this));

}

2

React Native'in şu anda cihazın hangi boyutta olduğunu kontrol etmesi için

import { PixelRatio } from 'react-native';   
 switch(PixelRatio.get()) {
      case 1:
      return "mdpi";
      case 1.5:
      return "hdpi";
      case 2:
      return "xhdpi";
      case 3:
      return "xxhdpi";
      case 3.5:
      return "xxxhdpi";
    }


Bu işe yaramayacak. PixelRatio.get()Android ayarlarında ayarlanan görüntü boyutuna ve dpi'ye bağlı olarak bir dizi değer döndürecektir. Bu değerler, yazdığınız kesin değerlerle örtüşmeyecektir.
— EnKrypt

0

Bazı cihazlarda (benimki Galaxy Tab3'tür), hem yoğunluk hem de yoğunlukDpi, 1.33 (yoğunluk), 213 (yoğunlukDpi) gibi garip değerler döndürür. Benim çözümüm şu bayrağı eklemek:

<item type = "bool" name = "is_mdpi"> [bool] </item>
<item type = "bool" name = "is_hdpi"> [bool] </item>
<item type = "bool" name = " is_xhdpi "> [bool] </item>
<item type =" bool "name =" is_xxhdpi "> [bool] </item>

4 values.xml dosyasına, bunları karşılık gelen res / values- [xxx] / klasörlerine koyun.


6
213dpi iyi bilinen bir yoğunluk, "tvdpi" dir: developer.android.com/guide/practices/…
— Christopher Orr
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.