Android初级教程:屏幕分辨率

在app编码中经常需要获取手机的屏幕分辨率(宽*高),原来我直接上网拷贝代码,但在使用过程中却发现诸多不便。

不便一:下面代码中的getWidth和getHeight在adt上提示deprecated已经废弃了,实在扎眼

WindowManager wm = getWindowManager();
Display display = wm.getDefaultDisplay();
int screenWidth = display.getWidth();
int screenHeight = display.getHeight(); 

查看android源码说可使用getSize替代,于是换成getSize并把代码提炼到工具类中

    public static Point getSize(Activity act) {
        Display display = act.getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);  //size.x就是宽度,size.y就是高度
        return size;
    }  

用了一阵发现又有不便,原因是getWindowManager方法只能在activity中使用或者被activity实例调用,那像我们在Fragment或者Adapter中想获得屏幕分辨率,又有困难了(因为Fragment和Adapter一般只有Context),虽然可以通过强制类型转换来处理,可是毕竟劳民伤财需要时时记得去转换。所以又改了从Context获取系统服务,然后再去取分辨率,改后的代码如下

    public static Point getSize(Context ctx) {
        WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        return size;
    }  

再后来发现通过DisplayMetrics也能获取分辨率,依网上的做法照猫画虎如下:

    public static Point getSizeNew(Context ctx) {
        WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);
        Point size = new Point();
        size.x = dm.widthPixels*dm.density;
        size.y = dm.heightPixels*dm.density;
        return size;
    }  

不就便发现这个新方法时常量错了,找来找去又自己反复实践,结果确认widthPixels和heightPixels就是宽和高,无需再乘上density。因为widthPixels和heightPixels的单位都是像素,而density指的是像素密度,即一个单位内有几个像素,所以在我这边乘上density没有意义,只有除以density才有意义。dm.widthPixels/dm.densit指的是宽度上有多少单位,dm.heightPixels/dm.density指的是高度上有多少单位。网上乘上density的做法,可能只是他们恰好遇上部分特殊机型罢了。最后的代码如下

    public static Point getSizeNew(Context ctx) {
        WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);
        Point size = new Point();
        size.x = dm.widthPixels;
        size.y = dm.heightPixels;
        return size;
    }  
时间: 2024-12-17 03:29:47

Android初级教程:屏幕分辨率的相关文章

Android不同手机屏幕分辨率自适应【转】

有必要了解的 Android中常见的单位 dip, dp, px, sp之间的区别: dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不依赖像素.px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多.pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用:sp: scal

android DisplayMetrics 获取屏幕分辨率

Android 提供DisplayMetircs 类可以很方便的获取分辨率.下面介绍 DisplayMetics 类: Andorid.util 包下的DisplayMetrics 类提供了一种关于显示的通用信息,如显示大小,分辨率和字体. 为了获取DisplayMetrics 成员,首先初始化一个对象如下: DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetri

【android】根据屏幕分辨率设置底栏高度

<pre name="code" class="java"> public void setFooterHeightWithScreen() { //得到屏幕分辨率 int srcWidth =getWindowManager().getDefaultDisplay().getWidth(); // Log.i("f", srcWidth.toString()); //System.out.print(srcWidth); //得到按

Android初级教程理论知识(第九章多媒体编程)

多媒体概念 文字.图片.音频.视频 计算机图片大小的计算 图片大小 = 图片的总像素 * 每个像素占用的大小 单色图:每个像素占用1/8个字节 16色图:每个像素占用1/2个字节 256色图:每个像素占用1个字节 24位图:每个像素占用3个字节 加载大图片到内存 Android系统以ARGB表示每个像素,所以每个像素占用4个字节,很容易内存溢出 对图片进行缩放 获取手机屏幕宽高(分辨率) Display dp = getWindowManager().getDefaultDisplay(); i

Android初级教程初谈自定义view自定义属性

有些时候,自己要在布局文件中重复书写大量的代码来定义一个布局.这是最基本的使用,当然要掌握:但是有些场景都去对应的布局里面写对应的属性,就显得很无力.会发现,系统自带的控件无法满足我们的要求,这个时候就要考虑自定义控件.自定义view的世界,也很浩瀚,个人需要学的地方还有很多很多.自定义view,会节省开发效率,很有必要学习其基本原理和方法.接下来就对自定义view,做一个初步的认识,一步步了解封装的重要性.但是,也仅仅是一个初步,因为它实在太灵活了. 有这么一种场景,看图: 除了布局之外,还有

为什么Android应该根据屏幕分辨率来加载不同的图片文件

1.图片在xxhdpi,手机是hdpi的 我们有一个手机是hdpi的.我们还有一个图片,我们把他放在xxhdpi下.当手机显示的时候,系统会去hdpi中找,发现没有图片,最终在xxhpi中找到.终于找到图片后,系统会觉得xxhdpi中的图片一定很大,而我要把它显示在hdpi的手机中的话就应该压缩下图片,最终成为了原图的1/4,而压缩后的图片会损失一些东西,就会造成模糊的情况.这样的坏处也是显而易见的,显示到手机的图片资源清晰度下降,模糊了很多. 2.图片在dpi,手机是hdpi的 系统先去hdp

如何让Android字体自适应屏幕分辨率

在不同的分辨率下,Android字体大小怎么自适应分辨率的变化? 假设需要适应320x240,480x320分辨率.在res目录下新建文件夹values-320x240, values-480x320.然后在文件夹 values ,values-320x240 和 values-480x320 下新建xml文件dimens.xml,该xml文件内容如下: <?xml version="1.0" encoding="utf-8"?> <resourc

Android初级教程理论知识(第七章服务)

服务两种启动方式 startService:服务被启动之后,跟启动它的组件没有一毛钱关系 bindService:跟启动它的组件同生共死 绑定服务和解绑服务的生命周期方法:onCreate->onBind->onUnbind->onDestroy 找领导办证 把服务看成一个领导,服务中有一个banZheng方法,如何才能访问? 绑定服务时,会触发服务的onBind方法,此方法会返回一个Ibinder的对象给MainActivity,通过这个对象访问服务中的方法 绑定服务 Intent i

Android初级教程:Android中解析方式之pull解析

在安卓中有很多种解析方式.按照大方向有xml解析和json解析.而,细致的分,xml和json解析各有自己的很多解析方式.今天这一篇主要介绍xml解析中的pull解析.对于xml的解析方式,我之前在javaweb一些知识中有写过dom和dom4j等等解析方式.有兴趣的读者可以去javaweb篇里面找相关的内容. 先自定义一个数据源,假设就是访问服务器返回的xml数据文件名称为weather.xml: <?xml version='1.0' encoding='utf-8' standalone=