获取屏幕、控件大小方法汇总
在Android中,有时需要对控件进行测量,得到的控件宽度和高度,在OnCreate函数中通过控件对象调用getHeight方法获取到的仍然是0,Measure方法之后调用getMeasuredWidth的值还是0。
原因是因为当OnCreate函数发生时,只是提供了数据初始化的机会,此时还没有正式绘制图形。而绘制图形在OnDraw中进行,此时计算又显得太晚。容易想到的办法是:希望能在程序刚刚测量好某个指定控件后,拿到它的宽度和高度立刻进行计算或数据初始化。这就需要有一个方法来监听到这个事件的发生,幸好Android提供了这样的机制,利用View类中的getViewTreeObserver方法,可以获取到指定View的观察者,在绘制控件前的一刹那进行回调,这样速度上又不耽误,得到的数据由是准确的,但此方法在之后可能会被反复调用,因此需要加入限制,普通需求下,只计算一次就够了,代码如下:
一、获取控件尺寸
[java]
方法一:
View layout = findViewById(R.id.popwindow_btn);
ViewTreeObserver vto = layout.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
if (hasMeasured == false) {
int btWidth = layout.getMeasuredWidth();
int btHeight = layout.getMeasuredHeight();
hasMeasured = true;
}
return true;
}
});
方法二:
ViewTreeObserver vto = mPopupBtn.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (hasMeasured == false) {
int btWidth = mPopupBtn.getMeasuredWidth();
int btHeight = mPopupBtn.getMeasuredHeight();
hasMeasured = true;
}
});
方法三:
将一个runnable添加到Layout队列中:View.post()
简单地说,只要用View.post()一个runnable就可以了。runnable对象中的方法会在View的measure、layout等事件后触发
UI事件队列会按顺序处理事件。在setContentView()被调用后,事件队列中会包含一个要求重新layout的message,所以任何你post到队列中的东西都会在Layout发生变化后执行。
[java] final View view=//smth;
…
view.post(new Runnable() {
@Override
public void run() {
view.getHeight(); //height is ready
}
});
[/java]
这个方法比ViewTreeObserver好:
1、你的代码只会执行一次,而且你不用在在每次执行后将Observer禁用,省心多了。
2、语法很简单
二、获取状态栏尺寸
[java]/**
* 状态栏高度
*
* @return
*/
public int getStatusBarHeight() {
Rect frame = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;
return statusBarHeight;
}[/java]
三、获取标题栏尺寸
[java] /**
* 获取标题栏高度
*
* @return
*/
public int getTitleBarHeight() {
int statusBarHeight = getStatusBarHeight();
int contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT)
.getTop();
// statusBarHeight是上面所求的状态栏的高度
int titleBarHeight = contentTop – statusBarHeight;
return titleBarHeight;
}
public int getTitleBarHeight(){
return getActionBar().getHeight();
}[/java]
四、获取手机屏幕尺寸
[java]/**
* 获取手机屏幕尺寸 width,height
*
* @return
*/
public int[] getScreenSize() {
DisplayMetrics dm = new DisplayMetrics();
// 获取屏幕信息
getWindowManager().getDefaultDisplay().getMetrics(dm);
int screenWidth = dm.widthPixels;
int screenHeigh = dm.heightPixels;
return new int[] { screenWidth, screenHeigh };
}[/java]
五、获取内容区域尺寸
[java] int contentViewHeight = findViewById(android.R.id.content).getHeight(); // 屏幕内容区域高度[/java]
六、弹框实例
[java]/**
* 显示弹出窗口
*
* @param buttonHeight
*/
public void showPopupWindow(int buttonHeight) {
View contentView = getPopWindowContentViewBySimpleAdatper();
//=============================计算弹框宽高=====================
int margin = 50;// 弹窗边距
int contentViewHeight = findViewById(android.R.id.content).getHeight(); // 屏幕内容区域高度
int[] screenSize = getScreenSize();
int screenWidth = screenSize[0];
int screenHeigh = screenSize[1];
int titleHeight = getTitleBarHeight();// getActionBar().getHeight();//
// 获取Title高度,确保Title(ActionBar)没有隐藏
int statusBarHeight = getStatusBarHeight();
int popwindowWidth = screenWidth – 2 * margin;
int popwindowHeight = contentViewHeight – buttonHeight – margin;
// int popwindowHeight = screenHeigh – buttonHeight – titleHeight – statusBarHeight – margin;
//====================================================
mPopwindow = new PopupWindow(contentView, popwindowWidth,popwindowHeight);
//———–实现点击空白区域弹框消失————–
mPopwindow.setBackgroundDrawable(new BitmapDrawable());
mPopwindow.setFocusable(true);
mPopwindow.setOutsideTouchable(true);
//——————————————-
mPopupBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mPopwindow.isShowing()) {
mPopwindow.dismiss();
} else {
// mPopwindow.showAsDropDown(v, 10, -5);
int[] location = new int[2];
v.getLocationOnScreen(location); //获取在整个屏幕内的绝对坐标 location [0]—>x坐标,location [1]—>y坐标
Logs.v("location[0] :"+location[0] + " location[1] :"+location[1]);
mPopwindow.showAtLocation(v, Gravity.NO_GRAVITY, location[0]+50, location[1]+v.getHeight());
}
}
});
}[/java]
转载请注明来源:获取屏幕、控件大小方法汇总


























