Android中DP、DPI以及PX概念
来源:互联网 发布:晚清民国报刊数据库 编辑:程序博客网 时间:2024/06/05 03:33
Android开发中布局经常使用dp、sp以及px等,而且UED同学也会使用px设计视觉稿,我们在使用的时候要转换为dp,但具体为什么,很多开发人员还不是很清楚。同时Android开发涉及到不同图片资源文件夹比如Drawable、Drawable-dpi以及Drawable-xhdpi,这个又是怎么区别以及使用呢?看了这篇文章之后可能你就会恍然大悟了、、
-
DP、PX等概念
DP=DIP(Device-independent pixel,设备独立像素)。可作长度单位,不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。dip和具体像素值的对应公式是dip值 =设备密度/160* pixel值,可以看出在dpi(像素密度)为160dpi的设备上1px=1dip。这里如果不理解,就记住是设备独立像素就行啦。
PX=Pixel(像素)这里的“相同”是指像素数不会变,比如指定UI长度是100px,那不管分辨率是多少UI长度都是100px。也正是因为如此才造成了UI在小分辨率设备上被放大而失真,在大分辨率上被缩小。
DPI (dots per inch像素密度)指每英寸中的像素数。如160dpi指手机水平或垂直方向上每英寸距离有160个像素点。假定设备分辨率为320*240,屏幕长2英寸宽1.5英寸,dpi=320/2=240/1.5=160。这个在接口api中是densityDpi
Resolution(分辨率)指手机屏幕垂直和水平方向上的像素个数。比如分辨率是480*320,则指设备垂直方向有480个像素点,水平方向有320个像素点。
Screen Size(屏幕尺寸) 一般所说的手机屏幕大小如1.6英寸、1.9英寸、2.2英寸,都是指的对角线的长度,而不是手机面积。我们可以根据勾股定理获取手机的宽和长,当然还有面积。
Density指每平方英寸中的像素数。Density=Resolution/Screen size
SP(Scaled Pixels 放大像素)主要用于字体显示(best for textsize)。根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看TextView的源码可知 Android 默认使用 sp 作为字号单位。现在大多数公司开发都使用DP来设置字体大小,主要是因为dp不会随着系统字体大小改变而变化,而sp会随用户设置系统字体而变化。
**这些数据可以通过下面的代码获取**
DisplayMetrics dm = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
screenWidth = dm.widthPixels;
screenHeight = dm.heightPixels;
densityDpi = dm.densityDpi;
scale = dm.density;
fontScale = dm.scaledDensity;
PX与DP、SP转换
对上面那么多的常用单位了解之后,接下来就是怎么计算他们之间的关系了。开发中老司机一般都会使用DP作为图片以及字体的大小,因为DP是设备独立像素,就是说可以自动适配不同的屏幕(话说Android手机屏幕大小各种各样啊!!)。但是UED一般给我们的视觉稿都使用的px。。。。
首先计算手机的DPI,DPI=手机分辨率1200(×1920)/手机宽(长)分别对应的计算就行了,一般手机的长宽我们不知道,不过还好我们知道手机的尺寸比如 我们说的5寸屏 就是手机屏幕对角线的长度,一般可以百度出来手机的屏幕大小(单位是英寸,所以如果我们用尺子量的话应转为英寸)。那么通过高中学的勾股定理可以计算对角线的像素点的个数Sum=√(1200*1200+1920*1920),然后DPI = Sum/5;而densityDpi = DPI/160,除160是因为160是最初设计的标准,好像是HTC手机作为标准而定的。
然后px = density* DP,通过这个公式我们就可以计算出DP了,而density不同手机可能不同所以我们通常采用折中的方式 和视觉协商 ,按照720*1280来设计的,则手机的屏幕密度为2,这样我们只要拿到视觉稿的30px 然后直接30/2 就是我们想要的dp值了。
运行时,布局中的dp最终都会根据不同手机转化为px,然后根据density比例值计算,从而可以达到独立设备的效果。我们经常使用getPixelFromDip,看下源码:
public static int getPixelFromDip(DisplayMetrics dm, float dip) { return (int)(TypedValue.applyDimension(1, dip, dm) + 0.5F);}public static float applyDimension(int unit, float value, DisplayMetrics metrics) { switch (unit) { case COMPLEX_UNIT_PX: return value; case COMPLEX_UNIT_DIP: return value * metrics.density;//density就是我们计算的那个比例值 case COMPLEX_UNIT_SP: return value * metrics.scaledDensity;//scaledDensity和density一个意思 case COMPLEX_UNIT_PT: return value * metrics.xdpi * (1.0f/72); case COMPLEX_UNIT_IN: return value * metrics.xdpi; case COMPLEX_UNIT_MM: return value * metrics.xdpi * (1.0f/25.4f); } return 0; }
Android工程工程中Drawable、Drawable-hdpi以及drawable-xhdpi区别
我们在开发过程中经常会用到图片,并且有时候为了适配会做好几套图片,但是大的app都会有size要求,所以我们开发 难啊!!!那么为了适配并且减少size,我们首先了解一下,图片加载到内存到展示的情况。开发中不同drawableDpi比如
drawable对应的dpi=160;drawable-hdpi对应240 ;drawable-xhdpi对应320.以此类推
图片占用内存=加载到内存实际宽实际长(像素)每个像素的占用字节(ARGB_8888、ARGB_4444、ARGB_565等);
实际的长和宽=原始长宽*缩放比(手机dpiDensity/所在文件夹dpi),dpiDensity就是上面提到的DPI
决定 Bitmap 占用内存大小的因素,和图片文件在磁盘上占用的空间一点关系都没有,总结来说,有以下几点:
● 色彩格式:比如 ARGB_8888 、RGB_5555 这种,单位像素占的内存空间不同。
● 图片本身的像素尺寸。
● 图片文件存放的 Drawable 目录。xhdpi 和 xxhdpi 可是不一样的。
● 目标设备的 densityDpi 值。
参考文章:那些值得你去细细研究的Drawable适配
- Android中DP、DPI以及PX概念
- android 中 dp(dip),dpi,px,sp概念以及联系
- Android中px, ppi, dpi, dp, dip, sp概念解析
- Android 中dp,px,dpi以及sp的区别
- android开发中px,dip,dp,sp,dpi的区别,以及dp与px换算公式.
- Android中px,pt,dp,sp,dpi之间的区别以及联系
- android px、dp以及dpi关系的深入理解
- 学习android 笔记(4):如何获取屏幕的相关属性以及dp 、dip、dpi 、px的概念
- android之dp dpi px
- android之dp dpi px
- 关于DPI、DP、PX等概念
- Android中 dp,px,dpi三者之间的关系
- Android中 dp,px,dpi三者之间的关系
- Android中常用单位(dpi、px、dp、sp)
- Android中dpi,dp(dip),px关系,与计算公式
- Android中 dp,px,dpi三者之间的关系
- Android中常用单位(dpi、px、dp、sp)
- Android开发中dp、dpi、px的区别
- JAVA gc垃圾回收机制
- innodb的索引的概述
- MySQL中Cardinality介绍
- bitmap的mutable
- 基于对比度的金字塔融合
- Android中DP、DPI以及PX概念
- YunOS场景文字识别
- IDEA Tomcat 部署,找不到依赖包的问题,比如 ClassNotFound
- 大华摄像头操作
- Mysql事件
- 判断三个参数是否能构成一个三角形
- Python knn 对手写数字分类
- python使用百度语音识别API注意事项
- struts2传递参数的三种方式