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

本文转自:http://www.cnblogs.com/yaozhongxiao/archive/2014/07/14/3842908.html

一、基本概念

dip       : Density independent pixels ,设备无关像素。
dp        :就是dip
px        : 像素
dpi       :dots per inch , 直接来说就是一英寸多少个像素点。常见取值 120,160,240。我一般称作像素密度,简称密度
density : 直接翻译的话貌似叫 密度。常见取值 1.5 , 1.0 。和标准dpi的比例(160px/inc)
分辨率   : 横纵2个方向的像素点的数量,常见取值 480X800 ,320X480
屏幕尺寸: 屏幕对角线的长度。电脑电视同理。
屏幕比例的问题。因为只确定了对角线长,2边长度还不一定。所以有了4:3、16:9这种,这样就可以算出屏幕边长了。

二、应用

  在android里面,获取一个窗口的metrics,里面有这么几个值

    metrics.density;
    metrics.densityDpi;

  densityDpi : 就是我们常说的dpi。

  density : 其实是 DPI / (160像素/英寸) 后得到的值。是不是有点奇怪,因为我带了单位。。。这个涉及到后面一个比较重要的东西,后面再说。

  从上面就看得出了,DPI本身的单位也是 像素/英寸,所以density其实是没单位的,他就是一个比例值。

  而dpi的单位是 像素/英寸,比较符合物理上面的密度定义,密度不都是单位度量的值么,所以我更喜欢把dpi叫像素密度,简称密度,density还是就叫density。

三、各单位间转换
1. 计算dpi 

  比如一个机器,屏幕4寸,分辨率480X800,他的dpi能算么。
  因为不知道边长,肯定不能分开算,4是对角线长度,那直接用勾股定理算对角线像素,除以4,算出来大概是 dpi = 233 像素/英寸。
  那么density就是 (233 px/inch)/(160 px/inch)=1.46 左右

  顺带说下,android默认的只有3个dpi,low、medium和high,对应 120、160、240,如果没有特别设置,所有的dpi都会被算成这3个,具体可以参考下这个帖子
  http://android.tgbus.com/Android/tutorial/201103/347176.shtml
  其中的default就是160。
2. 计算 dp 与 px

  我们写布局的时候,肯定还是要知道1个dp到底有多少px的。

  换算公式如下: dp = (DPI/(160像素/英寸))px = density px

  注意,这里都是带单位的。px是单位,dp是单位,density没单位。

  为了方便,假设dpi是240 像素/英寸 , 那么density就是1.5

  那么就是 dp=1.5px ,注意这是带了单位的,也就是 设备无关像素 = density 像素

  那么转换为数值计算的话,应该是下面这个式子

  PX = density * DP

也就是
  像素值 = density * 设备无关像素值 ,请注意这里有个值字。
3. 为啥 标准dpi = 160

  (1)Android Design [1] 里把主流设备的 dpi 归成了四个档次,120 dpi、160 dpi、240 dpi、320 dpi

  实际开发当中,我们经常需要对这几个尺寸进行相互转换(比如先在某个分辨率下完成设计,然后缩放到其他尺寸微调后输出),一般按照 dpi 之间的比例即 2:1.5:1:0.75   来给界面中的元素来进行尺寸定义。

  也就是说如果以 160 dpi 作为基准的话,只要尺寸的 DP 是 4 的公倍数,XHDPI 下乘以 2,HDPI 下乘以 1.5,LDPI 下乘以 0.75 即可满足所有尺寸下都是整数 pixel 。

  但假设以 240 dpi 作为标准,那需要 DP 是 3 的公倍数,XHDPI 下乘以 1.333,MDPI 下乘以 0.666 ,LDPI 下除以 2

  而以 LDPI 和 XHDPI 为基准就更复杂了,所以选择 160 dpi

 (2)这个在Google的官方文档中有给出了解释,因为第一款Android设备(HTC的T-Mobile G1)是属于160dpi的。

四、 示例分析
1. 屏幕尺寸(screen size)

  就是我们平常讲的手机屏幕大小,是屏幕的对角线长度,一般讲的大小单位都是英寸。
  比如iPhone5S的屏幕尺寸是4英寸。Samsung Note3是5.7英寸。

  screen size
图1

2.像素(pixel)

  想像把屏幕放大再放大,对!看到的那一个个小点或者小方块就是像素了。
pixel
图 2
3.分辨率(Resolution)

  是指屏幕上垂直方向和水平方向上的像素个数。
  比如iPhone5S的分辨率是1136*640;Samsung Note3的分辨率是1920*1080;
resolution
图 3
4.dpi

  是dot per inch的缩写,就是每英寸的像素数,也叫做屏幕密度。这个值越大,屏幕就越清晰。
  iPhone5S的dpi是326; Samsung Note3 的dpi是386
