รับความหนาแน่นของหน้าจอโดยทางโปรแกรมใน Android หรือไม่


516

วิธีรับความหนาแน่นของหน้าจอโดยทางโปรแกรมใน Android

ฉันหมายถึง: วิธีการค้นหาหน้าจอ dpi ของอุปกรณ์ปัจจุบัน?


9
คำตอบมากมายอ้างถึงgetDisplayMetrics().xdpiซึ่งควรจะคืนค่า dpi จริงของอุปกรณ์ โปรดทราบว่าผู้ผลิตตั้งค่านี้ไม่ถูกต้องในอุปกรณ์อย่างสม่ำเสมอดังนั้นคุณจึงไม่สามารถใช้งานได้ เศร้า แต่จริง: ข้อมูลเกี่ยวกับ dpi จริงไม่สามารถใช้ได้ ที่มา: groups.google.com/d/msg/android-developers/g56jV0Hora0/…
sulai

2
getResources().getDisplayMetrics().xdpiและgetResources().getDisplayMetrics().ydpiจะให้ความหนาแน่นแนวนอนและแนวตั้งตามจริงซึ่งโดยส่วนใหญ่แล้วจะแตกต่างกัน
Ωmega

คำตอบ:


526

คุณสามารถรับข้อมูลบนจอแสดงผลจากDisplayMetrics struct:

DisplayMetrics metrics = getResources().getDisplayMetrics();

แม้ว่า Android จะไม่ใช้การจับคู่พิกเซลแบบโดยตรง แต่ก็ใช้ค่าความหนาแน่นพิกเซลอิสระจำนวนมากที่ถูกควอนตัมแล้วปรับขนาดตามขนาดหน้าจอจริง ดังนั้นmetrics.densityDpiคุณสมบัติที่จะเป็นหนึ่งในDENSITY_xxxค่าคงที่ ( 120, 160, 213, 240, 320, 480หรือ640dpi)

หากคุณต้องการที่เกิดขึ้นจริงความหนาแน่นของพิกเซลจอแอลซีดี (อาจจะเป็น app OpenGL) คุณจะได้รับจากmetrics.xdpiและmetrics.ydpiคุณสมบัติสำหรับความหนาแน่นนอนและแนวตั้งตามลำดับ

หากคุณกำหนดเป้าหมายระดับ API ก่อนหน้านี้ 4 metrics.densityคุณสมบัตินี้เป็นปัจจัยกำหนดสัดส่วนแบบลอยตัวจากความหนาแน่นอ้างอิง (160dpi) metrics.densityDpiสามารถคำนวณค่าเดียวกันนี้ได้

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

42
ที่ได้รับโพสต์นี้มาจากกว่าสองปีที่ผ่านมา แต่นี่คือสิ่งแรกที่เกิดขึ้นบน Google สำหรับการค้นหานี้ดังนั้นสำหรับใครก็ตามที่พบสิ่งนี้คุณไม่ต้องคูณด้วย 160 อีกต่อไป
roboguy12

5
ไม่นับรุ่นใดอีกต่อไป
TacB0sS

ฉันได้อัปเดตคำตอบเพื่อให้ตรงกับการแก้ไข API ล่าสุดที่ผู้คนอาจใช้อยู่
joshperry

6
หมายเหตุ: คุณอาจต้องการ API ที่ใหม่กว่านี้แทน: getWindowManager().getDefaultDisplay().getRealMetrics(metrics); มีการเพิ่มอย่างเป็นทางการใน API 17 แต่ฉันประหลาดใจที่พบว่าทำงานได้อย่างถูกต้องแม้บนอุปกรณ์ 4.0 ที่ฉันได้ลอง
benkc

2
นอกจากนี้ยังมี getResources (). getDisplayMetrics (). densityDpi
amorenew

367

สิ่งนี้ยังใช้งานได้:

 getResources().getDisplayMetrics().density;

สิ่งนี้จะทำให้คุณ:

0.75 - ldpi

1.0 - mdpi

1.5 - hdpi

2.0 - xhdpi

3.0 - xxhdpi

4.0 - xxxhdpi

ป้อนคำอธิบายรูปภาพที่นี่

อ้างอิง: ความหนาแน่น

ป้อนคำอธิบายรูปภาพที่นี่

การอ้างอิง 2


10
+1 ใช้งานได้เมื่อคุณไม่สามารถเข้าถึงโดยตรงWindowManager(เช่นภายใน Loader) เพียงแค่คูณด้วย 160
Michał K

