关于dip、dpi和分辨率的一些事

分辨率,这个在android平台上异常麻烦的问题,让很多新手要崩溃了。今天,我想和分辨率这个家伙谈谈。

首先,什么是分辨率呢?我们通常说的480*800、1280*720等等,就是所谓的手机屏幕的分辨率。分辨率代表的是整个屏幕上,一共有多少个像素点,也就是在ps或者是其他的图像编辑软件中的px的概念。美工在帮我们做高清原型图的时候,一般会按照多少分辨率来做。这里提醒一下刚入职的新手,android版本的高清原型图最好选择1280*720像素,这样美工在后期的切图的时候会比较容易。目前的项目因为分辨率选择的是480*800,所以在后期做高分辨率适配的时候,有很多的小图标需要重做,否则显示效果很模糊,这无形之中加大了UI设计师的工作量,算是一个教训吧!

但是呢,我们开发者在用xml写界面的时候,可不会直接用px做为单位,这是因为在不同的分辨率下面,相同显示效果的界面上,控件的实际像素并不是一样的,因此,我们在设置控件大小的时候,一般用的是dip(dp)作为长度单位,那么,dip到底是一种什么单位呢?

dip是Density independent pixel的缩写,也就是独立的像素密度的意思,dip是基于屏幕密度的抽象单位,与设备无关,用于说明与密度无关的尺寸和位置。它是相对于一个160dpi的屏幕来说的,因此1dip对应160dpi屏幕上的1px。

这里一定要注意,dip和dpi是截然不同的两个概念,不要弄混。

dip指的是一种独立像素的表示方式,它的计算是在dpi的基础之上的,也就是说,我们只有在知道dpi是多少之后,才能够根据不同的dpi,来精确计算我们需要的dip。

dpi是一种密度单位,是dot
per inch的缩写,也就是每英寸多少个像素点的意思。比如说,我们有一个480*800分辨率的手机,屏幕的物理尺寸是3英寸*5英寸,那么我们就可以计算出这个手机的是480/3=160dpi,是属于低分辨率的,那么在这种分辨率下面,一个dip就相当于1个px,怎么计算呢?当然就是1dip*(160/160)=1px。也就是说,当我们在这种分辨率的手机下,控件的宽度和长度就和设计图一样大小就可以,一个dip对应一个px。但是,如果还是相同的分辨率,换成了2英寸*3.3英寸呢?那么我们就可以先算出手机的密度是480/2=240dpi,是属于高分辨率的,那么在这种分辨率下面,一个dip就相当于1.5像素,怎么计算呢?当然还是1dip*(240/160)=1.5px。

因此,明白了dip和dpi的关系,我们就可以精确的设定控件的大小。

具体而言,当屏幕的的分辨率为320x480时,无论实际的物理尺寸大小,密度都会被设置为160dpi,也就意味着这个设备上,一行最多可以放置320dp,而对于480x800的设备,只需屏幕尺寸在3寸到4.3寸之间,密度都会被设置为240dpi,一行同样可以放置320dp。因此在开发中,用dp作为单位,只需要设置一次,就可以适配到多个屏幕上。

现在我们清楚了这两个名词之间的关系,那么,我们在程序中,如何对两者进行转换呢?

下面的代码,可以帮助我们实现dp到px的转换

<span style="font-size:18px;">/**
	 * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
	 */
	public static int dip2px(Context context, float dpValue) {
		//获取当前屏幕密度dpi与基础密度160dpi的倍数关系,+0.5f是为了保证转化成int类型时的数据正确
		float scale = context.getResources().getDisplayMetrics().density;
		return (int) (dpValue * scale + 0.5f);
	}</span>

我们也可以实现px到dp的转换

<span style="font-size:18px;">/**
	 * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
	 */
	public static int px2dip(Context context, float pxValue) {
		//获取当前屏幕密度dpi与基础密度160dpi的倍数关系,+0.5f是为了保证转化成int类型时的数据正确
		float scale = context.getResources().getDisplayMetrics().density;
		return (int) (pxValue / scale + 0.5f);
	}</span>
时间: 2024-10-17 16:32:56

关于dip、dpi和分辨率的一些事的相关文章

理解Android中dpi和分辨率的关系,谈谈Android做成适应全部手机的UI方式

http://blog.csdn.net/ueryueryuery/article/details/20048401 最近我在做一个界面,UI给的切图是1280x720这个分辨率的,给的标注单位是px(像素). 我把原图自然而然地放在drawable-xhdpi中,然后开始调整布局(当时我默认1dp=2px).把这个布局放到一个720P的电视上,发现完全变形了,奇囧无比之际,看了下电视的density,发现这货是1,这是一个mdpi的设备!!! 然后我就开始想了,720P的切图,要放在xhdpi

关于dp dip dpi px

