获取屏幕宽高尺寸的三种代码形式

在Android上,目前我知道的获取屏幕尺寸的方法有三种不同的代码形式

方法1.在Activity中最常见的调用方式

WindowManager windowManager = getWindowManager();

Display display = windowManager.getDefaultDisplay();

int screenWidth = display.getWidth();

int screenHeight = display.getHeight();

由于在API Level 13以后上述的getWidth和getHeight包括getOrientation都变成了@Deprecated,所以屏幕宽高用getSize替换,也就有了方法2

Point outSize = new Point();

display.getSize(outSize);

screenWidth = outSize.x;

screenHeight = outSize.y;

显然要做API Level的区分感觉会不太舒服,那么就有了第三种通用形式

DisplayMetrics dm = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(dm);

screenWidth =dm.widthPixels;

screenHeight =dm.heightPixels;

其实上述三种代码形式,调用的都是WindowManager的default Display object里面的宽高尺寸,有些地方说上述这三种形式在屏幕未显示时是拿不到具体值的,会拿到全是0的情况,我在Activity的onCreate函 数中进行对其调用发现是能取到具体数值的,而且即使不在Activity中,通过Application的onCreate函数中的如下代码:

((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(dm);

也能顺利拿到具体的屏幕宽高值。

获取状态栏的尺寸

由于decorView是window中的最顶层view,可以从window中获取到decorView,然后decorView有个getWindowVisibleDisplayFrame方法可以获取到程序显示的区域,包括标题栏,但不包括状态栏。

于是就有了算出状态栏高度的第一种代码形式

Rect frame = new Rect();

getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);

int statusBarHeight = frame.top;

上述代码有时候获取到的高度是0,网上说法是在4.0.3版本以后的都会返回0,我没有亲测,但是在我的真机上确实拿到是0,网上流出一种在源码程序中获取状态栏高度的代码:

statusBarHeight = getResources().getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height);

那么在非源码中应该怎么获取呢?网上流行的一种解决方案,就是对上述需要源码的实现方式通过反射来实现状态栏高度的获取,具体代码如下:

import java.lang.reflect.Field;

//获取手机状态栏高度

public static int getStatusBarHeight(Context context){

Class<?> c = null;

Object obj = null;

Field field = null;

int x = 0, statusBarHeight = 38;//通常这个值会是38

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;

}

经过测试发现这个函数在状态栏隐藏的时候获得的值和状态栏显示时的值是一样的,不会变化,而且在做横竖屏测试时,也是一样不会改变,即状态栏的高度在手机上应该是固定的。

上面方法是参考了网上有个获取状态栏高度的帖子而来的

http://www.cnblogs.com/renkangke/archive/2013/05/27/3101375.html

获取标题栏高度

上面讲了获取状态栏,顺带就引出如何获取标题栏高度的问题,目前我所知道的获取标题栏高度的方法是不能在onCreate函数中直接使用,必须在UI显示出来后调用,具体大概是layout之后进行调用吧,具体代码如下:

int contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();

//statusBarHeight是上面所求的状态栏的高度

int titleBarHeight = contentTop – statusBarHeight;

上述方法的原理就是 getWindow().findViewById(Window.ID_ANDROID_CONTENT)这个方法获取到的view是程序不包括标题栏 的部分。由于不能直接在onCreate函数中调用,所以有些调用方法是在onCreate中起一个线程,然后延时调用。

我也不知道有什么方法可以更加靠谱的获取标题栏高度,如果有哪位技术牛人知道还望告知,另外这种方法与ContentView中的其它控件的尺寸获取一样,在onCreate中是无法直接获取的,直接获取都会是0。

另外在代码中我们使用的是具体的像素值,具体像素值是与设备相关的,我们一般不在代码中直接使用具体使用像素值,而是在资源文件中定义好设备无关的dp数值,然后通过类似如下方法获取具体的像素值
int padding = getResources().getDimensionPixelSize(R.dimen.broadcast_select_padding);
有时候也有一种具体数值的方法来获取像素值,比如上述的R.dimen.broadcast_select_padding假如是16dp,则可以通过下述方法获取像素值
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int padding = 16 * dm.scaledDensity
但是这种方法我并不建议使用,因为Android的设备品类太多,在有些手机上这种乘法获得的值与getResources().getDimensionPixelSize获得的值并不相等,而后者肯定比前者准确。