2
API ระดับ 16 เพิ่ม xxdpi ซึ่งแปลที่นี่เป็น 3.0
QED

3
นี้จะให้ 1.3312501 tvdpiสำหรับ สำหรับข้อมูลเพิ่มเติมtvdpiดูที่นี่
Dori

2
Nexus 7 รายงาน 1.3 ทำไมต้องใส่วงเล็บใน
Neil

1
@selbie โทรศัพท์ของคุณอาจดึงและปรับขนาดทรัพยากรที่มีคุณภาพสูงขึ้นเนื่องจากโทรศัพท์ของคุณรายงานครึ่งทางระหว่างความหนาแน่นที่กำหนดไว้สองแบบ
Sakiboy

145
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;
}

สิ่งนี้จะทำงานกับ API ระดับ 4 ขึ้นไป


คุณจะมอบอุปกรณ์เช่น Nexus 7 ที่รายงานความหนาแน่นของข้อมูลเป็น 213 ได้อย่างไร
Neil

มีการตรวจสอบมืออื่น ๆ ระหว่างค่าความหนาแน่นเช่น if (metrics.densityDpi> DisplayMetrics.DENSITY_LOW && metrics.densityDpi <DisplayMetrics.DENSITY_MEDIUM)
Mitul Nakum

1
หรือถ้า (metrics.densityDpi <DisplayMetrics.DENSITY_LOW) {} อื่นถ้า (metrics.densityDpi <DisplayMetrics DENSITY_MEDIUM) {} .....
Mitul Nakum

1
Neil, 213 เรียกว่า TV DPI มีความหนาแน่นของเมตริกการแสดงผลที่ระบุชื่อสำหรับ DENSITY_TV นั้น
แอนดรู S

63

คำตอบของ Blundellเป็นวิธีผู้ช่วยคงที่:

private static String getDensityName(Context context) {
    float density = context.getResources().getDisplayMetrics().density;
    if (density >= 4.0) {
        return "xxxhdpi";
    }
    if (density >= 3.0) {
        return "xxhdpi";
    }
    if (density >= 2.0) {
        return "xhdpi";
    }
    if (density >= 1.5) {
        return "hdpi";
    }
    if (density >= 1.0) {
        return "mdpi";
    }
    return "ldpi";
}

สิ่งที่เกี่ยวกับความหนาแน่นของ tvdpi ฉันเดาว่ามันคือ 1.33
Anoop

@AnoopssGolden มันไม่ได้มาตรฐานจริงๆดังนั้นคุณสามารถเพิ่มได้ถ้าคุณต้องการ แต่ฉันไม่คิดว่าคำตอบควรรวมไว้ จาก android docs: "นี่ไม่ใช่กลุ่มความหนาแน่น" หลัก "ส่วนใหญ่มีไว้สำหรับโทรทัศน์และแอพส่วนใหญ่ไม่จำเป็นต้องใช้"
qwertzguy

แต่อุปกรณ์ Nexus 7 อยู่ในกลุ่มหนาแน่นของ tvdpi
Anoop

1
ฉันรู้ว่ามันค่อนข้างเก่า แต่เพิ่งจะเพิ่ม MDPI อาจใช้งานได้กับเกือบทุกอย่างใน Nexus 7 แต่ตอนนี้ฉันกำลังลองภาพที่มาลงเพราะ MDPI นั้นไม่ใหญ่พอ ฉันต้องกำหนด TVDPI แล้วขอขนาดภาพที่ใหญ่กว่าจากเซิร์ฟเวอร์ของฉัน อาจไม่ได้ใช้บ่อยนัก แต่นั่นไม่ได้หมายความว่า MDPI จะเก็บทุกอย่าง
RED_

3
เฮ้ @Andrew S การใช้ elses ไม่ได้เปลี่ยนแปลงอะไรเลยกับประสิทธิภาพของโค้ดเนื่องจากถ้าส่งคืนทันที การลบวงเล็บปีกกาเป็นคำถามของสไตล์เท่านั้นและ IMHO ทำให้เกิดข้อผิดพลาดได้ง่ายขึ้นเมื่อทำการบำรุงรักษาโค้ด
qwertzguy

45

ลองสิ่งนี้:

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

5
ฉันชอบสิ่งนี้ดีกว่ามากเพราะมันอาศัยบริบทมากกว่ากิจกรรม
greg7gkb

