记得当时在刚接触Android时都在说不要用px,要用sp,所以在实际工作当中当然就按照这个规则,所以都要将px换算成sp,而我在实际工作中的换算规则是dp=px * 1.5,而且用这种规则到现在基本上都没什么问题,但是它们之间为啥要这样换算一直也没去研究,直到去年底的一次面试受打击让我觉得一定要研究清楚这里面的是是非非,当时面试官问我它们之间的换算规则是怎么样的,我记得是这样回答的:“这是一个标准公式,实际用过界面也没出过问题,而且也没必要深究”,哈哈,感觉当时这理由确实有点牵强,不过幸运的是还是被录用了,做为一名有责任的开发人员,就要有一种打破砂锅问到底的精神,所以这次来对其进行研究一下。

对于这些知识实际上网上已经有好多牛人给出了说明,我还是基于网上的来进行理解,还是那句话:“拿来不可耻,可耻的是不把知识给研究清楚”,在正式阐述其关系之前,先用一个实验来直观感受一下px,sp的不同:

先准备一个布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="60dip"
android:text="hello" /> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="60px"
android:text="hello" /> </LinearLayout>

这时新建两个模拟器,分别来看下效果:

模拟器一:

模拟器二:

下面将程序布局到两个模拟器上进行查看:

模拟器一:

模拟器二:

从结果来看,要想在不同分辨率能呈现正常的布局,就只能用dip了,下面来研究下这两者之间的关系:

博文:http://m.blog.csdn.net/blog/zkw12358/21889159,其实对其剖析得很清楚了,所以说我只是拿来理解一下:

物理单位和虚拟单位:

正如博主所说的,px是一个物理单位,是固定的值,所以不管是什么屏幕的手机都是这么长,在上面实验中已经证明了,而dp则是一个虚拟单位,是相对于px而言的。

android的单位划分:

px:即我们通常所说的像素,他是一个基本的物理单位。我们通常所说的屏幕分辨率,如:320、480,是指屏幕宽有320个像素点,高有480个像素点,屏幕总共有320*480,即153600个像素点。

dpi:记住不是dip,他们之间是有区别的。dpi 是一个推算单位,他的单位为px/inch,即像素/英寸,通常我们称作为像素密度。常见取值 120,160,240。

dip:即我们上面简称的dp,他是一个虚拟单位,专业术语即我们常说的:与设备无关的像素值,通俗来讲就像我们上面所定义的单位Y,他是基于基本物理单位的,也就是他相对于物理单位来说的话,就是多少个px,不同设备这个多少就可能不一样,为什么不一样,android中是这样规定的:dp=dpi/(160px/inch)px【很重要的公式】,就像我们上面定义Y的值一样,这个是人为规定的,虽然也可以另外一种定义法,但是这样定了就定了。因为他是基于dpi的值来的,而不同设备的dpi值是不一样的,所以不同设备的dp值是不一样的。

inch:即英寸,他是基本的物理单位。我们通常所说的手机屏幕多少英寸是指这个屏幕的对角线长度。如:5英寸屏幕,那么这个屏幕的对角线就是5英寸长。

density:这是一个比例值,他不依赖于基本单位,如:1m=100cm,这个100就是一个比例值,density就相当于这个100。他的比例值换算方式为:dpi/(160px/inch),由这个换算方式,由于我们知道dpi的物理单位,最后所有的单位都会相互抵消,于是就只剩下一个比例值了。常见取值 1.5 , 1.0

各个单位之间的换算:

dpi:dots per inch,像素密度。dpi和density都可以通过android的API进行获取:

下面来推导出换算公式:

【注意】:上图中箭头右侧上的dip应该是dpi,画错了~

所以假设一个手机的像素密度(dpi)为400,那么可以就算出density=400/160=2.5,所以在这个手机上1dp=2.5px,即2.5个像素。

那么1dp怎么换算成基本的物理单位呢?

那回到我平常工作中用到的px换算成dp的公式上来,dp=px/1.5,那这个公式是如何推导过来的呢?

其中另一篇博文:http://blog.csdn.net/dinko321/article/details/7992776,对其进行了阐述,下面也来进行理解一下:

先贴出原作者的原话:

下面来理解一下:

