Android开发中dip,dpi,density,px等详解
2017-11-23 15:38
295 查看
Android开发中的各种单位的解释
Px (Pixel像素)也称为图像元素,是作为图像构成的基本单元,单个像素的大小并不固定,跟随屏幕大小和像素数量的关系变化(屏幕越大,像素越低,单个像素越大,反之亦然)。所以在使用像素作为设计单位时,在不同的设备上可能会有缩放或拉伸的情况。
Resolution(分辨率)
是指屏幕的垂直和水平方向的像素数量,如果分辨率是 1920*1080 ,那就是垂直方向有 1920 个像素,水平方向有 1080 个像素。
Dpi(像素密度)
是指屏幕上每英寸(1英寸 = 2.54 厘米)距离中有多少个像素点。如果屏幕为 320*240,屏幕长 2 英寸宽 1.5 英寸,Dpi = 320 / 2 = 240 / 1.5 = 160。
Density(密度)
这个是指屏幕上每平方英寸(2.54 ^ 2 平方厘米)中含有的像素点数量。
Dip / dp (设备独立像素)
也可以叫做dp,长度单位,同一个单位在不同的设备上有不同的显示效果,具体效果根据设备的密度有关,详细的公式请看下面 。
计算规则
我们以一个 4.95 英寸 1920 * 1080 的 nexus5 手机设备为例:Dpi :
计算直角边像素数量: 1920^2+1080^2=2202^2(勾股定理)。计算 DPI:2202 / 4.95 = 445。
得到这个设备的 DPI 为 445 (每英寸的距离中有 445 个像素)。
Density
上面得到每英寸中有 440 像素,那么 density 为每平方英寸中的像素数量,应该为: 445^2=198025。Dip
先明白一个概念,所有显示到屏幕上的图像都是以 px 为单位。Dip 是我们开发中使用的长度单位,最后他也需要转换成 px。
计算这个设备上 1dip 等于多少 px:
px = dip x dpi /160
px = 1 x 445 / 160 = 2.78
通过上面的计算可以看出在此设备上 1dip = 2.78px,那么这是一个真实的故事吗? nonono,其中的关键值 dpi 并不是我们算出来的 445 ,请往下看。
Android 系统定义的 Dpi
上面计算的 445Dpi 是在 4.95 英寸下的 1920*1080 手机,那如果是 4.75 分辨率下的呢? 4.55 分辨率下的呢?。。。。可见是很麻烦的,同一个分辨率在不同的屏幕尺寸上 Dpi 也不相同。为了解决这个问题, Android 中内置了几个默认的 Dpi ,在特定的分辨率下自动调用,也可以手动在配置文件中修改。ldpi | mdpi | hdpi | xhdpi | xxhdpi | |
---|---|---|---|---|---|
分辨率 | 240×320 | 320×480 | 480×800 | 720×1280 | 1080×1920 |
系统dpi | 120 | 160 | 240 | 320 | 480 |
基准比例 | 0.75 | 1 | 1.5 | 2 | 3 |
我们亲自尝试一下:
123456 | <TextView android:id="@+id/tv" android:layout_width="200dp" android:layout_height="100dp" android:text="Hello World!" /> |
123 | height = 100 x 445 / 160 = 278.5pxwidth = 200 x 445 / 160 = 556.25px |
123456789 | layout = (RelativeLayout)findViewById(R.id.la);//要在控件绘制完成后才能获取到相关信息,所以这里要监听绘制状态layout.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { public boolean onPreDraw() { Log.d("hehehe", textView.getHeight() + "/" + textView.getWidth()); return true; }}); |
内部计算过程为:
123 | height = 100 x 480 / 160 = 300pxwidth = 200 x 480 / 160 = 600px |
找到我们手机中的 /system/build.prop 文件,其中有一行是这样:
ro.sf.lcd_density=480这就指定了这个机型使用的dpi是多少,还有一种情况是没有这一行(我在模拟器中发现过),那么应该是根据表格中的分辨率来自动设置。我更改这行为:
ro.sf.lcd_density=320再次运行上面的测试代码,输出结果为:200/400
内部计算过程为:
123 | height = 100 x 320 / 160 = 200pxwidth = 200 x 320 / 160 = 400px |
123 | height = 100 x 480 / 160 = 300pxwidth = 200 x 480 / 160 = 600px |
分辨率:720×1280 -> 系统 DPI:320 -> 基准比例:320 / 160 = 2 -> 对应px:100 x 2 = 200
分辨率:480×800 -> 系统 DPI:240 -> 基准比例:240 / 160 = 1.5 -> 对应px:100 x 1.5 = 150
分辨率:320×480 -> 系统 DPI:160 -> 基准比例:160 / 160 = 1 -> 对应px:100 x 1 = 100
分辨率:240×320 -> 系统 DPI:120 -> 基准比例:120 / 160 = 0.75 -> 对应px:100 x 0.75 = 75
……………….
总结:
1. dpi(每英寸像素数)是有预设值的!120-160-240-320-480。对应不同的分辨率。2. 基准比例 = dpi(每英寸像素数) / 1603. px = dp x 基准比例从代码中获取相关数值
我们主要使用的类是:DisplayMetrics以下为官方api说明A structure describing general information about a display, such as its size, density, and font scaling.
To access the DisplayMetrics members, initialize an object like this:
>> DisplayMetrics metrics = newDisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);这是一个获取屏幕信息的类,比如大小,密度等。以及初始化的方法。实际运用如下:
1234567891011121314151617181920 | DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);//通常我们在使用DisplayMetrics时,都是直接获取内部变量来使用。所以下面直接列出各个内部变量。 dm.ydpi; //得到物理屏幕上 Y 轴方向每英寸的像素dm.xdpi; //得到物理屏幕上 X 轴方向每英寸的像素 //ps: 其实这两个大多数情况下都是相同的 //你能想象上面像素密度大很清晰 下面密度小跟马赛克一样吗 233333 dm.density; //获取当前设备的基准比例dm.densityDpi; //获取系统dpi,随着 build.prop 文件中的代码而改变。 dm.widthPixels; //获取屏幕宽度的像素数量 //获取屏幕高度的像素数量!//注意 - 因为这里会自动减去32dp的像素数量,根据分辨率不同的设备,减去的像素数量也不同,但是可以根据公式推算完整(px = dp x 基准比例)。/*为啥不用dm.densityDpi / 160 得到基准比例? 因为那个会随着build.prop文件代码变更而更改,算出来的不一定准确*/dm.heightPixels + 32 * dm.ydpi / 160; |
相关文章推荐
- Android开发中dip,dpi,density,px等详解
- 前端开发 基础知识 dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算
- Android---- android计量单位--dip、px、sp之间区别与联系pixs =dips * (densityDpi/160). dips=(pixs*160)/d
- Android屏幕适配问题,dip,px,dpi,ppi,sp,density,分辨率,尺寸详细解释及转换
- Android的px,dpi,dip三者的关系详解
- android开发中px,dip,dp,sp,dpi的区别,以及dp与px换算公式.
- Android中dpi,dp,dip,px.sp等各种单位详解
- 详解android系统的适配(px,density,dpi,分辨率)
- android中常见单位 dp,sp,px,pt,in,mm,dpi,dip详解
- 『ANDROID』Android中px dpi dip density densityDpi 的相关说明
- Android开发(44) android单位dp(dip)、px、pt、sp详解
- 全面理解Android中的Px,DPI,DIP,Density,Sp等概念
- Android 开发中,px、dip、density 间的关系,用于多分辨率适配
- Android 分辨率 dip dp dpi px sp 详解
- android dp sp px dpi dip density 之水落石出
- Android中像素单位dip、dpi、px、pt、sp、in等等的全面详解
- android应用开发之View的大小计量单位(px、dpi、dp、dip、sp)
- Android之px/dpi/dip/dp/density/DisplayMetrics和屏幕适配
- android应用开发之View的大小计量单位(px、dpi、dp、dip、sp)
- android 适配相关知识(一) -- density dpi px dp dip sp 解释