ตกลงฉันสามารถใช้สิ่งนี้Viewได้ง่ายกว่ามาก (ซึ่งเป็นที่ที่ฉันต้องการ!)
Andrew Wyld

37

วิธีรับ dpi:

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;

4
dm.densityDpi ส่งกลับ DENSITY_LOW หรือ DENSITY_MEDIUM หรือ DENSITY_HIGH แล้ว xhdpi ล่ะ? มี DENSITY_XHIGH หรือเปล่า
Eugene Chumak


34

นี่คือค่าคงที่ความหนาแน่นแหล่งที่มา :

ป้อนคำอธิบายรูปภาพที่นี่

นอกจากความหนาแน่นมาตรฐานแล้วยังมี 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;
}

29

คำตอบต่อไปนี้เป็นการปรับปรุงเล็กน้อยตามคำตอบของ 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
}

1
รหัสนี้สามารถใช้กับเอลส์บางตัวและเครื่องหมายและเงื่อนไขหลังจากที่มันซ้ำซ้อน
แอนดรู S

1
@ แอนดรูว์ขอบคุณสำหรับการแก้ไข ฉันได้แก้ไขคำตอบแล้ว
San

2
@San คุณไม่จำเป็นต้อง && ในเงื่อนไขใด ๆ เหล่านั้นตราบใดที่คุณตรวจสอบอย่างสม่ำเสมอสำหรับ> = อื่น ๆ หากจะยุติเงื่อนไขแรกที่เป็นจริง
dbenson

3
สิ่งนี้ไม่ส่งคืนผลลัพธ์ที่ถูกต้องสำหรับฉันด้วย Nexus 5X ของฉัน (อุปกรณ์ Google เริ่มต้น btw) ความหนาแน่นของอุปกรณ์คือ xxhdpi และความหนาแน่นสองเท่าที่ส่งคืนคือประมาณ 2.6
Tobliug

20

ที่จริงถ้าคุณต้องการให้dpi แสดงผลที่แท้จริงคำตอบนั้นอยู่ในระหว่างถ้าคุณค้นหาสำหรับตัวชี้วัดการแสดงผล:

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

densityDpi * 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จะไม่ให้ค่าdpi ที่แท้จริงของการแสดงผลเสมอ: ตัวอย่าง:

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

ดังนั้น dpi ที่แท้จริงของหน้าจอควรเป็น Density * xdpi .. แต่ฉันไม่แน่ใจว่านี่เป็นวิธีที่ถูกต้องหรือไม่!


1
การใช้ความหนาแน่น * xdpi ทำงานได้อย่างสมบูรณ์เพื่อให้ห่างไกลในปพลิเคชันทั้งหมดของฉันในการเล่น Google เพื่อให้ห่างไกลสำหรับที่ผ่านมา 6 เดือน
มาเร็ค Halmo

การคูณความหนาแน่น * xdpi ไม่ใช่เชิงตรรกะซึ่งชัดเจนยิ่งขึ้นในขณะนี้ว่ามีอุปกรณ์ความหนาแน่นสูงกว่ามากขึ้น - ทั้งความหนาแน่นและการเพิ่มขึ้นของ xdpi ดังนั้นการคูณพวกเขาจะเป็นการนับการเพิ่มขึ้นสองเท่า ฉันจะบอกว่า Samsung ace 2 เป็นข้อผิดพลาดจากผู้ขาย ข้อมูลจำเพาะของ Android คือ xdpi และ ydpi เป็นความหนาแน่นของพิกเซลจริง - ไม่คูณด้วยอะไร
ToolmakerSteve

17

สิ่งนี้จะช่วยในกิจกรรมของคุณ ...

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

13
public static String getDensity(Context context) {
    String r;
    DisplayMetrics metrics = new DisplayMetrics();

    if (!(context instanceof Activity)) {
        r = "hdpi";
    } else {
        Activity activity = (Activity) context;
        activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);

        if (metrics.densityDpi <= DisplayMetrics.DENSITY_LOW) {
            r = "ldpi";
        } else if (metrics.densityDpi <= DisplayMetrics.DENSITY_MEDIUM) {
            r = "mdpi";
        } else {
            r = "hdpi";
        }
    }

    return r;
}

11

ถ้าคุณต้องการดึงข้อมูลความหนาแน่นจากบริการมันจะทำงานดังนี้:

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

อันนี้ช่วยฉันเมื่อฉันไม่มี windowManager
silentsudo

