Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化)
来源:互联网 发布:sql server 打开表 编辑:程序博客网 时间:2024/06/07 02:11
获取屏幕宽和高的两种方法
方法一、代码如下:
WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); Log.i(tag, "屏幕尺寸1: 宽度 = "+display.getWidth()+"高度 = :"+display.getHeight());
方法二、代码如下:
DisplayMetrics dm =getResources().getDisplayMetrics(); int w_screen = dm.widthPixels; int h_screen = dm.heightPixels; Log.i(tag, "屏幕尺寸2:宽度 = " + w_screen + "高度 = " + h_screen + "密度 = " + dm.densityDpi);
方法一的方法已经被遗弃了,推荐用方法2的方法,除获得屏幕的宽和高外还可以获得屏幕的密度。这里必须注意,获得的尺寸单位为px,即像素,而不是屏幕的绝对尺寸。
在G700上得到的参数如下:
Line 1297: 12-08 11:39:09.037 I/yan (13602): 屏幕尺寸1: 宽度 = 720高度 = :1280
Line 1299: 12-08 11:39:09.037 I/yan (13602): 屏幕尺寸2:宽度 = 720高度 = 1280密度 = 320
在Geek手机上参数如下:
Line 1511: 01-06 03:11:20.839 I/yan (30175): 屏幕尺寸1: 宽度 = 1080高度 = :1920
Line 1513: 01-06 03:11:20.839 I/yan (30175): 屏幕尺寸2:宽度 = 1080高度 = 1920密度 = 480
可以看到,同样是5.0寸的屏幕,一个密度是320,一个密度是480.同样的物理宽度,后者是1080个像素而前者是720个像素。
px与dip的概念及互相转化
px即pixels,是绝对像素,有多少个像素点就是多少个像素点。
dip即device independent pixel,设备独立像素,无像素无关。
二者转换公式如下:
import android.content.Context; public class DisplayUtil { public static int dip2px(Context context, float dipValue){ final float scale = context.getResources().getDisplayMetrics().density; return (int)(dipValue * scale + 0.5f); } public static int px2dip(Context context, float pxValue){ final float scale = context.getResources().getDisplayMetrics().density; return (int)(pxValue / scale + 0.5f); } }
转换时牵涉到一个密度的概念,密度越大,单位物理尺寸上的像素点就越多,dip也就越大。从转换公式上也可以看到,px近似等于dip*density。dip跟dp一个意思,在android开发中推荐像素使用dip概念。举个简单的例子,如果扫描矩形框的长度为300px,在density为320和480的手机屏幕上显示效果是完全不一样的,因此单位要使用dip。但是在使用canvas绘制东西时,所依照的坐标系、Rect等单位都是px,所以其尺寸要以dip为单位,而坐标要以px为单位。假设要以屏幕的中心为正方形的中心,画一个边长为D的正方形,设D = 240dip. 代码如下:
Point center_dip = new Point(DisplayUtil.px2dip(this, dm.widthPixels)/2, DisplayUtil.px2dip(this, dm.heightPixels)/2); //以dip为单位的中心 square_screen = new Rect(DisplayUtil.dip2px(this, center_dip.x - D/2), DisplayUtil.dip2px(this,center_dip.y - D/2), DisplayUtil.dip2px(this,center_dip.x + D/2), DisplayUtil.dip2px(this,center_dip.y + D/2));
首先得到dip为单位的屏幕中心,然后以D(单位dip)得到单位为dip的正常性坐标,再将其转换成单位为px的坐标,这样在不同的手机上显示效果就是一样的。其实可以这么看待dip,dip有点类似手机的物理尺寸,尽管实际上不是。dip = px/density,geek 5.0寸屏跟G700,得到的结果是一样的:1080/3 = 720/2
总结:
densityDpi 每英寸多少个像素点,
density = densityDpi /160
APP根据densityDpi的大小决定调用哪个文件夹下的图片,关系如下:
drawable-ldpi 底密度,通常是指120
drawable-mdpi 中等密度,通常是指160
drawable-xhdpi 超高密度,通常是指320
px = dip*density
在绘制矩形时,可以首先获得屏幕宽度的dip,根据dip决定边长D,然后用文中的方法确定其px坐标。来张效果图:
分辨率的概念
现在人们经常把320*240成为 分辨率,其实是不准确的,这仅仅是图片的像素点总数罢了,分辨率的概念是每英寸上的像素点数,单位为dpi.在windows下右键属性–摘要–高级里可以查看,一般图片的dpi为96DPI。这个单位根ps下的有出入,但都是一回事。详情参见:百度提供,点击查看
- Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化)
- Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化)
- Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化)
- Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化)
- Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化)
- Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化)
- Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化)
- Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化)
- Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化)
- 屏幕适配中的dip与px之间的转化
- android px、dp(dip)、dpi基本概念及之间的关系
- Android分辨率中dip, dp, px, sp之间的区别
- android的dip与px
- android的dip与px
- Android dip dp px dpi之间的关系
- Android 开发中,px、dip、density 间的关系,用于多分辨率适配
- Android中px与dip,sp的转化
- Android中px与dip,sp的转化
- PHP+JS动态显示服务器时间,本地时间
- iOS 应用安装失败原因排查
- boa+cgi上传文件
- classes could not be instantiated: - android.support.v7.internal.widget.ActionBarOverlayLayout
- 笔试题2-数组
- Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化)
- 苹果iOS 5限制应用本地存储问题 与 APP ios5 本地存储原因被据
- c++运算符使用友元函数重载问题
- QT弹出消息框
- 鸽巢原理
- kprobe内核探测介绍
- zigbee按键
- Spring MVC Controller单例陷阱
- HDU4771(BFS)