Android屏幕适配全攻略1-从dp、sp、px说起

[TOC]

初衷

现在写App有些麻木的感觉,每天上班感觉提不起精神,项目和市场上同类产品竞比还有很多做得不好的地方,但是就算知道了也没什么激情去改正。技术细节感觉很凌乱,不成体系,这让我非常烦恼。所以希望通过写Blog去实现:

  • 督促自己。把技术和代码放在台面上,自己写的东西有可能会被别人看到,有些东西可以做好的就不会得过且过。
  • 技术积淀,知识梳理。做得好的经验,做得不好的教训,可以总结下来,整理出知识的体系。
  • 社交。希望和人做技术层面的交流,获得认同感、存在感。
  • 最后锻炼自己的语言组织和表达能力

屏幕适配-老生常谈的话题

屏幕适配是Android开发永远逃脱不开的话题,这方面资料很多,以前学习的时候,看完过后感觉是懂了,但是实际项目中又用不上去,缺乏易用性,长期以往学习的激情自然就淡了,最后还是要自己去想办法完成一系列的适配工作。所以我认为在学习之初,尽量看一些和当前项目相关的,能比较快的产生收益的东西,学以致用从而形成一个良性的学习循环。

App UI界面的基本单位 dp sp px

先说结论

  • dp(dip)作为表示界面尺寸的最常用单位
  • sp作为表示字体大小的最常用单位
  • px表示屏幕绘制的真实单位,是必须要掌握的概念

含义

px
即像素,1px代表屏幕上一个物理的像素点。iOS开发中UI的基本单位,因为不管使使用任何布局,任何单位最终物理层次UI绘制都会转换成px来绘制,所以px是最直接,最准确的表示方式。最关键的是,这是美工和产品最熟悉的单位。

ppi,

Pixels Per Inch也叫像素密度,所表示的是每英寸所拥有的像素数量。因此PPI数值越高,即代表显示屏能够以越高的密度显示图像。

一般我们形容手机几英寸大小(如米3 4.7英寸、Nexus5 5英寸)就是指手机对角线的长度。屏幕大小就是指整块屏幕对角线的长度。使用屏幕分辨率除以屏幕大小得到的就是手机的dpi(每英寸上的像素值)。

ppi = √(长度像素数² + 宽度像素数²) / 屏幕对角线英寸数

以1920*1080分辨率 5.2英寸的 Nexus5X手机为例,计算方法如下图
Android屏幕适配全攻略1-从dp、sp、px说起_第1张图片

dp
它与“像素密度”密切相关,也叫dip(老版本这样命名,现在已经改为dp),是通过px和屏幕尺寸算出来的数值,可以满足绝大部分情况的屏幕适配,同一套代码在不同的设备上面dp基本可以满足需求,但是px就会出现或大或小的情况。
当然也有dp满足不了的情况,比如有些设备屏幕宽高比不会按照3:2比例设置

sp
即与缩放无关的抽象像素(Scale-independent Pixel),其实就是跟dp一样的单位。不同之处在于sp可以跟随系统字体变化,一般情况下1sp=1dp,但是如果我们修改系统设置把系统字体改为大、超大,1sp>1dp,这种修改不仅仅是针对我们app,整个系统字体都会变大。

Android屏幕适配全攻略1-从dp、sp、px说起_第2张图片

上图是我最近做的一个项目,通过修改系统字体大小,我们发现App内字体也跟随着放大了对应比例,这就是sp和dp的区别。

曾经做一个金融类App,所有的金额大小都是精确到小数点后两位。有一次一个客户找到我,问我为什么他的App里面账户余额,日流水很多地方显示余额都是…这样的省略号,当时没太明白,仔细看了几遍代码,测试了几个手机都没这个问题,最后找了个和他一模一样的手机安装上任然显示OK。那时候项目组里面的人都不明白,找了差不多半个月原因,最后无意间看到客户手机里面所有App字体都比较大,才搞明白怎么回事

ppi sp dp转换

dp-px-ppi的转换公式:

dp*ppi/160 = px

我大概写过了5,6个App,和美工打交道算是有一点经验吧。几乎所有美工给Android的图都是直接拷贝的iOS切图,用的px为单位来表示,一套2倍图一套3倍图。坑爹的是,产品给的原型图也是iOS直接拷贝的,页面跳转方式、弹窗、提示信息、顶部ActionBar都是以iOS系统控件为标准,作为一个Android开发有时候觉得挺无奈的,不过这是后话,该干的活儿还是要干的。

明白这些单位的换算关系非常重要。平常开发中美工给你一套这样的图,这些单位是没法直接使用,放一张最近美工给我的切图

Android屏幕适配全攻略1-从dp、sp、px说起_第3张图片

我第一次写App的时候,公司就我一个Android,看到这个图的时候,整个人就蒙圈了。其实就是数据需要你自己计算一下。
当然这其中牵涉到的问题远不止这一点,如果你想了解更多,可以看看我的第二篇blog-我想跟产品经理和美工谈谈需求。

你可能感兴趣的:(Android开发)