android中几种常见的尺寸
获取屏幕宽高尺寸的三种代码形式
在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中几种常见的尺寸的更多相关文章
- [整理]android中几种常见的尺寸
获取屏幕宽高尺寸的三种代码形式 在Android上,目前我知道的获取屏幕尺寸的方法有三种不同的代码形式 方法1.在Activity中最常见的调用方式 WindowManager windowManag ...
- 自然语言处理的CNN模型中几种常见的池化方法
自然语言处理的CNN模型中几种常见的池化方法 本文是在[1]的基础上进行的二次归纳. 0x00 池化(pooling)的作用 首先,回顾一下NLP中基本的CNN模型的卷积和池化的大致原理[2].f ...
- JS中几种常见的数组算法(前端面试必看)
JS中几种常见的数组算法 1.将稀疏数组变成不稀疏数组 /** * 稀疏数组 变为 不稀疏数组 * @params array arr 稀疏数组 * @return array 不稀疏的数组 */ f ...
- Spring RestTemplate中几种常见的请求方式
https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate在Spring Cloud中服务的发现与消费一文中,当我们从服务消 ...
- Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求
Spring RestTemplate中几种常见的请求方式 原文地址: https://blog.csdn.net/u012702547/article/details/77917939 版权声明 ...
- Android中三种超实用的滑屏方式汇总(转载)
Android中三种超实用的滑屏方式汇总 现如今主流的Android应用中,都少不了左右滑动滚屏这项功能,(貌似现在好多人使用智能机都习惯性的有事没事的左右滑屏,也不知道在干什么...嘿嘿),由于 ...
- Android中四种补间动画的使用示例(附代码下载)
场景 Android中四种补间动画. 透明度渐变动画 旋转动画 缩放动画 平移动画 注: 博客: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程 ...
- Android学习记录(2)—Android中数据库的常见操作
android中数据库操作是非常常见了,我们会经常用到,操作的方法也有很多种形式,这里我就把最常见的两种形式记录下来了,以备以后用到方便查看.我就不写注释和解释了,因为android数据库的操作和其它 ...
- Android的三种主流资源尺寸
Android三种主流资源屏幕尺寸:QVGA.HVGA.WVGA VGA的分辨率是640x480像素 QVGA(Quarter VGA)就是320x240,即VGA分辨率的1/4 HVGA(Half ...
随机推荐
- zookeeper选举代码分析
本文将以zookeeper的3.4.6版本作为源码分析版本.主要的代码类包括QuorumPeerMain.QuorumPeer.FastLeaderElection.QuorumMaj等. 假设有a, ...
- [置顶] Oracle 11g R2 RAC:使用 srvctl 工具管理 service 资源
1.使用 srvctl 工具创建 service 资源 srvctl add service -d db_unique_name -s service_name {-r "preferred ...
- poj 3171 Cleaning Shifts(区间的最小覆盖价值)
Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2743 Accepted: 955 De ...
- 自我理解foreach工作原理
很多时候我们在使用for循环遍历一个数组的时候,我们都知道可以通过下标的索引找到当前数组中所对应的数据.这只对于简单的数组或集合,如果我们存储的数据不止只有数据项,还有一个标识项,就如同Has ...
- JavaScript--execCommand指令集
execCommand方法是执行一个对当前文档,当前选择或者给出范围的命令.处理Html数据时常用 如下格式:document.execCommand(sCmd,交互方式, 动态参数) .其中:sCm ...
- [转] 学习HTML/JavaScript/PHP 三者的关系以及各自的作用
1.What is HTML? When you write a normal document using a word processor like Microsoft Word/Office, ...
- CentOS下FTP服务器安装与配置
安装vsftpd yum install vsftpd 启动/重启/关闭vsftpd服务器 CentOS7 以下: 启动: service vsftpd start 停止: service vsftp ...
- oracle的sql优化
http://www.cnblogs.com/rootq/archive/2008/11/17/1334727.html
- asp.net微信开发第五篇----用户分组管理
上一篇已讲解到新建用户分组,移动用户到分组的功能,这一章主要讲解修改分组名称和删除分组 开发者可以使用接口,对公众平台的分组进行查询.创建.修改.删除等操作,也可以使用接口在需要时移动用户到某个分组. ...
- 键盘数字对应的ASCII码(keycode码)
keycode 1 = 鼠标左键keycode 2 = 鼠标右键keycode 3 = Cancelkeycode 4 = 鼠标中键keycode 8 = BackSpace keycode 9 = ...