android中几种常见的尺寸的更多相关文章

  1. [整理]android中几种常见的尺寸

    获取屏幕宽高尺寸的三种代码形式 在Android上,目前我知道的获取屏幕尺寸的方法有三种不同的代码形式 方法1.在Activity中最常见的调用方式 WindowManager windowManag ...

  2. 自然语言处理的CNN模型中几种常见的池化方法

    自然语言处理的CNN模型中几种常见的池化方法 本文是在[1]的基础上进行的二次归纳. 0x00 池化(pooling)的作用   首先,回顾一下NLP中基本的CNN模型的卷积和池化的大致原理[2].f ...

  3. JS中几种常见的数组算法(前端面试必看)

    JS中几种常见的数组算法 1.将稀疏数组变成不稀疏数组 /** * 稀疏数组 变为 不稀疏数组 * @params array arr 稀疏数组 * @return array 不稀疏的数组 */ f ...

  4. Spring RestTemplate中几种常见的请求方式

    https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate在Spring Cloud中服务的发现与消费一文中,当我们从服务消 ...

  5. Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求

    Spring RestTemplate中几种常见的请求方式 原文地址: https://blog.csdn.net/u012702547/article/details/77917939   版权声明 ...

  6. Android中三种超实用的滑屏方式汇总(转载)

    Android中三种超实用的滑屏方式汇总   现如今主流的Android应用中,都少不了左右滑动滚屏这项功能,(貌似现在好多人使用智能机都习惯性的有事没事的左右滑屏,也不知道在干什么...嘿嘿),由于 ...

  7. Android中四种补间动画的使用示例(附代码下载)

    场景 Android中四种补间动画. 透明度渐变动画 旋转动画 缩放动画 平移动画 注: 博客: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程 ...

  8. Android学习记录(2)—Android中数据库的常见操作

    android中数据库操作是非常常见了,我们会经常用到,操作的方法也有很多种形式,这里我就把最常见的两种形式记录下来了,以备以后用到方便查看.我就不写注释和解释了,因为android数据库的操作和其它 ...

  9. Android的三种主流资源尺寸

    Android三种主流资源屏幕尺寸:QVGA.HVGA.WVGA VGA的分辨率是640x480像素 QVGA(Quarter VGA)就是320x240,即VGA分辨率的1/4 HVGA(Half ...

随机推荐

  1. Visual Studio的2个有趣的插件:声音控制和放屁:)

    .NET Slave | Talk to, hear, touch and see your code介绍了2个有趣的Visual Studio的插件,你可以通过它们和你的代码对话. 声音控制(Voi ...

  2. Android中scrollview的scrollto方法不起作用的办法

    有时候,我们在onCreate函数中调用ScrollBy函数.ScrollTo函数,会出现无效果的情况 public class ShowTraffic extends Activity Scroll ...

  3. 网络编程---(数据请求+slider)将网络上的大文件下载到本地,并打印其进度

    网络编程---将网络上的大文件下载到本地,并打印其进度. 点击"開始传输"button.将网络上的大文件先下载下来,下载完毕后,保存到本地. UI效果图例如以下: watermar ...

  4. VS项目属性配置实验过程

    (原创,转载注明出处:http://www.cnblogs.com/binxindoudou/p/4017975.html ) 一.实验背景 cocos2d-x已经发展的相对完善了,从项目的创建.编译 ...

  5. IE6和IE7下绝对定位position:absolute和margin的冲突问题解决

    绝对定位的Position:absoulte的元素,会让相邻的兄弟元素的margin-top失效.而如果去掉了兄弟元素的高度又会正常. <div id="layer1" st ...

  6. composer 说明<转>

    转自  http://blog.csdn.net/zzulp/article/details/18981029 Composer是一个基于项目的依赖管理器,负责将PHP项目所依赖的包或库安装到项目所在 ...

  7. COGS 445. [HAOI2010]最长公共子序列

    #include<iostream> #include<cstdio> #include<cstring> #define mod 100000000 #defin ...

  8. Struts2 删除后直接直接到List显示页面

    package com.sun; import java.util.List; import java.util.Map; import org.hibernate.Session; import o ...

  9. 顶部图片放大回弹效果Scrollview ---- 各应用中常见的自定义View 解析

    原理并不难.  代码量也不大.  非常简洁 .  先来个效果图 再上一波代码. public class SpecialScrollView extends ScrollView implements ...

  10. Scene is unreachable due to lack of entry points and does not have an identifier for runtime access

    使用Storyboard时出现以下警告: warning: Unsupported Configuration: Scene is unreachable due to lack of entry p ...