Как получить разрешение экрана в Android Honeycomb? - PullRequest
12 голосов
/ 27 августа 2011

Хочу получить реальное разрешение экрана на Android Honeycomb.

Вот мой код

Display display = getWindowManager().getDefaultDisplay();
int w = display.getWidth();
int h = display.getHeight();

Мое устройство - Asus Transformer TF101 с размерами 1280x800.

Но приведенный выше код делает w = 1280 и h = 752 (я хочу 800, а не 752).

Я знаю, что h <800, потому что он вычитается для строки состояния. </p>

Есть ли способ получить реальную высоту экрана?

Большое спасибо!

Ответы [ 10 ]

15 голосов
/ 03 декабря 2011

Начиная с Andorid 3.2, высота строки состояния системы не включена в высоту DisplayMetrics, вам нужно использовать недокументированные API (Display.getRawWidth () и Display.getRawHeight ()), чтобы получить физическую ширину или высоту экрана.

Вот пример, показывающий, как получить физическую ширину или высоту экрана.

Method mGetRawW = Display.class.getMethod("getRawWidth");
Method mGetRawH = Display.class.getMethod("getRawHeight");
int nW = (Integer)mGetRawW.invoke(dp);
int nH = (Integer)mGetRawH.invoke(dp);

ОБНОВЛЕНО: Для API 13-16 необходимо использовать приведенное вышекод, чтобы получить реальную ширину / высоту.Для API 17+ теперь вы можете использовать новый публичный API, Display.getRealSize ().

12 голосов
/ 21 октября 2011

Вот, пожалуйста, с небольшим фокусом и предположением, что декорации экрана находятся сверху / снизу, а не слева / справа:

Display d = getWindowManager().getDefaultDisplay();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
int h = d.getWidth();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
int w = d.getWidth();
5 голосов
/ 09 сентября 2011

У меня есть Xoom в руке, и я использовал getWindowManager().getDefaultDisplay(), чтобы получить размер, он возвращает мне 1280 x 800, который является полноэкранным размером. Интересно, как получить разрешение минус панель навигации с API до версии 3.0.

4 голосов
/ 22 октября 2011

Ответ, который вы получаете, правильно выведен из-за строки состояния.Все, что вам нужно сделать, это избавиться от строки состояния, прежде чем начнется отображение окна.И затем вы можете сбросить строку состояния, прежде чем установить представление содержимого деятельности.

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

Чтобы скрыть строку состояния:

В вашем onCreate ():

final WindowManager.LayoutParams attrs = getWindow().getAttributes();
//Add the flag to the Window Attributes
attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
getWindow().setAttributes(attrs);
//Disassociate Display from the Activity
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

Теперь ваш дисплей по умолчанию должен работать правильно

Все еще в вашем onCreate ():

Display display = getWindowManager().getDefaultDisplay();
int w = display.getWidth();
int h = display.getHeight();

Теперь перед тем, как установить Content

Опять же, в вашем onCreate ():

final WindowManager.LayoutParams attrs = getWindow().getAttributes();
//Show the statubar
attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().setAttributes(attrs);
// Reassociate.
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

Наконец:

setContentView(r.layout.myView);

Предыдущие сегменты кода будут работать практически везде.Я просто думаю о вашем опыте пользователя.Не стесняйтесь размещать их везде, конечно.Это функциональные сегменты, взятые из одного из моих проектов.Я видел похожие методы в некоторых домашних пусковых установках.Примечание: в зависимости от версии Android вам может потребоваться выполнить строку состояния в onWindowAttached ().Если вы это сделаете, убедитесь, что вы по-прежнему вызываете super.onWindowAttached ().

Другая техника: Конечно, если вы все равно хотите это сделать, вы всегда можете установить атрибут действиятаким образом в вашем манифесте.

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
4 голосов
/ 27 августа 2011

Используйте структуру DisplayMetrics , описывающую общую информацию о дисплее, такую ​​как его размер, плотность и масштабирование шрифта.

Код, используемый для получения высоты дисплея, выглядит следующим образом:

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

Log.d("log", "OOO " + metrics.heightPixels);

Предполагается вернуть абсолютную высоту дисплея в пикселях.

0 голосов
/ 17 июля 2014

Это еще одно жизнеспособное решение для измерения размера экрана (API 11 +):