8

คุณควรลองสิ่งนี้ เพิ่งเพิ่มวิธีการที่จะค้นหาและแสดงขนมปัง สิ่งที่อยู่ในหมวดหมู่ของอุปกรณ์

public static int differentDensityAndScreenSize(Context context) {
  int value = 20;
  String str = "";
  if ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) {
   switch (context.getResources().getDisplayMetrics().densityDpi) {
   case DisplayMetrics.DENSITY_LOW:
    str = "small-ldpi";
    value = 20;
    break;
   case DisplayMetrics.DENSITY_MEDIUM:
    str = "small-mdpi";
    value = 20;
    break;
   case DisplayMetrics.DENSITY_HIGH:
    str = "small-hdpi";
    value = 20;
    break;
   case DisplayMetrics.DENSITY_XHIGH:
    str = "small-xhdpi";
    value = 20;
    break;
   case DisplayMetrics.DENSITY_XXHIGH:
    str = "small-xxhdpi";
    value = 20;
    break;
   case DisplayMetrics.DENSITY_XXXHIGH:
    str = "small-xxxhdpi";
    value = 20;
    break;
   case DisplayMetrics.DENSITY_TV:
    str = "small-tvdpi";
    value = 20;
    break;
   default:
    str = "small-unknown";
    value = 20;
    break;
   }

  } else if ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) {
   switch (context.getResources().getDisplayMetrics().densityDpi) {
   case DisplayMetrics.DENSITY_LOW:
    str = "normal-ldpi";
    value = 82;
    break;
   case DisplayMetrics.DENSITY_MEDIUM:
    str = "normal-mdpi";
    value = 82;
    break;
   case DisplayMetrics.DENSITY_HIGH:
    str = "normal-hdpi";
    value = 82;
    break;
   case DisplayMetrics.DENSITY_XHIGH:
    str = "normal-xhdpi";
    value = 90;
    break;
   case DisplayMetrics.DENSITY_XXHIGH:
    str = "normal-xxhdpi";
    value = 96;
    break;
   case DisplayMetrics.DENSITY_XXXHIGH:
    str = "normal-xxxhdpi";
    value = 96;
    break;
   case DisplayMetrics.DENSITY_TV:
    str = "normal-tvdpi";
    value = 96;
    break;
   default:
    str = "normal-unknown";
    value = 82;
    break;
   }
  } else if ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) {
   switch (context.getResources().getDisplayMetrics().densityDpi) {
   case DisplayMetrics.DENSITY_LOW:
    str = "large-ldpi";
    value = 78;
    break;
   case DisplayMetrics.DENSITY_MEDIUM:
    str = "large-mdpi";
    value = 78;
    break;
   case DisplayMetrics.DENSITY_HIGH:
    str = "large-hdpi";
    value = 78;
    break;
   case DisplayMetrics.DENSITY_XHIGH:
    str = "large-xhdpi";
    value = 125;
    break;
   case DisplayMetrics.DENSITY_XXHIGH:
    str = "large-xxhdpi";
    value = 125;
    break;
   case DisplayMetrics.DENSITY_XXXHIGH:
    str = "large-xxxhdpi";
    value = 125;
    break;
   case DisplayMetrics.DENSITY_TV:
    str = "large-tvdpi";
    value = 125;
    break;
   default:
    str = "large-unknown";
    value = 78;
    break;
   }

  } else if ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE) {
   switch (context.getResources().getDisplayMetrics().densityDpi) {
   case DisplayMetrics.DENSITY_LOW:
    str = "xlarge-ldpi";
    value = 125;
    break;
   case DisplayMetrics.DENSITY_MEDIUM:
    str = "xlarge-mdpi";
    value = 125;
    break;
   case DisplayMetrics.DENSITY_HIGH:
    str = "xlarge-hdpi";
    value = 125;
    break;
   case DisplayMetrics.DENSITY_XHIGH:
    str = "xlarge-xhdpi";
    value = 125;
    break;
   case DisplayMetrics.DENSITY_XXHIGH:
    str = "xlarge-xxhdpi";
    value = 125;
    break;
   case DisplayMetrics.DENSITY_XXXHIGH:
    str = "xlarge-xxxhdpi";
    value = 125;
    break;
   case DisplayMetrics.DENSITY_TV:
    str = "xlarge-tvdpi";
    value = 125;
    break;
   default:
    str = "xlarge-unknown";
    value = 125;
    break;
   }
  }
