版权声明:本文为CrazyMo_原创,转载请在显著位置注明原文链接 https://blog.csdn.net/CrazyMo_/article/details/71077763
引言
关于获取屏幕分辨率、状态栏高度、屏幕中心坐标的一些总结。
一、获取屏幕真实的分辨率
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);//获取WM对象
DisplayMetrics dm = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(dm);
int screenPxHeight=dm.heightPixels;//获取真实屏幕的高度以px为单位
int sceenPxWidth=dm.widthPixels;
二、获取手机状态栏的高度
有时我们需要用代码计算布局的高度,可能需要减去状态栏(status bar)的高度。获取状态栏的高度方法有很多种,主要介绍两种比较通用的,兼容Android6.0的。
1、通过系统资源的Resource类去获取status_bar_height字段的值(推荐)
状态栏高度定义在Android系统尺寸资源中status_bar_height,但这并有公开直接使用的(像通常使用系统资源那样android.R.dimen.status_bar_height)但是系统给我们提供了一个Resource类,通过这个类我们可以获取资源文件,以下是在Activity中获取的方法
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
Log.e("STATUSHeight", "getStatusBarHeight: "+result );
return result;
}
2、通过反射
Android的所有资源都会有惟一标识在R类中作为引用,所以我们也可以通过反射获取R类的实例域
/**
* 获得状态栏的高度
* @param context
* @return
*/
public int getStatusHeight(Context context) {
int statusHeight = -1;
try {
Class clazz = Class.forName("com.android.internal.R$dimen");
Object object = clazz.newInstance();
int height = Integer.parseInt(clazz.getField("status_bar_height")
.get(object).toString());
statusHeight = context.getResources().getDimensionPixelSize(height);
} catch (Exception e) {
e.printStackTrace();
}
Log.e("STATUSHeight", "getStatusHeight: "+statusHeight );
return statusHeight;
}
3、通过布局Rectangle
Rect frame = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;
三、获取屏幕中心的坐标
首先手机是分为横屏、竖屏的分别对应layout-land、layout-port下的布局,虽然上面中dm.heightPixels和dm.widthPixels在横竖屏下对应的值有所不同(即在横竖屏下sceenPxWidth、screenPxHeight值有所不同),但是无论是横屏还是竖屏下屏幕中心的坐标都是:(sceenPxWidth/2,(screenPxHeight-statusbarHeight)/2)
/**
* 在屏幕中央处画圆
* @param radius
* @param canvas
* @param paint
*/
private void drawCircleInCenter(float radius,Canvas canvas,Paint paint){
WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);//获取WM对象
DisplayMetrics dm = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(dm);
int screenPxHeight = dm.heightPixels;//获取真实屏幕的高度以px为单位
int sceenPxWidth = dm.widthPixels;
Log.e("STATUSHeight", "竖屏时:screenPxHeight: "+screenPxHeight+"sceenPxWidth:"+sceenPxWidth +",屏幕中央的坐标为("
+(int)(sceenPxWidth*0.5f)+","+(int)((screenPxHeight-getStatusHeight(getContext()))*0.5f)+")");
getStatusBarHeight();
//drawCircle((int)(sceenPxWidth*0.5f),(int)((screenPxHeight-getStatusHeight(getContext()))*0.5f),radius,canvas,paint);
drawCircle((int)(sceenPxWidth*0.5f),(int)((screenPxHeight-getStatusHeight(getContext()))*0.5f),radius,canvas,paint);
//Log.e("STATUSHeight", "横屏时:screenPxHeight: "+screenPxHeight+"sceenPxWidth:"+sceenPxWidth +",屏幕中央的坐标为("
// +(int)(sceenPxWidth*0.5f)+","+(int)((screenPxHeight-getStatusHeight(getContext()))*0.5f)+")");
}
未完待续…