public static ABDimension calculateScreenDimensions(Activity activityGet)
{
    ABDimension abdReturn = new ABDimension();

    try
    {
        Rect rectGet = new Rect();
        Window winGet = null;
        DisplayMetrics displayMetrics = new DisplayMetrics();
        int nStatusBarHeight = 0;
        int nContentViewTop = 0;
        int nTitleBarHeight = 0;
        int nScreenHeight = 0;

        if((activityGet != null) && (rectGet != null) && (displayMetrics != null))
        {
            winGet = activityGet.getWindow();
            if(winGet != null)
            {
                winGet.getDecorView().getWindowVisibleDisplayFrame(rectGet);
                nStatusBarHeight = rectGet.top;
                nContentViewTop = winGet.findViewById(Window.ID_ANDROID_CONTENT).getTop();
                nTitleBarHeight = nContentViewTop - nStatusBarHeight;

                activityGet.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
                int screenHeight = displayMetrics.heightPixels;
                abdReturn.nWidth = displayMetrics.widthPixels;
                abdReturn.nHeight = screenHeight - (nTitleBarHeight + nStatusBarHeight);
            }
        }
    }
    catch(Exception e)
    {
        appContext.showMessage(false,"Error","[calculateScreenDimensions]: "+e.toString());
    }

    return abdReturn;
}

Где класс ABDimension содержит шесть целых чисел, помеченных как nWidth, nHeight, nMarginLeft, nMarginTop, nMarginRight и nMarginBottom. Эта версия учитывает общие компоненты декора Android, такие как TitleBar / StatusBar.

0 голосов
/ 14 июля 2014

Функция для получения размера экрана при минимальном уровне API11; также включает методы для API более высокого уровня (изменить функцию для использования выбранного API, его вызова функции и типа возвращаемого объекта):

public int getScreenOrientation()
{
    int nOrientation = Configuration.ORIENTATION_UNDEFINED;

    try
    {
        DisplayMetrics displayMetrics = null;
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        if(windowManager != null)
        {
            Display defaultDisplay = windowManager.getDefaultDisplay();
            if(defaultDisplay != null)
            {
                defaultDisplay.getMetrics(displayMetrics);//API11
                //defaultDisplay.getRectSize(rectGet);//API13
                //defaultDisplay.getSize(pointGet);//API13
                //defaultDisplay.getCurrentSizeRange(pointGet,pointGet);//API16
                //defaultDisplay.getRealSize(pointGet);//API17
                //defaultDisplay.getRealMetrics(displayMetrics);//API17
                if((displayMetrics.widthPixels == displayMetrics.heightPixels) || (displayMetrics.widthPixels < displayMetrics.heightPixels))
                {
                    nOrientation = Configuration.ORIENTATION_PORTRAIT;
                }
                else
                {
                    nOrientation = Configuration.ORIENTATION_LANDSCAPE;
                }
            }
        }
    }
    catch(Exception e)
    {
        showMessage(false,"Error","[getScreenOrientation]: " + e.toString());
    }

    return nOrientation;
}

Примечание. Configuration.ORIENTATION_SQUARE устарела, поэтому здесь по умолчанию оно заменено на ORIENTATION_PORTRAIT.

0 голосов
/ 26 октября 2011

Возможно, вы можете добавить высоту строки состояния. Высота строки состояния?

   Rect rectgle= new Rect();
   Window window= getWindow();
   window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
   int StatusBarHeight= rectgle.top;
   int contentViewTop= `enter code here`
      window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
   int TitleBarHeight= contentViewTop - StatusBarHeight;

   Log.i("*** Jorgesys :: ", "StatusBar Height= " + StatusBarHeight + " , TitleBar Height = " + TitleBarHeight);
0 голосов
/ 26 октября 2011

Вы можете расширить макет, который будет вашим верхним макетом (для которого будут установлены ширина и высота fill_parent), и переопределить onSizeChange (int width, int height, int oldwidth, int oldheight). Ширина и высота - это реальная ширина и высота вашего дисплея.

0 голосов
/ 25 октября 2011

В вопросе Высота строки состояния? объясните, как вы получаете высоту строки состояния. Имея значение statusBarHeight, вы можете сделать:

Display display = getWindowManager().getDefaultDisplay();
int h = display.getHeight() + statusBarHeight;
...