在Android开发中,屏幕适配是一件非常让人头疼的事情.有时候在这个机型上调试的漂漂亮亮的UI界面,换一部手机就丑的不忍直视.但为了我们软件更好的用户体验,我们必须适应Android市场上形形色色的手机. 你像做前端的人,为了给用户最优质的体验,他们也需要适配各种不同分辨率的屏幕啊,但是他们为什么不需要为这个问题发愁呢?恩,这要是因为这个东西-----百分比.他们可以听过设置百分比而不强制设定宽高的形式来适配,这样根据机型不同,他们的显示效果并不会有太大差异.然而,可惜的是,Android中并

Android dpi、dip、px、分辨率、屏幕尺寸、density 关系以及换算

一.介绍 dip:设备独立像素(Device independent pixel),一个基于density的抽象单位: dp:在早期的Android版本里多使用dip,后来为了与sp统一就建议使用dp这个名字: px:像素(Pixel),1px代表屏幕上一个物理的像素点,px单位不被建议使用,因为同样1px,在不同手机上显示的实际大小可能不同,偶尔用到px的情况是需要画1像素表格线或画一条细的分隔线的时候,用其他单位如dp会显得模糊: sp:与缩放无关的抽象像素(Scale-independen

Android 使用正则表达式来快速生成多套dpi及分分辨率适配的UI

在Android开发中,往往为了适配dpi和分辨率,要写多套layout或者values,而鉴于dpi和分辨率的计算方式,很多时候适配的大部分工作都是简单的计算方面.譬如DPI从1.5到2.0,就是将所有dip.sp为单位的数值都乘以0.75(也就是1.5/2).所以我们完成可以自己写一个小工具来批量读取layout或者values文件,然后进行批量操作并保存. 对文件的批量打开读取操作我这里就不浪费周章了,大家可以自行查阅资料,这里主要贴出核心代码. FileInputStream input

62.Android之各分辨率定义的图片规格

转载:http://www.nljb.net/default/Android%E4%B9%8B%E5%90%84%E5%88%86%E8%BE%A8%E7%8E%87%E5%AE%9A%E4%B9%89%E7%9A%84%E5%9B%BE%E7%89%87%E8%A7%84%E6%A0%BC/ 各种规格总结 // 首先阐释一些术语和概念 屏幕尺寸(screen size): 屏幕的对角线测量. 为了方便,Android把所有的屏幕尺寸分为了4个广义的大小:小.正常.大.更大 屏幕密度(scree

解决winform应用程序在不同分辨率系统下界面错乱的问题

首先,遇到的问题是这样的,当已经ok的程序在我电脑上运行时出现了界面很小,而且错乱无章的情况,如下图: 记得上一次我的解决办法是每个控件每个控件拖动修改,到最后perfect!可是??修改之后呢?半天时间没有了,要做的事没有挪动一步..... 后来在网上查了查这是什么原因: 问题分析: 产生界面混乱的主要原因是,winform程序的坐标是基于点(point)的,而point与DPI(分辨率,每英寸所打印点数)相关,一英寸等于72 Point,当DPI发生变化时,显示在界面上的尺寸根据DPI自动变

DPI , dot per inch

DPI , dot per inch ,即每英寸包含的点数.还有一个概念是 PPI ,即每英寸包含的像素数.一般我们用 DPI 就够了,对于专业人士处理超高 DPI 的场景,使用 PPI 可能更精确一些.在 Qt 中,只有 DPI ,所以我们单说它吧. 这个值越大,像素密度越大,小尺寸的屏幕就可以有大分辨率.比如有的 Android 手机, 3.7 吋屏幕就能提供 960x540 的分辨率,而有的手机, 5 吋屏幕却提供 800x480 的分辨率.这两种不同屏幕的尺寸和分辨率的手机,5 吋屏看起

matplotlib:plt.rcParams设置画图的分辨率,大小等信息

主要作用是设置画的图的分辨率,大小等信息 1 plt.rcParams['figure.figsize'] = (8.0, 4.0) # 设置figure_size尺寸 2 plt.rcParams['image.interpolation'] = 'nearest' # 设置 interpolation style 3 plt.rcParams['image.cmap'] = 'gray' # 设置 颜色 style 还有: 1 #figsize(12.5, 4) # 设置 figsize 2

DPI的理解

DPI(Dots Per Inch,每英寸点数)是一个量度单位,用于点阵数码影像,指每一英寸长度中,取样.可显示或输出点的数目. DPI是打印机.鼠标等设备分辨率的度量单位.是衡量打印机打印精度的主要参数之一,一般来说,DPI值越高,表明打印机的打印精度越高. DPI是指每英寸的像素,也就是扫描精度.DPI越低,扫描的清晰度越低,由于受网络传输速度的影响,web上使用的图片都是72dpi,但是冲洗照片不能使用这个参数,必须是300dpi或者更高350dpi.例如要冲洗4*6英寸的照片,扫描精度必