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.