Есть ли способ определить физическую высоту экрана андроида в сантиметрах или дюймах? - PullRequest
46 голосов
/ 03 февраля 2010

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

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

Ответы [ 6 ]

88 голосов
/ 26 апреля 2011

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

    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)
        {
        }
    }

Смотрите этот пост для справки: Получить размеры экрана в пикселях

9 голосов
/ 06 февраля 2014

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

 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;
4 голосов
/ 03 февраля 2010

информация для разработчиков Android.

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

3 голосов
/ 15 сентября 2017

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

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

Надеюсь, эта помощь.

0 голосов
/ 22 января 2019

Я использовал это, чтобы получить реальный размер

final DisplayMetrics metrics = new DisplayMetrics();
final WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    windowManager.getDefaultDisplay().getRealMetrics(metrics);
}
else {
    windowManager.getDefaultDisplay().getMetrics(metrics);
}
int realHeight = metrics.heightPixels; // This is real height
int realWidth = metrics.widthPixels; // This is real width
0 голосов
/ 03 февраля 2010

Вам нужно использовать плотность экрана, чтобы рассчитать это.

Context.getResources().getDisplayMetrics().density

Согласно документации:

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

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

...