// The Toast will show the Device falls in Which Categories.
Toast.makeText(MainActivity.this, ""+str, Toast.LENGTH_SHORT).show();

  return value;
 }

http://www.androidwarriors.com/2016/01/how-to-find-different-devices-screen.html


7

สิ่งนี้น่าจะใช้ได้

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

4
ขนาดพิกเซลของจอแสดงผลไม่ใช่ความหนาแน่น
joshperry

1
นี่คือพิกเซลความหนาแน่นอิสระไม่ใช่พิกเซล และนั่นคือ 320 ที่คุณเห็นคือ 320dip ไม่ใช่ 320px การคำนวณ px นั้นแตกต่างกันดูstackoverflow.com/questions/6840904/…
Lukap

7

อีกคำตอบหนึ่ง:

/**
* @return "ldpi", "mdpi", "hdpi", "xhdpi", "xhdpi", "xxhdpi", "xxxhdpi", "tvdpi", or "unknown".
*/
public static String getDensityBucket(Resources resources) {
    switch (resources.getDisplayMetrics().densityDpi) {
        case DisplayMetrics.DENSITY_LOW:
            return "ldpi";
        case DisplayMetrics.DENSITY_MEDIUM:
            return "mdpi";
        case DisplayMetrics.DENSITY_HIGH:
            return "hdpi";
        case DisplayMetrics.DENSITY_XHIGH:
            return "xhdpi";
        case DisplayMetrics.DENSITY_XXHIGH:
            return "xxhdpi";
        case DisplayMetrics.DENSITY_XXXHIGH:
            return "xxxhdpi";
        case DisplayMetrics.DENSITY_TV:
            return "tvdpi";
        default:
            return "unknown";
    }
}

3

อีกวิธีในการรับความหนาแน่นที่อุปกรณ์โหลด:

สร้างvaluesโฟลเดอร์สำหรับแต่ละความหนาแน่น

  • ค่า (mdpi เริ่มต้น)
  • ค่า-hdpi
  • ค่า-XHDPI
  • ค่า-xxhdpi
  • ค่า-xxxhdpi

เพิ่มทรัพยากรสตริงในนั้นstrings.xml:

<string name="screen_density">MDPI</string>    <!-- ..\res\values\strings.xml -->
<string name="screen_density">HDPI</string>    <!-- ..\res\values-hdpi\strings.xml -->
<string name="screen_density">XHDPI</string>   <!-- ..\res\values-xhdpi\strings.xml -->
<string name="screen_density">XXHDPI</string>  <!-- ..\res\values-xxhdpi\strings.xml -->
<string name="screen_density">XXXHDPI</string> <!-- ..\res\values-xxxhdpi\strings.xml -->

จากนั้นก็รับทรัพยากรของสตริงและคุณมีความหนาแน่นของคุณ:

String screenDensity = getResources().getString(R.string.screen_density);

หากความหนาแน่นมีขนาดใหญ่กว่าความหนาแน่นXXXHDPIจะเริ่มต้นที่XXXHDPIหรือต่ำกว่าHDPIค่าเริ่มต้นMDPI

ค่า R.strings.screen_density

ฉันออกไปLDPIเพราะสำหรับกรณีการใช้งานของฉันมันไม่จำเป็น


ฉันคิดว่านี่เป็นวิธีที่ถูกต้องในการรับความหนาแน่น เนื่องจากฉันใช้ความหนาแน่นของ getResources (). getDisplayMetrics (). ความหนาแน่นจะเปลี่ยนหากฉันเปลี่ยนขนาดการแสดงผลในการตั้งค่า
แฟนตาซีฝาง

1

ลองสิ่งนี้ ...

ใน kotlin

fun determineScreenDensityCode(): String {
      return when (resources.displayMetrics.densityDpi) {
         DisplayMetrics.DENSITY_LOW -> "ldpi"
         DisplayMetrics.DENSITY_MEDIUM -> "mdpi"
         DisplayMetrics.DENSITY_HIGH -> "hdpi"
         DisplayMetrics.DENSITY_XHIGH, DisplayMetrics.DENSITY_280 -> "xhdpi"
         DisplayMetrics.DENSITY_XXHIGH, DisplayMetrics.DENSITY_360, DisplayMetrics.DENSITY_400, DisplayMetrics.DENSITY_420 -> "xxhdpi"
         DisplayMetrics.DENSITY_XXXHIGH, DisplayMetrics.DENSITY_560 -> "xxxhdpi"
         else -> "Unknown code ${resources.displayMetrics.densityDpi}"
     }
}

