Android进阶——自定义View的必修课之关于获取屏幕分辨率、状态栏高度、屏幕中心坐标小结

版权声明:本文为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)+")");
 }

这里写图片描述
这里写图片描述
未完待续…

猜你喜欢

转载自blog.csdn.net/CrazyMo_/article/details/71077763