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

1.获取Android屏幕尺寸

我们能够通过getSize()方法获得屏幕的尺寸

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);
posted @ 2017-07-21 14:15  lytwajue  阅读(1491)  评论(0编辑  收藏  举报