Android中sp和px之间关系探究的更多相关文章

  1. Android中dp和px之间进行转换

    在xml布局文件中,我们既可以设置px,也可以设置dp(或者dip).一般情况下,我们都会选择使用dp,这样可以保证不同屏幕分辨率的机器上布局一致.但是在代码中,如何处理呢?很多控件的方法中都只提供了 ...

  2. Android中dip, dp, px,pt, sp之间的区别:

    Android中dip.dp.sp.pt和px的区别   1.概述 过去,程序员通常以像素为单位设计计算机用户界面.例如:图片大小为80×32像素.这样处理的问题在于,如果在一个每英寸点数(dpi)更 ...

  3. Android中Fragment与Activity之间的交互(两种实现方式)

    (未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...

  4. Android中两个Activity之间简单通信

    在Android中,一个界面被称为一个activity,在两个界面之间通信,采用的是使用一个中间传话者(即Intent类)的模式,而不是直接通信. 下面演示如何实现两个activity之间的通信. 信 ...

  5. Android中Service和Activity之间的通信

    启动Service并传递数据进去: Android中通过Intent来启动服务会传递一个Intent过去. 可以在Intent中通过putExtra()携带数据 Intent startIntent ...

  6. Android中webview和js之间的交互(转)

    http://www.cnblogs.com/leizhenzi/archive/2011/06/29/2093636.html 1.android中利用webview调用网页上的js代码. Andr ...

  7. android中ADT和SDK的关系

    ADT(Android Development Tools): 目前Android开发所用的开发工具是Eclipse,在Eclipse编译IDE环境中,安装ADT,为Android开发提供开发工具的升 ...

  8. android中ADT和SDK的关系(转)

    ADT(Android Development Tools): 目前Android开发所用的开发工具是Eclipse,在Eclipse编译IDE环境中,安装ADT,为Android开发提供开发工具的升 ...

  9. C/C++中数组与指针的关系探究

    数组与指针 长期以来,在C/C++中,数组名和指向数组首元素的指针常量到底是以一种什么关系,一直困扰着很多人.很多地方,甚至是一些教科书中都在说,"数组名就是一个指向数组首元素的指针常量&q ...

随机推荐

  1. Deepin Linux下为Wine创建文件关联

    在Deepin Linux下,默认地,使用apt安装的Wine并没有创建文件关联,这使得在文件管理器中双击exe等Windows可执行文件时,不能直接运行.为此,必须手动在桌面环境中创建文件关联. 文 ...

  2. LeetCode 674. 最长连续递增序列(Longest Continuous Increasing Subsequence) 18

    674. 最长连续递增序列 674. Longest Continuous Increasing Subsequence 题目描述 给定一个未经排序的整型数组,找到最长且连续的递增序列. Given ...

  3. Mybatis笔记4

    mybatis中多对多的步骤 示例:用户和角色,一个用户可以有多个角色,一个角色可以赋予多个用户 步骤: 建立两张表:用户表,角色表,让用户表和角色表具有多对多的关系,需要使用中间表,中间表中包含两张 ...

  4. MySQL索引工作原理

    为什么需要索引(Why is it needed)?当数据保存在磁盘类存储介质上时,它是作为数据块存放.这些数据块是被当作一个整体来访问的,这样可以保证操作的原子性.硬盘数据块存储结构类似于链表,都包 ...

  5. Python中nonlocal的用法

    class Text: def __init__(self): pass def big(self): n, m = 0, 0 def a(): nonlocal n n += 1 print(n) ...

  6. ansible使用普通用户免密登陆+sudo提权

    前提:从ansible控制端使用test用户可以免密登陆所有被控制端,并且被控端test用户支持sudo提权 # ansible主机清单 cat /etc/ansible/hosts [online- ...

  7. MySQL监控&性能瓶颈排查

    监控的意义&目的 业务/数据库服务是否可用 通过事务实时性能数据变化感知业务的变化 数据库性能变化趋势判断服务器资源是否足够 数据可靠性 业务数据是否可靠 服务可用,不代表数据就是正确的 有可 ...

  8. Mongodb命令行导入导出数据

    第一步,找到mongodb安装目录第二步,从命令行进入mongodb安装目录下的bin目录第三步(1),导出数据命令(导出的文件有两种格式:json/csv,此处导出的是json文件,对于导出CSV文 ...

  9. Spring Cloud Alibaba学习笔记(1) - 整合Spring Cloud Alibaba

    Spring Cloud Alibaba从孵化器版本毕业:https://github.com/alibaba/spring-cloud-alibaba,记录一下自己学习Spring Cloud Al ...

  10. Java定时任务工具详解之Timer篇

    Java定时任务调度工具详解 什么是定时任务调度? ◆ 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务. 在Java中的定时调度工具? ◆ Timer       ◆Quartz T ...