您的位置:首页 > 移动开发 > Android开发

获取Android屏幕尺寸、控件尺寸、状态栏/通知栏高度、导航栏高度

2016-01-22 18:08 381 查看
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;


如果不是在Activity里面,则无法使用getWindowManager(),此时可以使用WINDOW_SERVICE获得一个默认的Display

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();


getSize()方法是在API 13 之后才加入的,在API 13之前我们需要这样做

Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();  // 已经过时
int height = display.getHeight();  // 已经过时


为了适配所有的设备,我们应该这样写

if (android.os.Build.VERSION.SDK_INT >= 13) {
display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
width = size.x;
height = size.y;
}else {
display = getWindowManager().getDefaultDisplay();
width = display.getWidth();
height = display.getHeight();
}


还有另外一种方法,这种方法也可以正确得到屏幕尺寸

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
width = metrics.widthPixels;
height = metrics.heightPixels;


更简便的写法

width = getResources().getDisplayMetrics().heightPixels;
height = getResources().getDisplayMetrics().widthPixels;


以上获得的屏幕高度都是包括了状态栏和导航栏的高度的 




2.获取控件尺寸

如果我们在onCreate()方法里直接调用getWidth()、getMeasuredWidth()获得的尺寸为0,这是由于在onCreate()中,我们的控件还没有画好,等onCreate()执行完了,我们的控件才被测量出来,我们可以注册一个监听器,用来监听测量结果

ViewTreeObserver vto  = mButton.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

@Override
public void onGlobalLayout() {
//移除上一次监听,避免重复监听
mButton.getViewTreeObserver().removeGlobalOnLayoutListener(this);
//在这里调用getHeight()获得控件的高度
buttonHeight = mButton.getHeight();
}
});


3.获得状态栏/通知栏的高度

public static int getStatusBarHeight(Context context){
Class<?> c = null;
Object obj = null;
Field field = null;
int x = 0, statusBarHeight = 0;
try {
c = Class.forName("com.android.internal.R$dimen");
obj = c.newInstance();
field = c.getField("status_bar_height");
x = Integer.parseInt(field.get(obj).toString());
statusBarHeight = context.getResources().getDimensionPixelSize(x);
} catch (Exception e1) {
e1.printStackTrace();
}
return statusBarHeight;
}


4.获得导航栏高度

public int getNavigationBarHeight(Activity activity) {
Resources resources = activity.getResources();
int resourceId = resources.getIdentifier("navigation_bar_height","dimen", "android");
//获取NavigationBar的高度
int height = resources.getDimensionPixelSize(resourceId);
return height;
}


5.去除导航栏

在onCraete()方法中的setContentView();的之前调用下面这句代码
requestWindowFeature(Window.FEATURE_NO_TITLE);


6.去除状态栏/通知栏

在onCraete()方法中的setContentView();的之前调用下面这句代码

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
,WindowManager.LayoutParams.FLAG_FULLSCREEN);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: