我想在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,因为它被减去状态栏。
有办法获得真正的屏幕高度吗?
非常感谢!
答案 0 :(得分:15)
启动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()。
答案 1 :(得分:12)
在这里,您可以通过小技巧并假设屏幕装饰位于顶部/底部,而不是左/右:
Display d = getWindowManager().getDefaultDisplay();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
int h = d.getWidth();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
int w = d.getWidth();
答案 2 :(得分:5)
我手边有一个Xoom,并使用getWindowManager().getDefaultDisplay()
来检索尺寸,它返回1280 x 800这是全屏尺寸。我想知道如何在版本3.0之前使用API获得分辨率减去导航栏。
答案 3 :(得分:4)
使用DisplayMetrics结构,描述有关显示的一般信息,例如其大小,密度和字体缩放。
用于获取显示高度的代码如下:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
Log.d("log", "OOO " + metrics.heightPixels);
它应该返回显示的绝对高度,以像素为单位。
答案 4 :(得分:4)
你得到的答案,正确推断是因为状态栏。您所要做的就是在窗口显示开始之前摆脱状态栏。然后,您可以在设置活动的内容视图之前重置状态栏。
这样做的原因是,除非您动态处理所有度量,布局和绘制,否则删除状态栏会影响视图绘制。执行此操作是运行时的中间将导致状态栏消失,然后再次出现(如果需要),从而导致用户混淆。
隐藏状态栏:
在你的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"
答案 5 :(得分:0)
在问题Height of statusbar?中解释如何获得状态栏高度。拥有statusBarHeight
值,您可以执行以下操作:
Display display = getWindowManager().getDefaultDisplay();
int h = display.getHeight() + statusBarHeight;
答案 6 :(得分:0)
您可以扩展将作为顶部布局的布局(将设置为fill_parent的宽度和高度)并覆盖onSizeChange(int width,int height,int oldwidth,int oldheight)。 宽度和高度是显示器的实际宽度和高度。
答案 7 :(得分:0)
也许您可以添加状态栏的高度。 Height of statusbar?
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);
答案 8 :(得分:0)
使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。
答案 9 :(得分:0)
这是另一种测量屏幕尺寸的可行解决方案(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。