Как получить разрешение экрана в 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, потому что он вычитается для строки состояния.
Есть ли способ получить реальную высоту экрана?
Большое спасибо!
Ответы
Ответ 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.