android 获取屏幕高度,宽度,状态栏高度

转载 2013年12月06日 11:41:00

本文转自:http://blog.csdn.net/zhtsuc/article/details/6691388

背景介绍:

到目前为止,android已经从1.5发展到目前的3.2,我们在写一个应用的时候,最常用到得就是获取屏幕高度,宽度,以及status bar的高度。

然而android系统变化太快了,从开始的手机操作系统到目前的3.2 平板电脑系统,在获取这些数据的时候也发生了很大的变化。

值得我们重视,否则会有很多错误发生。


问题分析及解决方案:

1. android 1.6 到 android 2.x

这是android手机操作系统,从1.6到2.x都有着统一的获取方法。

直接利用android api即可获取相关的尺寸,

WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);

int width = wm.getDefaultDisplay().getWidth();//屏幕宽度

int height = wm.getDefaultDisplay().getHeight();//屏幕高度

Rect rect= new Rect();  

this.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);  

int statusBarHeight = rect.top; //状态栏高度


2. android 3.0 平板系统

在3.0系统中,status bar在屏幕下方,因为计算方法也发生改变。

在3.0系统中获取屏幕高度和宽度的方法没有改变。

状态的获取方法如下:

Rect rect= new Rect();  

this.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);  


int statusBarHeight = window.getWindowManager().getDefaultDisplay().getHeight() - rect.bottom;

即利用屏幕高度减去显示区域的最大高度即为下方status bar的高度


3. android 3.2平板系统

在android 3.2中就有了很大的改变,当我们调用getWidth()和getheight()获取宽度和高度的时候,不会返回屏幕的真实尺寸,

而是只返回屏幕的显示区域的尺寸,即减去了状态栏的高度。

运用这两个api函数读取的尺寸肯定不是我们想要的结果。

这时我们发现其提供了两个隐藏函数getRealHeight()和getRealWidth()用来获取真实的屏幕尺寸。

一因为是隐藏函数,所以我们只能通过反射来调用这两个函数,但这样带来不好的就是反射效率实在是太差了。

Display display = wm.getDefaultDisplay(); 
Class c = Class.forName("android.view.Display");

Method method = c.getMethod("getRealHeight");
int height = (Integer) method.invoke(display);

Rect rect= new Rect();  

this.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);  


statusbarHeight = height - rect.bottom;

对上述代码进行优化,如果当我们频繁调用的时候,必将影响程序性能。

我们可以保存第一次反射的相关信息,然后在后面直接调用。


private Method method = null;// 用来保存method对象

---------------------------------------------------------------------------------

Display display = wm.getDefaultDisplay(); 

//判断method是否为空,如果为null,则利用反射得到method信息,否则,利用旧的method对象。
if(method == null)
{

        method = display.getClass().getMethod("getRealHeight"); //这里直接用display的class信息

}


int height = (Integer) method.invoke(display);

Rect rect= new Rect();  

this.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);  

android 获取屏幕高度,宽度,状态栏高度

背景介绍: 到目前为止,android已经从1.5发展到目前的3.2,我们在写一个应用的时候,最常用到得就是获取屏幕高度,宽度,以及status bar的高度。 然而android系统变化...
  • a907763895
  • a907763895
  • 2013年09月29日 19:20
  • 793

Android通过反射获取屏幕大小,自动减去状态栏高度

publicint getDisplayScreenHeight()     {         int screenHeight=0;                 Di...
  • jalen_yuchi
  • jalen_yuchi
  • 2013年03月08日 15:24
  • 996

Android获取屏幕宽度的4种方法,android4种

方法一: WindowManager wm = (WindowManager) this .getSystemService(Context.WIN...
  • qq_39230245
  • qq_39230245
  • 2017年10月09日 00:06
  • 621

Android 获取设备屏幕的宽度和高度

这里推荐 Android 获取屏幕宽度和高度的四种方法。 方法一: WindowManager wm = (WindowManager) this.getSystemService(Context.W...
  • liuwan1992
  • liuwan1992
  • 2016年10月12日 10:59
  • 9874

android获得屏幕高度和宽度、状态栏高度

android获取屏幕的高度和宽度用到WindowManager这个类,两种方法: WindowManager wm = (WindowManager) getContext() ...
  • xiey94
  • xiey94
  • 2018年01月03日 17:44
  • 84

Android 之获取屏幕高度+状态栏高度

Android 屏幕高度 状态栏高度一.获取屏幕高度WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERV...
  • xfhy_
  • xfhy_
  • 2017年05月03日 10:18
  • 481

Android获取屏幕高度和宽度及获取状态栏高度

/** * 获得屏幕高度 * * @param context * @return */ public static int getScreenWidth(Context co...
  • syblackZoro
  • syblackZoro
  • 2017年02月14日 11:35
  • 85

获取屏幕和View宽度和高度的几种方式

用于获取屏幕的宽高和View的宽高
  • chinajpr
  • chinajpr
  • 2015年12月02日 11:27
  • 711

JS和jquery获取各种屏幕的宽度和高度

在《  pc页面按比例缩放嵌入移动页面显示 》中,需要用到计算当前页面的宽度,结合iframe的宽度来调整iframe的大小,在前文中计算当前页面宽度使用的是 window.scre...
  • mmoooodd
  • mmoooodd
  • 2017年02月21日 11:33
  • 765

[积累]android 获取屏幕高度和宽度 不准确的问题

android 获取屏幕高度和宽度 的方法 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即...
  • sfshine
  • sfshine
  • 2015年05月21日 09:35
  • 797
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android 获取屏幕高度,宽度,状态栏高度
举报原因:
原因补充:

(最多只允许输入30个字)