คุณสามารถโทรหาโดยprintln("density: ${determineScreenDensityCode()}") และผลลัพธ์จะเป็นSystem.out: density: xxxhdpi


0

ฉันใช้รหัสต่อไปนี้เพื่อเข้าถึง DPI จากโมดูล (ไม่จำเป็นต้องเข้าถึงวัตถุบริบท):

(Resources.getSystem().getDisplayMetrics().xdpi
Resources.getSystem().getDisplayMetrics().ydpi)/2

0

ใน Android คุณสามารถรับความหนาแน่นของหน้าจอดังนี้:

public static String getScreenDensity(Context context)
{
    String density;
    switch (context.getResources().getDisplayMetrics().densityDpi)
    {
        case DisplayMetrics.DENSITY_LOW:
            density = "LDPI";
            break;
        case DisplayMetrics.DENSITY_140:
            density = "LDPI - MDPI";
            break;
        case DisplayMetrics.DENSITY_MEDIUM:
            density = "MDPI";
            break;
        case DisplayMetrics.DENSITY_180:
        case DisplayMetrics.DENSITY_200:
        case DisplayMetrics.DENSITY_220:
            density = "MDPI - HDPI";
            break;
        case DisplayMetrics.DENSITY_HIGH:
            density = "HDPI";
            break;
        case DisplayMetrics.DENSITY_260:
        case DisplayMetrics.DENSITY_280:
        case DisplayMetrics.DENSITY_300:
            density = "HDPI - XHDPI";
            break;
        case DisplayMetrics.DENSITY_XHIGH:
            density = "XHDPI";
            break;
        case DisplayMetrics.DENSITY_340:
        case DisplayMetrics.DENSITY_360:
        case DisplayMetrics.DENSITY_400:
        case DisplayMetrics.DENSITY_420:
        case DisplayMetrics.DENSITY_440:
            density = "XHDPI - XXHDPI";
            break;
        case DisplayMetrics.DENSITY_XXHIGH:
            density = "XXHDPI";
            break;
        case DisplayMetrics.DENSITY_560:
        case DisplayMetrics.DENSITY_600:
            density = "XXHDPI - XXXHDPI";
            break;
        case DisplayMetrics.DENSITY_XXXHIGH:
            density = "XXXHDPI";
            break;
        case DisplayMetrics.DENSITY_TV:
            density = "TVDPI";
            break;
        default:
            density = "UNKNOWN";
            break;
    }

    return density;
}

และใน Kotlin เช่นนี้

fun getScreenDensity(context: Context): String {
    val density: String
    when (context.resources.displayMetrics.densityDpi) {
        DisplayMetrics.DENSITY_LOW -> density = "LDPI"
        DisplayMetrics.DENSITY_140 -> density = "LDPI - MDPI"
        DisplayMetrics.DENSITY_MEDIUM -> density = "MDPI"
        DisplayMetrics.DENSITY_180, DisplayMetrics.DENSITY_200, DisplayMetrics.DENSITY_220 -> density = "MDPI - HDPI"
        DisplayMetrics.DENSITY_HIGH -> density = "HDPI"
        DisplayMetrics.DENSITY_260, DisplayMetrics.DENSITY_280, DisplayMetrics.DENSITY_300 -> density = "HDPI - XHDPI"
        DisplayMetrics.DENSITY_XHIGH -> density = "XHDPI"
        DisplayMetrics.DENSITY_340, DisplayMetrics.DENSITY_360, DisplayMetrics.DENSITY_400, DisplayMetrics.DENSITY_420, DisplayMetrics.DENSITY_440 -> density =
            "XHDPI - XXHDPI"
        DisplayMetrics.DENSITY_XXHIGH -> density = "XXHDPI"
        DisplayMetrics.DENSITY_560, DisplayMetrics.DENSITY_600 -> density = "XXHDPI - XXXHDPI"
        DisplayMetrics.DENSITY_XXXHIGH -> density = "XXXHDPI"
        DisplayMetrics.DENSITY_TV -> density = "TVDPI"
        else -> density = "UNKNOWN"
    }

    return density
}

ให้แน่ใจว่าจะประจำการตรวจสอบว่ามีความหนาแน่นใหม่จะถูกเพิ่ม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.