之前开发时一直在用getWidth()、getHeight()方法取屏幕的分辨率,在平板上也这么在用。
后来发现在getHeight()取得的分辨率与 平板中的分辨率不一样。于是进行了一些实验。
平板的分辨率截图:
测试代码得到的log打印输出:
根据以上一些信息基本就可以得到几个bar的大致位置,草图如下:
这样就比较明显了 系统的分辨率 1024 = screentHeight+navigatiobar = 976+48;
也就是说 平时说的最多的screenHeight其实是包含3部分的 statusBar 、actionbar、以及中间的布局部分 layoutHeight
一些代码片段:
ScreenHeight:
<span style="white-space:pre"> </span>//api13之前
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
screenWidth13 = display.getWidth();
screenHeight13 = display.getHeight();
Log.e("screenWidth13", screenWidth13+"");
Log.e("screenHeight13", screenHeight13+"");
//api13之后
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
screenWidth = dm.widthPixels;
screenHeight = dm.heightPixels;
Log.e("screenWidth", screenWidth+"");
Log.e("screenHeight", screenHeight+"");
StatusBarHeight:
<span style="white-space:pre"> </span>public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
ActionBarHeight
<span style="white-space:pre"> </span>TypedValue tv = new TypedValue();
if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
{
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
Log.e("actionBarHeight", actionBarHeight+"");
navigationBarHeight:
<span style="white-space:pre"> </span>public int getNavigationBarheight(){
Resources resources = this.getResources();
int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0) {
return resources.getDimensionPixelSize(resourceId);
}
return 0;
}
layoutHeight:
<span style="white-space:pre"> </span>final LinearLayout lineLayout = (LinearLayout)this.findViewById(R.id.layout);
ViewTreeObserver vto = lineLayout.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
int layoutWidth = lineLayout.getWidth();
int layoutHeight = lineLayout.getHeight();
Log.e("layoutWidth",layoutWidth+"");
Log.e("layoutHeight",layoutHeight+"");
return true;
}
});
详细内容见代码:代码链接