android - एंड्रॉइड में स्क्रीन घनत्व प्रोग्रामेटिक रूप से प्राप्त करना?




dpi screen-density (10)

एंड्रॉइड में स्क्रीन घनत्व प्रोग्रामेटिक रूप से कैसे प्राप्त करें?

मेरा मतलब है: वर्तमान डिवाइस की स्क्रीन डीपीआई कैसे खोजें?


असल में यदि आप असली डिस्प्ले डीपीआई चाहते हैं तो जवाब कहीं भी बीच में है यदि आप डिस्प्ले मेट्रिक्स के लिए पूछते हैं:

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int dpiClassification = dm.densityDpi;
float xDpi = dm.xdpi;
float yDpi = dm.ydpi;

घनत्व डीपीआई * 160 आपको मूल्य / सुझाव देगा जो आपको घनत्व का उपयोग करना चाहिए

0.75 - ldpi - 120 dpi
1.0 - mdpi - 160 dpi
1.5 - hdpi - 240 dpi
2.0 - xhdpi - 320 dpi
3.0 - xxhdpi - 480 dpi
4.0 - xxxhdpi - 640 dpi

जैसा कि पिछले पदों में निर्दिष्ट है

लेकिन dm.xdpi आपको हमेशा दिए गए प्रदर्शन की वास्तविक डीपीआई नहीं देगा: उदाहरण:

Device: Sony ericsson xperia mini pro (SK17i)
Density: 1.0 (e.g. suggests you use 160dpi resources)
xdpi: 193.5238
Real device ppi is arround 193ppi


Device: samsung GT-I8160 (Samsung ace 2)
Density 1.5 (e.g. suggests you use 240dpi resources)
xdpi 160.42105
Real device ppi is arround 246ppi

तो शायद प्रदर्शन का असली डीपीआई घनत्व * xdpi होना चाहिए .. लेकिन मुझे यकीन नहीं है कि यह करने का सही तरीका है!


आप प्रदर्शन DisplayMetrics संरचना से प्रदर्शन पर जानकारी प्राप्त कर सकते हैं:

DisplayMetrics metrics = getResources().getDisplayMetrics();

हालांकि एंड्रॉइड सीधे पिक्सेल मैपिंग का उपयोग नहीं करता है, लेकिन यह मात्रात्मक घनत्व वाले स्वतंत्र पिक्सेल मानों का एक मुट्ठी भर उपयोग करता है, फिर वास्तविक स्क्रीन आकार के लिए स्केल करता है। तो metrics.densityDpi प्रॉपर्टी DENSITY_xxx स्थिरांक ( 120 , 160 , 213 , 240 , 320 , 480 या 640 डीपीआई) में से एक होगी।

यदि आपको वास्तविक एलसीडी पिक्सेल घनत्व (शायद ओपनजीएल ऐप के लिए) की आवश्यकता है तो आप इसे क्रमशः क्षैतिज और लंबवत घनत्व के लिए metrics.xdpi और metrics.ydpi गुणों से प्राप्त कर सकते हैं।

यदि आप 4 से पहले एपीआई स्तर को लक्षित कर रहे हैं। metrics.density . metrics.density प्रॉपर्टी संदर्भ घनत्व (160 डीपीआई) से एक फ़्लोटिंग पॉइंट स्केलिंग कारक है। metrics.densityDpi द्वारा प्रदान किया गया वही मान गणना की जा सकती है

int densityDpi = (int)(metrics.density * 160f);

इससे आपकी गतिविधि में मदद मिलनी चाहिए ...

void printSecreenInfo(){

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

    Log.i(TAG, "density :" +  metrics.density);

    // density interms of dpi
    Log.i(TAG, "D density :" +  metrics.densityDpi);

    // horizontal pixel resolution
    Log.i(TAG, "width pix :" +  metrics.widthPixels);

     // actual horizontal dpi
    Log.i(TAG, "xdpi :" +  metrics.xdpi);

    // actual vertical dpi
    Log.i(TAG, "ydpi :" +  metrics.ydpi);

}

आउटपुट:

I/test( 1044): density :1.0

I/test( 1044): D density :160

I/test( 1044): width pix :800

I/test( 1044): xdpi :160.0

I/test( 1044): ydpi :160.42105

इसे इस्तेमाल करे:

DisplayMetrics dm = context.getResources().getDisplayMetrics();
int densityDpi = dm.densityDpi;

डीपीआई प्राप्त करने के लिए:

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

// will either be DENSITY_LOW, DENSITY_MEDIUM or DENSITY_HIGH
int dpiClassification = dm.densityDpi;

// these will return the actual dpi horizontally and vertically
float xDpi = dm.xdpi;
float yDpi = dm.ydpi;

निम्नलिखित उत्तर qwertzguy के उत्तर के आधार पर एक छोटा सा सुधार है।

double density = getResources().getDisplayMetrics().density;
if (density >= 4.0) {
   //"xxxhdpi";
}
else if (density >= 3.0 && density < 4.0) {
   //xxhdpi
}
else if (density >= 2.0) {
   //xhdpi
}
else if (density >= 1.5 && density < 2.0) {
   //hdpi
}
else if (density >= 1.0 && density < 1.5) {
   //mdpi
}

यदि आप किसी सेवा से घनत्व पुनर्प्राप्त करना चाहते हैं तो यह इस प्रकार काम करता है:

WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(metrics);

यह काम करना चाहिए।

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels; //320
int height = dm.heightPixels; //480

यहां घनत्व स्थिरांक हैं, DisplayMetrics :

मानक घनत्व के अलावा, 5 इंटरमीडिएट वाले हैं। इस तथ्य को ध्यान में रखते हुए, निम्नलिखित कोड एक पूर्ण कार्य उदाहरण होगा:

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

if (density == 0.75f)
{
    // LDPI
}
else if (density >= 1.0f && density < 1.5f)
{
    // MDPI
}
else if (density == 1.5f)
{
    // HDPI
}
else if (density > 1.5f && density <= 2.0f)
{
    // XHDPI
}
else if (density > 2.0f && density <= 3.0f)
{
    // XXHDPI
}
else
{
    // XXXHDPI 
}

वैकल्पिक रूप से densityDpi विधि का उपयोग कर:

int densityDpi = getResources().getDisplayMetrics().densityDpi;

switch (densityDpi)
{
    case DisplayMetrics.DENSITY_LOW:
        // LDPI
        break;

    case DisplayMetrics.DENSITY_MEDIUM:
        // MDPI
        break;

    case DisplayMetrics.DENSITY_TV:
    case DisplayMetrics.DENSITY_HIGH:
        // HDPI
        break;

    case DisplayMetrics.DENSITY_XHIGH:
    case DisplayMetrics.DENSITY_280:
        // XHDPI
        break;

    case DisplayMetrics.DENSITY_XXHIGH:
    case DisplayMetrics.DENSITY_360:
    case DisplayMetrics.DENSITY_400:
    case DisplayMetrics.DENSITY_420:
        // XXHDPI
        break;

    case DisplayMetrics.DENSITY_XXXHIGH:
    case DisplayMetrics.DENSITY_560:
        // XXXHDPI
        break;
}

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

switch(metrics.densityDpi) {
     case DisplayMetrics.DENSITY_LOW:
         break;

     case DisplayMetrics.DENSITY_MEDIUM:
         break;

     case DisplayMetrics.DENSITY_HIGH:
         break;
}

यह एपीआई स्तर 4 और उच्चतर पर काम करेगा।







screen-density