Android - 开发页面需了解的dip,sp,px知识,以及它们的转换
工作中,时常会有任务要求开发新页面,这时一般的流程是产品经理确定要开发的页面和功能,然后设计师提供设计稿,之后由我们开发人员完成开发工作。
通常,设计师提供的设计稿尺寸标注会很详细,例如涉及到字时,字的大小,位置,颜色,字体等,都会一一标注。这时注意的是,设计师提供的尺寸标注全部是px(像素)为单位。
但我们在开发时不能直接使用px,按照Android规范,间距需使用dip(dp),字体大小需使用sp.
这时就需要我们做出px与dip(dp),sp的转换。
一. 了解dip(dp),sp,px
首先来了解一下。
dip:device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
dp:通常认为dp = dip,一般我们使用dip。
sp:scaled pixels(放大像素). 主要用于字体显示。问个问题,为什么我们不用dip来控制字体大小?而是使用sp。下面会介绍。
px:像素,是一个绝对值,不同设备显示效果相同,是多少就是多少,不会改变。
所以由此可见,我们为了支持不同分辨率,制作页面时的间距应使用dip,而不是px。但也有特殊的例外情况,例如我们经常会需要在页面中画一条直线,做为分割线,那么线的高度直接用1px即可,这里要用px。
二. dip(dp),sp与px的转换
转换时,涉及到的新概念是分辨率与密度值,如下图

转换公式:dip = px/mdpi基准比例,sp = px/mdpi基准比例,注意不同分辨率的基准比例不同。
例如在1080的分辨率下,比例值是3,设计稿上的间距如果是40px,那么对应的dip就是13.3333dip(尽量使用小数点,更精确)。这样的显示效果会与设计稿一致。
但是,我在上网查阅资料时,发现sp的计算公式略有不同,有一个公式,sp = (int)(px/mdpi + 0.5f),这样最后得到一个整数,难道是字体大小一般要用整数?经过实践发现,还是直接sp=px/mdpi靠谱,例如字体大小是40px,那么13.3333sp才是最准确的答案。
三. 开发时,如果确保计算后的间距于设计稿一致?
这时推荐大家使用的工具是Hierarchyviewer,通过它,可以一目了然的看到真实的px大小,保证开发时的正确。例如下图,

四. 一个小问题,为何字体大小推荐使用sp,而不是dip?
这是因为我们在手机设置里通常有字号大小的调整,当用户调整字号大小时,如从标准调整为超大号,如果你的字体使用sp,就是相应的根据换算调整,如果是dip,则会保持不变,那这样的效果不是我们想要的。
— Kevin Song
2016.5.29
Android - 开发页面需了解的dip,sp,px知识,以及它们的转换的更多相关文章
- 收集整理Android开发所需的Android SDK、开发中用到的工具、Android开发教程、Android设计规范,免费的设计素材等。
AndroidDevTools Android Dev Tools官网地址:www.androiddevtools.cn 收集整理Android开发所需的Android SDK.开发中用到的工具.An ...
- Python 制作Android开发 所需的适配不同分辨率的套图
使用Python做起工具来还真是爽,简单,方便,快捷.今天忙活了一下,制作出一个比较实用的小工具. 自动化套图制作,适配不同屏幕 尤其是对于android开发来说,要适配不同屏幕就需要多套切图,那么. ...
- Android开发--页面切换
1.创建android项目.项目文档如下 2.activity_main布局,Androidv4包里自带的,既然是自带的那么直接拿来用就可以了,当然前提是你得工程里有v4包 <LinearLay ...
- Android开发 所需组件配置
1 Unity中的Android Build Support下载 在Unity中的File>Building Settings>Android>Open Download Page, ...
- Android开发-页面布局
首页布局 首页是ListView的布局 这个还需要制作ListView组件和适配器来显示数据. 关于页面 关于页面显示的是软件的基本信息和软件制作者的信息 这个就是采用基本的页面布局就行.
- Android开发-页面绘制
今天主要绘制了记账页面 记账页面用到的布局是TableLayout加Viewpager联动的方式,通过设置一个标题头可以实现页面的左右滑动,viewpager中添加两个fragment. 需要制作两个 ...
- android开发------编写用户界面之线性布局(补充知识)
在前面的文章中 http://www.cnblogs.com/ai-developers/p/android_linearlayout.html 我们看到了布局中有这样一个属性: layout_wei ...
- Android开发点点滴滴——一些基础的但实用的知识(2)
1.onItemLongClick和onItemClick事件截取 当须要同一时候获得一个listview的条目长按事件(onItemLongClick)和点击事件(onItemClick)时,仅仅须 ...
- 轻松搭建Unity3D 安卓Android开发环境
1,下载安装Java的JDK: http://www.oracle.com/technetwork/java/javase/downloads/index.html (JDK中,包含JRE) 如果是6 ...
随机推荐
- kuangbin专题十六 KMP&&扩展KMP HDU3336 Count the string
It is well known that AekdyCoin is good at string problems as well as number theory problems. When g ...
- 复习一知识点:回调函数callback
比如我们常用的异步请求: $.ajax({ url:"test.json", type: "GET", data: {username:$("#use ...
- [JavaScript]如何实现一个JS脚本能在browser和NodeJs里都是用
下面是一个Common的Solution 'use strict'; // Universal Module Definition (UMD) to support AMD, CommonJS/Nod ...
- Hibernate常见报错
1.A different object with the same identifier value was already associated with the session(使用Hibern ...
- hdu Minimum Inversion Number(逆序数的小知识与线段树)
飞! 题解 首先,求逆序数对的思路: 1.得到整个数列后,从前往后扫,统计比a[i]小的,在a[i]后面的有多少个 这样做的话,应该是只有n2的暴力作法,没想到更好的方法 2.统计a[i]前面的,且比 ...
- Android viewpager + fragment取消预加载
1,在fragment中重写setUserVisibleHint方法private boolean isVisibleToUser;@Overridepublic void setUserVisibl ...
- linux 下结合find 和 rm 删除大量文件
echo "remove only files, the logs folder and it contents will not be removed"find /opt/tra ...
- http协议&接口规范&接口测试入门
http协议 请求: 请求行:请求方法.url(协议名://ip;端口/工程名/资源路径).协议版本 请求头 :键值对 请求正文 响应: 响应行:协议版本.响应状态码.响应状态码描述 响应头 :键值对 ...
- Asp.net获取系统信息
[DllImport("kernel32")] public static extern void GlobalMemoryStatus(ref MEMORY_INF ...
- OpenCV教程(转自:浅墨_毛星云博客)
2.图像的载入,显示和输出 一站式完全解析 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/detail ...