[整理]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中几种常见的尺寸

时间: 2024-10-06 00:10:46

[整理]android中几种常见的尺寸的相关文章

android中几种常见的尺寸

获取屏幕宽高尺寸的三种代码形式 在Android上,目前我知道的获取屏幕尺寸的方法有三种不同的代码形式 方法1.在Activity中最常见的调用方式 WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); int screenWidth = display.getWidth(); int screenHeight = display.getHeig

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

Android中三种超实用的滑屏方式汇总 现如今主流的Android应用中,都少不了左右滑动滚屏这项功能,(貌似现在好多人使用智能机都习惯性的有事没事的左右滑屏,也不知道在干什么...嘿嘿),由于前段时间项目的需要,所以也对其研究了一下,总的来说滑屏实现有三种方式:(至于其他的实现方式目前后还没碰到...) 1.ViewPager 2.ViewFlipper 3.ViewFlow 一.ViewPager 官方文档介绍:http://developer.android.com/reference/

Android中四种OnClick事件的写法

package com.example.dailphone; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.text.TextUtils; import android.content.Intent; import android.net.Uri; imp

php中五种常见的设计模式

设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Gamma.Richard Helm.Ralph Johnson 和 John Vlissides Design(俗称 “四人帮”).所介绍的设计模式背后的核心概念非常简单.经过多年的软件开发实践,Gamma 等人发现了某些具有固定设计的模式,就像建筑师设计房子和建筑物一样,可以为浴室的位置或厨房的构造方式开发模板.使用这些模板或者说设计模式 意味着可以更快地设计更好的建筑物.同样的概念也适用于软件. 设计模式不仅代表着更快开发健壮

Android中8种异步处理与计算的方法

注:该文章翻译自Ali Muzaffar的文章<8 ways to do asynchronous processing in Android and counting>  Android提供了许多API来支持异步处理的功能,结合着Java提供的方法和你手上拥有的,估计目前已经有数十种进行异步任务的方法. 目前的趋势是仅使用Java的threads或者Android的AsyncTask来处理各种问题.虽然上述两种方法拥有较高的知名度,但是并非所有的API都适合,为你的需求选择最合适的方法能够使

比较C#中几种常见的复制字节数组方法的效率[转]

[原文链接] 在日常编程过程中,我们可能经常需要Copy各种数组,一般来说有以下几种常见的方法:Array.Copy,IList<T>.Copy,BinaryReader.ReadBytes,Buffer.BlockCopy,以及System.Buffer.memcpyimpl,由于最后一种需要使用指针,所以本文不引入该方法. 本次测试,使用以上前4种方法,各运行1000万次,观察结果. using System; using System.Collections.Generic; using

android学习六(android中四种基本布局)

前面学习了android中的基本组件的使用,这一篇,我将总结下android中布局的使用,详细的看下面. 1.LinearLayout LinearLayoutyot又称线性布局,是一种常用的布局,它又可以有水平方向的和垂直方向的布局方式.前面一篇博文基本使用的是线性布局中的垂直布局,这个垂直布局的的方式是有属性android:orientation="vertical"控制的.如果把值指定为horizontal则控件就会在水平方向上排列了.下面我进行实战的操作吧. 新建一个andro

Android中三种视频的播放

在Android中,我们有三种方式来实现视频的播放: 1.使用其自带的播放器.指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型. 2.使用VideoView来播放.在布局文件中使用VideoView结合MediaController来实现对其控制. 3.使用MediaPlayer类和SurfaceView来实现,这种方式很灵活. 1.调用其自带的播放器: Uri uri = Uri.parse(Environment.getExternalStorageDir

JS中4种常见的内存泄漏

一.什么是内存泄漏 本质上讲,内存泄漏是当一块内存不再被应用程序使用的时候,由于某种原因,这块内存没有返还给操作系统或空闲内存池的现象. 二.几种常见的内存泄漏 1.意外的全局变量 一个未声明变量的引用会在全局对象中创建一个新的变量.在浏览器的环境下,全局对象就是window,也就是说: function foo(arg) { bar = "this is a hidden global variable"; } 实际上是: function foo(arg) { window.bar