Android 获取屏幕高度,宽度,状态栏高度
背景介绍:
到目前为止,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系统中获取屏幕高度和宽度的方法没有改变。
状态的获取方法如下:
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);
经试验Android4.0以上平台也依然可以用最上面的方法获取状态栏高度
Android 获取屏幕高度,宽度,状态栏高度的更多相关文章
- Android获取屏幕高度、标题高度、状态栏高度详解
Android获取屏幕高度的方法主要由view提供 通过View提供的方法获取高度方式有两种: 1, 当前显示的view中直接获取当前view高宽2,通过Activity的getWindow().fi ...
- 获取Android 手机屏幕宽度和高度以及获取Android手机序列号
1.获取Android 手机屏幕宽度 1 DisplayMetrics dm = new DisplayMetrics(); 2 this.getWindowManager().getDefaultD ...
- js获取屏幕高度宽度
获取各种屏幕的宽度和高度Javascript: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽 ...
- android 获取屏幕高度和宽度 的方法
我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现.下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即可获取屏幕的尺寸. 在一个Activity的onC ...
- android: 获取屏幕高度和虚拟导航栏高度的几种方法
package com.yongdaimi.android.androidapitest; import android.app.Activity; import android.content.Co ...
- Android开发之获取状态栏高度、屏幕的宽和高
转自:http://blog.csdn.net/guolin_blog/article/details/16919859 获取状态栏的高度. private static int statusBarH ...
- android 获得屏幕宽度和高度
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...
- js和jQuery 获取屏幕高度、宽度
js获取屏幕高度,宽带 网页可见区域宽:document.body.clientWidth网页可见区域高:document.body.clientHeight网页可见区域宽:document.body ...
- android获取自己定义控件位置坐标,屏幕尺寸,标题栏,状态栏高度
android获取自己定义控件位置坐标,屏幕尺寸,标题栏,状态栏高度 1.获取自己定义控件height 在本Activity中获取当前Activity中控件的height: Button button ...
随机推荐
- 优惠书价计算---c++--软件工程
一.题目 书店针对<哈利波特>系列书籍进行促销活动,一共5卷,用编号0.1.2.3.4表示,单独一卷售价8元, 具体折扣如下所示: ...
- python解析xml之lxml
虽然python解析xml的库很多,但是,由于lxml在底层是用C语言实现的,所以lxml在速度上有明显优势.除了速度上的优势,lxml在使用方面,易用性也非常好.这里将以下面的xml数据为例,介绍l ...
- android开发连接wifi addNetwork 返回-1
如下代码:(注释掉的是会返回-1的代码,未注释的是能够正常连接wifi的代码) // public WifiConfiguration CreateWifiInfo(String SSID, Stri ...
- curl Protocol 'http not supported or disabled in libcurl
C:\Documents and Settings\ganiks.liu\Desktop\curl-7.37.0-win32\bin>curl -V curl 7.37.0 (i386-pc-w ...
- Dijkstra算法亲自实践
按路径长度递增次序产生算法: 把顶点集合V分成两组: (1)S:已求出的顶点的集合(初始时只含有源点V0) (2)V-S=T:尚未确定的顶点集合 将T中顶点按递增的次序加入到S中,保证: (1)从源点 ...
- HDU 5695 Gym Class 拓扑排序
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5695 题解: 求出字典序最大的拓扑序.然后把求好的数列翻转过来就是满足条件的数列,然后模拟求一下va ...
- Ext中如何校验TextField的字段被修改了?
场景描述: 在form表单中有个sfzhm的字段,需要去后台进行sfzhm是否重复的校验,一开始使用了blur的event来去后台进行校验,后来发现在焦点离开时,及时数据没有发生变化,也会造 ...
- 【Python】网络编程
1.TCP编程 2.SocketServer模块 3.Twisted框架 4.UDP编程 1.TCP编程--TCP是面向连接的,其一般的设计如下: # encoding:utf-8 ''' Creat ...
- sqlite时间比较语法
如下: 字段 > datetime('2000-01-01 01:01:01') AND 字段 < datetime('2001-01-01 01:01:01');
- destoon使用中的一些心得
//**************************index首页相关参数**************************************// //全局变量 {if $seo_titl ...