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

1.获取Android屏幕尺寸

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

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
  • 1
  • 2
  • 3
  • 4
  • 5

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

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

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

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

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

 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();
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

  DisplayMetrics metrics = new DisplayMetrics();
  getWindowManager().getDefaultDisplay().getMetrics(metrics);
  width = metrics.widthPixels;
  height = metrics.heightPixels;
  • 1
  • 2
  • 3
  • 4

更简便的写法

 width = getResources().getDisplayMetrics().heightPixels;
 height = getResources().getDisplayMetrics().widthPixels;
  • 1
  • 2

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

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();
            }
        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

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;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

5.去除导航栏

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

 requestWindowFeature(Window.FEATURE_NO_TITLE);
  • 1

6.去除状态栏/通知栏

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

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
,WindowManager.LayoutParams.FLAG_FULLSCREEN);
时间: 2024-10-23 12:44:05

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

Android 弹出Dialog时隐藏状态栏和底部导航栏

上代码 dialog.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); dialog.getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUi

Android自定义控件系列一:如何测量控件尺寸

测量控件尺寸(宽度.高度)是开发自定义控件的第一步,只有确定尺寸后才能开始画(利用canvas在画布上画,我们所使用的控件实际上都是这样画上去的).当然,这个尺寸是需要根据控件的各个部分计算出来的,比如:padding.文字大小,间距等. 非容器控件的onMeasure 下面我们就来看看如何给非容器控件(即直接extends View)这只尺寸的: 1.@Override 2.protected void onMeasure(int widthMeasureSpec, int heightMea

Android在onCreate()中获得控件尺寸

@Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        final ImageView imageView = (ImageView) findViewById(R.id.imageview);              int w = View.Mea

Qt在控件未显示时如何获取正确的控件尺寸

因为打算全屏显示一个对话框,而对话框内有几个QLabel的尺寸要在确定QLabel可用的最大尺寸后,再根据内容调整一次,所以在对话框构造函数内就想确定QLabel的最大尺寸,但因为QWidget::updateGeometry()和QWidget::update()都只能用于可见的控件,所以如何在控件不可见时(构造函数内)就可以确定控件布局的最终效果呢? //widget为需要强制刷新布局的控件,如对话框等 widget->setAttribute(Qt::WA_DontShowOnScreen

iOS常用控件尺寸大集合

元素控件 尺寸(pts) Window(含状态栏) 320 x 480 Status Bar的高度 20 Navigation Bar的高度 44 含Prompt的Navigation Bar的高度 74 Navigation Bar的图标 20×20(透明的png) Tool Bar的高度 44 Tool Bar的图标 20×20(透明的png) Tab Bar的高度 49 Tab Bar的图标 30×30(透明的png) 竖直时键盘的高度 216.252(iOS 5+的中文键盘) 水平时键盘

如果写一个android桌面滑动切换屏幕的控件(三)

下面我们把这个控件内嵌到Layout中做一些动画和展示,效果图: 这个子控件可以上下移动,可以左右滑动,如果上下滑动距离大于左右滑动距离,则必须上下滑动 这样来写onTouch事件: @Override public boolean onTouchEvent(MotionEvent ev) { if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); } mVelocityTracker.addMov

如果写一个android桌面滑动切换屏幕的控件(二)

在viewgroup执行: public void snapToScreen(int whichScreen) { whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1)); boolean changingScreens = whichScreen != mCurrentScreen; mNextScreen = whichScreen; int mScrollX = this.getScrollX(); fin

如果写一个android桌面滑动切换屏幕的控件(一)

首先这个控件应该是继承ViewGroup: 初始化: public class MyGroup extends ViewGroup{ private Scroller mScroller; private float mOriMotionX; private float mLastMotionX; private VelocityTracker mVelocityTracker; private int mTouchState = TOUCH_STATE_REST; private static

IOS 控件尺寸与位置调整

控件.autorisizingMask 用于设置控件尺寸与位置 属性autoresizesSubviews 表示是否让控件自动进行位置的调整,默认为YES(允许自动进行调整),如设置成NO,autoresizingMask属性将实效 UIViewAutoresizingNone 控件将不进行自动尺寸调整,效果 UIViewAutoresizingFlexibleHeight 控件的高度将和父视图的高度一起成比例变化.否则,视图的高度将保持不变. UIViewAutoresizingFlexibl