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 ...
随机推荐
- 在树莓派1B上编译安装lnmp服务器
最近一周给部门内部搭建考试系统,选择使用PHPEMS.这是个开源的系统,唯一缺点是PHP的版本比较低,只能使用5.2或5.3.而我的树莓派系统更新后使用apt-get安装得到的PHP版本为5.4.由于 ...
- Android Intent传递对象小结
效果: 想看实例的,感兴趣的能够看之前的一篇文章 Android ViewPager Fragment实现选项卡 部分关键代码: public class SerializeActivity exte ...
- 【转】Android TextView SpannableStringBuilder 图文混排颜色斜体粗体下划线删除线
spannableStringBuilder 用法详解: SpannableString ss = new SpannableString("红色打电话斜体删除线绿色下划线图片:." ...
- 查看linux系统状态
就类似你装完xp后,或者你拿到一台新的机器的时候,你通常都是进入系统,看看他的cpu,内存,硬盘使用情况.我也按照这个来看看linux的系统状态.1:top 退出按q,这个就类似windows的任务管 ...
- Python操作MySQL -即pymysql/SQLAlchemy用法
本节介绍Python对于MySQL的一些操作用法 模块1:pymysql(等同于MySQLdb) 说明:pymysql与MySQLdb模块的使用基本相同,学会pymysql,使用MySQLdb也就不是 ...
- Android Studio 使用GitHub
Android Studio 使用GitHub 1.安装配置 默认大家都已经安装了git软件,参考下图进行git与as关联 配置git 设置GitHub用户信息 填写完用户名,密码后可以点击Tes ...
- IIS相关问题
问题:使用vs开发项目完成后,发布在本地IIS上,访问链接出现如下情况: 解决方案:打开IIS--->>
- CSS之后代选择器与多类选择器
<新人报到,欢迎拍砖#- -> 一.后代选择器 说起CSS的后代选择器.它属于派生选择器中的一种,两者附属关系如下: -->派生选择器 ----CSS 后代选择器 ----CSS 子 ...
- ACM比赛技巧
一.语言是最重要的基本功 无论侧重于什么方面,只要是通过计算机程序去最终实现的竞赛,语言都是大家要过的第一道关.亚洲赛区的比赛支持的语言包括C/C++与JAVA.笔者首先说说JAVA,众所周知,作 ...
- 地址栏访问Action,后来方法执行两次
SSH框架,在地址栏输入URL访问Action,后台访问会访问两次.很奇怪. 经排查,最终问题在于方法名称写错了.将getOpinionByPN()修改成queryOpinionByPN(),没有问题 ...