Yanıtlar:
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
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 switch
vakalara başka değerlerin de dahil edilmesi gerektiğini unutmayın . Bu düzenleme itibariyle, buna DisplayMetrics.DENSITY_TV
ve dahildir DisplayMetrics.DENSITY_XXHIGH
. Consult docs son bilgi için; Bu cevabı sürdürmeye zahmet etmeyeceğim.
density
SteD tarafından önerildiği gibi kullanabilirsiniz .)
DENSITY_XXHIGH
. Gelecekteki tüm vakaları kapsayacak şekilde cevaba bir sorumluluk reddi beyanı ekledim. :)
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.
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));
}
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";
}
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.
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.