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

Как получить разрешение экрана в Android Honeycomb?

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

Здесь мой код

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

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

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

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

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

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

4b9b3361

Ответ 1

Запуск 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().

Ответ 2

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

Display d = getWindowManager().getDefaultDisplay();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
int h = d.getWidth();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
int w = d.getWidth();

Ответ 3

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

Ответ 4

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

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

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

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

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

Ответ 5

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

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

Чтобы скрыть StatusBar:

В вашем 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();

Теперь перед установкой содержимого

Опять же, в вашем 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);

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

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

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

Функция для получения размера экрана на уровне 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;
}

Примечание. Конфигурация .ORIENTATION_SQUARE устарела, поэтому здесь она по умолчанию заменяется на ORIENTATION_PORTRAIT.

Ответ 10

Это еще одно жизнеспособное решение для измерения размера экрана (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.