Android中sp和px之间关系探究
记得当时在刚接触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之间关系探究的更多相关文章
- Android中dp和px之间进行转换
在xml布局文件中,我们既可以设置px,也可以设置dp(或者dip).一般情况下,我们都会选择使用dp,这样可以保证不同屏幕分辨率的机器上布局一致.但是在代码中,如何处理呢?很多控件的方法中都只提供了 ...
- Android中dip, dp, px,pt, sp之间的区别:
Android中dip.dp.sp.pt和px的区别 1.概述 过去,程序员通常以像素为单位设计计算机用户界面.例如:图片大小为80×32像素.这样处理的问题在于,如果在一个每英寸点数(dpi)更 ...
- Android中Fragment与Activity之间的交互(两种实现方式)
(未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...
- Android中两个Activity之间简单通信
在Android中,一个界面被称为一个activity,在两个界面之间通信,采用的是使用一个中间传话者(即Intent类)的模式,而不是直接通信. 下面演示如何实现两个activity之间的通信. 信 ...
- Android中Service和Activity之间的通信
启动Service并传递数据进去: Android中通过Intent来启动服务会传递一个Intent过去. 可以在Intent中通过putExtra()携带数据 Intent startIntent ...
- Android中webview和js之间的交互(转)
http://www.cnblogs.com/leizhenzi/archive/2011/06/29/2093636.html 1.android中利用webview调用网页上的js代码. Andr ...
- android中ADT和SDK的关系
ADT(Android Development Tools): 目前Android开发所用的开发工具是Eclipse,在Eclipse编译IDE环境中,安装ADT,为Android开发提供开发工具的升 ...
- android中ADT和SDK的关系(转)
ADT(Android Development Tools): 目前Android开发所用的开发工具是Eclipse,在Eclipse编译IDE环境中,安装ADT,为Android开发提供开发工具的升 ...
- C/C++中数组与指针的关系探究
数组与指针 长期以来,在C/C++中,数组名和指向数组首元素的指针常量到底是以一种什么关系,一直困扰着很多人.很多地方,甚至是一些教科书中都在说,"数组名就是一个指向数组首元素的指针常量&q ...
随机推荐
- jenkins集成robot用例并发送自定义报告
slave
- consui(二)集群配置
consul集群搭建:一.软件安装Linux 环境下载zip包然后直接解压,然后把解压的文mv consul /bin检验安装是否成功,查看版本[root@node1 ~]consul -vConsu ...
- 开发环境下的 Kubernetes 容器网络演进之路
马蜂窝技术原创文章,更多干货请搜索公众号:mfwtech 使用 Docker+Kubernetes 来简化开发人员的工作流,使应用更加快速地迭代,缩短发布周期,在很多研发团队中已经是常见的做法. 如果 ...
- mysql 库、表、数据的增删改
数据库定义 语法形式 (1)创建数据库 create database [if not exists ] 数据库名 [charset 字符集] [collate 字符排序规则]; if not exi ...
- mac upgrade node and npm
一直以来, 我们都可以很轻松的更新npm: npm install npm -g 而Node我却是很久没有更新了, 记得当时好像是使用安装包安装的, 实际上有更加简单的安装方法. 实际上Mac上有一个 ...
- QT中PRO文件解析(转)
From csdn blog: QT中PRO文件写法的详细介绍,很有用,很重要! 在QT中,有一个工具qmake可以生成一个makefile文件,它是由.pro文件生成而来的,.pro文件的写法如下: ...
- 021 Android 查询已经导入到工程中的数据库+抖动效果
1.将数据库(.db)文件放入工程中 在project状态下,新建assets文件夹,并将数据库文件放入assets目录下. 注意:assets目录.java目录.res目录是同级的 new---&g ...
- 【转帖】如果进入CPU的世界,时间会是怎样的?
如果进入CPU的世界,时间会是怎样的? 2018-02-26 20:52:46 world6 阅读数 1295更多 分类专栏: 网络 缓存服务 架构 版权声明:本文为博主原创文章,遵循CC 4.0 ...
- 剑指offer11:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。(进制转换,补码反码)
1. 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 2. 思路和方法 使用移位(<<)和 “| & !”操作来实现.1的二进制是:前面都是0,最后一位 ...
- PAT(B) 1042 字符统计(Java)字符串 正则表达式 统计
题目链接:1042 字符统计 (20 point(s)) 题目描述 请编写程序,找出一段给定文字中出现最频繁的那个英文字母. 输入格式 输入在一行中给出一个长度不超过 1000 的字符串.字符串由 A ...