Подтвердить что ты не робот

Получить программный экран размера экрана?

Я хочу определить, имеет ли текущее устройство экран с малым, средним, большим или сильным в коде. Я не могу найти ничего в документах SDK, которые помогут мне получить эту информацию. Все методы/классы, на которые я смотрел, обеспечивают только абсолютные значения (например, размер экрана в пикселях, плотность экрана и т.д.).

Есть ли способ узнать, какой экран я запускаю в коде?

4b9b3361

Ответ 1

В итоге я использовал ресурсы bool, размещенные в разных папках ведра. Мне нужно было различать обычные (маленькие/средние) и большие (большие/большие) экраны, поэтому я сделал это:

<сильные > значения /bools.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="screen_large">false</bool>
</resources>

<сильные > значения-большой/bools.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="screen_large">true</bool>
</resources>

Затем я просто позвоню getBoolean(R.bool.screen_large), чтобы узнать, большой экран или нет. Таким образом, он на 100% до платформы определяет, какой экран имеет устройство.

Ответ 2

Существует разница между плотностью и типом экрана. enter image description here

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

Вы можете преобразовать пиксели в dp с помощью

public static float dpFromPixels(int pixels) {
        float dp = (float) ((pixels) / Density.scale);
        return dp;
    }

Я думаю, что вы можете захотеть добавить или вычесть .5f из пикселей, поскольку получение пикселей из dp происходит из этого кода.

public static int pixelsFromDp(float dps) {
        int pixels = (int) (dps * Density.scale + 0.5f);
        return pixels;
    }

Из документация

xlarge экраны не менее 960dp x 720dp

большие экраны не менее 640dp x 480dp

нормальные экраны не менее 470dp x 320dp

маленькие экраны не менее 426dp x 320dp

Ответ 3

public static boolean isLargeScreen(Context context) {
  int screenSize = context.getResources().getConfiguration().screenLayout
    & Configuration.SCREENLAYOUT_SIZE_MASK;
  return screenSize >= Configuration.SCREENLAYOUT_SIZE_LARGE;
}

Ответ 5

Используйте класс DisplayMetrics...

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

// DENSITY_LOW, DENSITY_MEDIUM, DENSITY_HIGH, or DENSITY_XHIGH
int density = dm.densityDpi;

Small = DisplayMetrics.DENSITY_LOW

Средний = DisplayMetrics.DENSITY_MEDIUM

Large = DisplayMetrics.DENSITY_HIGH

XLarge = DisplayMetrics.DENSITY_XHIGH

Ответ 6

Я использую этот метод в своем коде для различия между "Большими экранами" ( "Что я рассматриваю планшеты" ) и "Маленькие экраны" (Что я считаю телефонами).

public static boolean isLargeScreen(Configuration toCheckConfig) {  
    int screenSizeBucket = toCheckConfig.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
    if (screenSizeBucket >= Configuration.SCREENLAYOUT_SIZE_LARGE) {
        return true;
    }
    else return false;
}       

Объект Configuration также содержит SCREENLAYOUT_SIZE_SMALL, SCREENLAYOUT_SIZE_XLARGE и т.д. (если вам нужно проверить ведра размера).

Это также хорошо работает с этими двумя функциями утилиты:

public static int getPixelsFromDp(Context context, int dpValue) {
    return (int) (context.getResources().getDisplayMetrics().density * dpValue);
}

public static int getDpfromPixels(Context context, int pixels) {
    return (int) (pixels / context.getResources().getDisplayMetrics().density);
}

Где context.getResources().getDisplayMetrics().density равно 1.0, 1.5, 2.0 (mdpi, hdpi, xhdpi соответственно).

Ответ 7

Как дополнение к ответу Felix, вы можете использовать следующий код, чтобы получить ScreenSize без создания какой-либо папки для значений-XXX:

int screenSize = getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
        Log.d(TAG, "screenSize = "+screenSize);

        switch(screenSize) {
            case Configuration.SCREENLAYOUT_SIZE_LARGE:
                Log.d(TAG, "Large Screen");
                break;
            case Configuration.SCREENLAYOUT_SIZE_NORMAL:
                Log.d(TAG, "Normal Screen");
                break;
            case Configuration.SCREENLAYOUT_SIZE_SMALL:
                Log.d(TAG, "Small Screen");
                break;
            case Configuration.SCREENLAYOUT_SIZE_XLARGE : 
                Log.d(TAG, "XLarge Screen");
                break;
            default:
                Log.d(TAG,  "Screen size is neither large, normal or small or xlarge");
        }

Ответ 8

DisplayMetrics получил все, что вам нужно. Чтобы получить его

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