dpi
图 4

5.dip

  是Density independent pixel的缩写,指的是抽象意义上的像素。跟设备的屏幕密度有关系。

  它是Android里的一个单位,dip和dp是一样的。

Google的官方说明是这样的:
  Density-independent pixel (dp)
  A virtual pixel unit that you should use when defining UI layout, to express layout dimensions or position in a density-independent way.
The density-independent pixel is equivalent to one physical pixel on a 160 dpi screen, which is the baseline density assumed by the system for a “medium” density screen. At runtime, the system transparently handles any scaling of the dp units, as necessary, based on the actual density of the screen in use. The conversion of dp units to screen pixels is simple: px = dp * (dpi / 160). For example, on a 240 dpi screen, 1 dp equals 1.5 physical pixels. You should always use dp units when defining your application’s UI, to ensure proper display of your UI on screens with different densities.

  就是说在160dpi的屏幕上,1dip=1px。
  它跟屏幕密度有关,如果屏幕密度大,1dip代表的px就多,比如在320dpi的屏幕上,1dip=2px。
为什么我们在布局的时候最好要用dip,不要用px?

  是因为这个世界上存在着很多不同屏幕密度的手机,屏幕密度是什么?就是dpi,就是单位长度里的像素数量。

  想象一下,如果这些手机的尺寸一样,屏幕密度相差很大,那么是不是说一个手机水平方向上像素很少,另一个手机水平方向上像素很多?那我们画同样pix数量的时候,它显

  示的长度不就会不一样了?

  比如下面图中的两个手机,同时设置2px长度的Button,在屏幕密度较高的手机里就会显示的比较小。

  而同时设置的2dip长度的Button,在两个手机上显示的大小是一样的。

这里写图片描述

图 5

  所以如果你在App布局中都用的px作为单位,那么你的App跑在各个设备上就会出现奇奇怪怪的现象了。

  来看一下emulator上的效果,我定义了两个Button,分别用px和dip做单位。

  布局文件里这样写
复制代码

<Button android:layout_width="100px"android:layout_height="100px"android:text="@string/str_button1"/><Button android:layout_width="100dip"android:layout_height="100dip" android:text="@string/str_button1"/>

显示的界面是这样的:

  
这里写图片描述
图 6

  getResources().getDisplayMetrics().densityDpi 就是屏幕密度。
  getResources().getDisplayMetrics().density 也可以理解为1dip相当于多少个px啦。
  上面的dpi是240,1dip=1.5px
  你看,100dip的Button是100pxButton的1.5倍长吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/274064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ninject使用demo

