2010-02-03 2 views
43

Мне нужно точно знать, насколько большой экран на устройстве в реальных единицах длины, поэтому я могу рассчитать ускорение из-за силы тяжести в пикселях за миллисекунду.Есть ли способ определить размер экрана в Android или дюймах?

Есть ли способ где-то в Android API для этого?

+0

Если вы хотите сделать одноразовое преобразование (например, для экспорта спрайтов из Photoshop или для разработки макета для физического измерения), [здесь отличный конвертер] (http://pixplicity.com/dp- ПВ-конвертер /). –

ответ

82

Используйте следующее:

DisplayMetrics dm = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(dm); 
    double x = Math.pow(mWidthPixels/dm.xdpi,2); 
    double y = Math.pow(mHeightPixels/dm.ydpi,2); 
    double screenInches = Math.sqrt(x+y); 
    Log.d("debug","Screen inches : " + screenInches); 

Когда mWidthPixels и mHeightPixels взяты из ниже кода

private void setRealDeviceSizeInPixels() 
{ 
    WindowManager windowManager = getWindowManager(); 
    Display display = windowManager.getDefaultDisplay(); 
    DisplayMetrics displayMetrics = new DisplayMetrics(); 
    display.getMetrics(displayMetrics); 


    // since SDK_INT = 1; 
    mWidthPixels = displayMetrics.widthPixels; 
    mHeightPixels = displayMetrics.heightPixels; 

    // includes window decorations (statusbar bar/menu bar) 
    if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17) 
    { 
     try 
     { 
      mWidthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(display); 
      mHeightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(display); 
     } 
     catch (Exception ignored) 
     { 
     } 
    } 

    // includes window decorations (statusbar bar/menu bar) 
    if (Build.VERSION.SDK_INT >= 17) 
    { 
     try 
     { 
      Point realSize = new Point(); 
      Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize); 
      mWidthPixels = realSize.x; 
      mHeightPixels = realSize.y; 
     } 
     catch (Exception ignored) 
     { 
     } 
    } 

Смотрите этот пост для справки: Get screen dimensions in pixels

+0

Работает для меня :) –

+8

У меня есть ~ 15 тестовых устройств, и некоторые из них не работают, например, они не работают на некоторых моделях, таких как Motorola Milestone или телефоны ZTE. – STeN

+0

У моделей с несоответствующими моделями есть пользовательское ПЗУ или значение по умолчанию, указанное изготовителем? Возможно, это что-то с ПЗУ? –

-4

Чтобы рассчитать это значение, вам необходимо использовать плотность экрана.

Context.getResources().getDisplayMetrics().density 

В соответствии с документацией:

Логическая плотность дисплея. Это коэффициент масштабирования для независимого пикселя пикселей, где один DIP - один пиксель на экране с разрешением 160 точек на дюйм (например, экран 240x320, 1,5 "x2"), обеспечивающий базовый уровень отображения системы. Таким образом, на экране с разрешением 160 точек на дюйм это значение плотности будет равно 1; на экране с разрешением 120 точек на дюйм это будет .75; и т. д.

Это значение точно не соответствует реальному размеру экрана (как указано в xdpi и ydpi, а скорее используется для масштабирования размера общего пользовательского интерфейса поэтапно, основываясь на грубых изменениях на графике dpi). Например, экран 240x320 будет иметь плотность 1, даже если его ширина составляет 1,8 ", 1,3" и т. д. Однако, если разрешение экрана увеличено до 320x480, но размер экрана останется 1,5 "x2", тогда плотность будет увеличена (вероятно, до 1,5).

+2

Используйте xdpi и ydpi, как описано другим плакатом. Плотность преднамеренно не является абсолютным отображением физического размера экрана, а более абстрактной единицей, которая может быть квантована до небольшого количества дискретных значений (в настоящее время 120dpi, 160dpi, 240dpi). – hackbod

+0

Это плохой метод и приводит к неточным значениям как для dpi, так и для разрешения. – grebulon

4

android developers screen info.

использование xdpi * widthPixels и ydpi * heightPixels могли бы получить то, что вы хотите, я думаю.

+3

Привет, некоторые модели возвращают неправильные значения xdpi и ydpi, см. Мой комментарий. – STeN

8

для получения текущего использования размера Math . в конце.

DisplayMetrics dm = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(dm); 
    double x = Math.pow(dm.widthPixels/dm.xdpi,2); 
    double y = Math.pow(dm.heightPixels/dm.ydpi,2); 
    double screenInches = Math.sqrt(x+y); 
    Log.d("debug","Screen inches : " + screenInches); 

screenInches= (double)Math.round(screenInches * 10)/10; 
2

Следующий фрагмент кода поможет вам получить Размер экрана в дюймах

public static double getScreenSizeInches(Activity activity){ 
    WindowManager windowManager = activity.getWindowManager(); 
    Display display = windowManager.getDefaultDisplay(); 
    DisplayMetrics displayMetrics = new DisplayMetrics(); 
    display.getMetrics(displayMetrics); 

    // since SDK_INT = 1; 
    int mWidthPixels = displayMetrics.widthPixels; 
    int mHeightPixels = displayMetrics.heightPixels; 

    // includes window decorations (statusbar bar/menu bar) 
    if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17) { 
     try{ 
      mWidthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(display); 
      mHeightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(display); 
     } catch (Exception ignored) {} 
    } 

    // includes window decorations (statusbar bar/menu bar) 
    if (Build.VERSION.SDK_INT >= 17) { 
     try { 
      Point realSize = new Point(); 
      Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize); 
      mWidthPixels = realSize.x; 
      mHeightPixels = realSize.y; 
     } catch (Exception ignored) {} 
    } 

    DisplayMetrics dm = new DisplayMetrics(); 
    activity.getWindowManager().getDefaultDisplay().getMetrics(dm); 
    double x = Math.pow(mWidthPixels/dm.xdpi, 2); 
    double y = Math.pow(mHeightPixels/dm.ydpi, 2); 
    return Math.sqrt(x + y); 
} 

Надежда эта помощь.