public class HomeController : Controller{public ActionResult Index(){ //核心对象IKernel ninjectKernel new StandardKernel();ninjectKernel.Bind<IValueCaculator>().To<LinqValueCalcalator>(); //方案1&#xff1a;获取接口实例IV…

Java 集合中关于Iterator 和ListIterator的详解

1.Iterator Iterator的定义如下&#xff1a;public interface Iterator<E> {}Iterator是一个接口&#xff0c;它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。Iterator提供的API接口如下&#xff1a;forEachRemaining(Consumer<? super E> action)&a…

使用xrandr和cvt命令添加自定义的分辨率模式

可以使用xrandr -q命令查看当前支持的分辨率模式: 如果过没有你想要的分辨率模式,则需要自己创建新的分辨率模式,例如,我想要创建800x750的分辨率模式,步骤如下: 1.使用cvt命令创建新的分辨率: 2.使用xrandr –newmode modeline信息(CVT命令产生的结果)创建新的mode: $xra…

Java List集合

我们先看一下jdk1.9对其的描述&#xff1a;什么是List&#xff0c;也就是一个有序集合(序列)。1.List接口 List集合代表一个有序集合&#xff0c;集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素&#xff0c;可以通过索引来访问指定位置的集合元素。 List接口继…

winform错误提示 :窗口类名无效(Window class name is not valid)

winfrom 程序在 xp 操作系统上报错提示 窗口类名无效(Window class name is not valid) 解决方法 注释 Program类 里 这句 Application.EnableVisualStyles(); 解决转载于:https://www.cnblogs.com/z_lb/p/3288850.html

如何在linux下通过ssh运行X图形软件

服务器端&#xff1a;编辑/etc/ssh/sshd_config中的以下内容 启用AllowTcpForwarding 启用X11Forwarding 将X11DisplayOffset设定为10. 启用X11UseLocalhost 客户机端&#xff1a;编辑/etc/ssh/ssh_config中的以下内容 启用X11Forwarding 连接时ssh -X或者ssh -Y就可以了…

Java Set集合

Set接口什么是Set&#xff0c;就是不包含重复元素的集合。Set是一种不包括重复元素的Collection。它维持它自己的内部排序&#xff0c;所以随机访问没有任何意义。与List一样&#xff0c;它同样允许null的存在但是仅有一个。由于Set接口的特殊性&#xff0c;所有传入Set集合中的…

linux下制作win7安装U盘

转自:http://blog.csdn.net/pipisorry/article/details/41369821 http://blog.csdn.net/pipisorry/article/details/41369821 已装Linux&#xff0c;再用U盘安装win7(网络安装应该也可以)&#xff0c; 先要在linux里面制作一个win7安装U盘&#xff08;windows下用ultraiso制…

Java Map集合

Map集合&#xff1a;Map接口Map与List、Set接口不同&#xff0c;它是由一系列键值对组成的集合&#xff0c;提供了key到Value的映射。同时它也没有继承Collection。在Map中它保证了key与value之间的一一对应关系。也就是说一个key对应一个value&#xff0c;所以它不能存在相同的…

gsettings命令使用简介

1.gsettings创建项 应用程序可以使用gsettings来保存配置信息&#xff0c;可以通过代码在程序中进行设置、修改gsettings的已有的项&#xff0c;但是不能通过程序代码创建新的gsettings项&#xff0c;gsettings的项的在一个叫做schema的规范文件中创建&#xff0c;schema文档其…

Collection 和 Collections区别

Collection 和 Collections区别&#xff08;1&#xff09;java.util.Collection 是一个集合接口&#xff08;集合类的一个顶级接口&#xff09;。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具…

Http状态码完整说明

在网站建设的实际应用中&#xff0c;容易出现很多小小的失误&#xff0c;就像mysql当初优化不到位&#xff0c;影响整体网站的浏览效果一样&#xff0c;其实&#xff0c;网站的常规http状态码的表现也是一样&#xff0c; 一些常见的状态码为&#xff1a; 200 - 服务器成功返回网…

运用xlib进行事件响应(X11 API)的小例子

转自&#xff1a;http://blog.csdn.net/linuxheik/article/details/7659090 File: x11_test.cxx #include <X11/Xlib.h> 每一个Xlib 程序都必须包含这个头文件 #include <stdio.h>1. int main(void) {2. Display *display XopenDisplay(NULL);首先打开与server …

Java 之HashSet、LinkedHashSet、TreeSet比较

4.HashSet、LinkedHashSet、TreeSet比较 Set接口Set不允许包含相同的元素&#xff0c;如果试图把两个相同元素加入同一个集合中&#xff0c;add方法返回false。Set判断两个对象相同不是使用运算符&#xff0c;而是根据equals方法。也就是说&#xff0c;只要两个对象用equals方法…

jquery1.9学习笔记 之选择器(基本元素四)

ID选择器("#id") 描述&#xff1a; 选择与给出ID属性匹配的单元标签。 对于ID选择器&#xff0c;jquery使用JS的函数document.getElementById()&#xff0c;当一个标签附加到ID选择器上时&#xff0c;也是非常有效的。如h2#pageTitle&#xff0c;jquery会在识别元素标…

Java(ArrayList和LinkedList)、(HashTable与HashMap)、(HashMap、Hashtable、LinkedHashMap和TreeMap比较)

1.ArrayList和LinkedList &#xff08;1&#xff09;ArrayList是实现了基于动态数组的数据结构&#xff0c;LinkedList基于链表的数据结构。 &#xff08;2&#xff09;对于随机访问get和set&#xff0c;ArrayList绝对优于LinkedList&#xff0c;因为LinkedList要移动指针。 &a…

oracle 事务测试

此文章是根据官方改变 模拟帐户转账流程1.JOHN帐户扣除-DAVID帐户增加-记录日志&#xff0d;事务提交三个操作必须全部完成此事务才完成&#xff0c;否则失败创建帐户余额表自增字段自增序列&#xff1b;createsequencesaving_seqincrementby1startwith1maxvalue99999999999999…

apt-get 获取源码的方法

apt-get source gconf-editor –allow-unauthenticated 注&#xff1a;gconf-editor是一个包名&#xff0c;根据自己的需求相应更改即可

Java 集合之自动打包和解包以及泛型

自动打包与解包&#xff1a;泛型&#xff1a;上栗子&#xff1a; TestMap1.java: package com.zhj.www; import java.util.*;public class TestMap {public static void main(String[] args) {Map m1 new HashMap();Map m2 new TreeMap();//m1.put("one", new Inte…

select * from dim.dim_area_no@to_dw

应该是建的有database linksdim是用户名&#xff0c;dim_area_no是表名&#xff0c;to_dw 是建的database links的名&#xff0c;dim_area_no表属于dim用户创建database links的作用是连接其他数据库的表select * from dim.dim_area_noto_dw 这个语句的作用是查询属于dim用户的…