网站提交,福州自助建站网站,青岛企业网站开发,泰安网站建设案例Android的碎片化已经被喷了好多年#xff0c;随着国内手机厂商的崛起#xff0c;碎片化也越来越严重#xff0c;根据OpenSignal的最新调查#xff0c;2014年市面上有18796种不同的Android设备#xff0c;作为开发者#xff0c;一个无法回避的难题就是需要适配各种各样奇奇…Android的碎片化已经被喷了好多年随着国内手机厂商的崛起碎片化也越来越严重根据OpenSignal的最新调查2014年市面上有18796种不同的Android设备作为开发者一个无法回避的难题就是需要适配各种各样奇奇怪怪的机型。设备机型不同必然也会导致屏幕大小和分辨率(Resolution)的不同但是无论分辨率有多大屏幕有多大我们手指触控范围的大小不会发生变化所以最优的适配方式应该是指定大小的控件在所有的设备上的显示都一样。Android的官方文档对此也有明确的说明When adding support for multiple screens, applications do not work directly with resolution; applications should be concerned only with screen size and density, as specified by the generalized size and density groups.所以适配应该与分辨率无关只与屏幕大小和屏幕密度相关首先来看一下什么是屏幕密度 DPI。DPIDPI的全称是 Dots Per InchInch是一个物理单位(无论在任何设备上其大小都是固定的)所以DPI就指在一个Inch的物理长度内有多少个Dot160DPI的屏幕就表示一个Inch包含160个Dot320DPI的屏幕表示一个Inch有320个Dot所以说Dot的大小是不固定的。Android设备用DPI来表示屏幕密度(Density)屏幕密度大就表示一个Inch包含的Dot比较多。那PPI是什么呢我们会经常看到iPad、iPhone是用PPI来表示屏幕密度小米Pad也是用PPI来表示。其实对Android而言DPI等价于PPI(Pixels-Per-Inch)DPI最早是用于印刷行业跟PPI还是有本质不同的Android应该是误用了DPI这个概念。具体可以参考PPI vs. DPI: what’s the difference?。其实我们只要知道在Android设备中DPI 等价于 PPI 就可以了。通常我们说一个设备是多少寸时指的是屏幕对角线(Diagonal)是多少inch所以用对角线的像素值(px)除以对角线长度(inch)就可以计算出PPI。为了简化适配工作Android根据屏幕大小(Inch)和屏幕密度(DPI)对设备做了如下划分DP既然有那么多不同分辨率、不同大小的屏幕使用PX必然会导致适配困难为了进一步简化适配工作Android为我们提供了一个虚拟的像素单位 DP 或者 DIP (Density-Independent pixel)当然也可以理解为 Device-Independent Pixel。为什么说是虚拟呢因为它的大小不是一个物理(Phisical)值而是由操作系统根据屏幕大小和密度动态渲染出来的。PX跟DP之间的换算关系很简单px dp * (dpi / 160)举例来说小米Pad的屏幕密度为326dpi如果需要显示的图片大小为20dp那么就需要提供一个 20 _(326 / 160) 40px_的图片才能达到最佳显示效果如果还要适配一个163dpi的屏幕那么还需要再提供一个20 (163 / 160) 20px的图片。那么一个20dp的图片在不同设备上的显示效果如何呢我们以iPad为例来说明。iPad2 和 iPad Retina的物理尺寸都是 9.7 inch不同的是分辨率和PPI一个是1024x768 / 132ppi另一个是2048x1536 / 264ppi分别计算一下20dp对应多少inchipad2 20 * (132 / 160) * (7.9 / (math.sqrt(1024 * 1024 768 * 768)))ipad_retina 20 * (264 / 160) * (7.9 / (math.sqrt(2048 * 2048 1536 * 1536)))计算结果都是0.1018359375这就是dp的功能它能保证在所有的设备上显示的大小都一样。如果只提供了一个大小为20px的图片为了保证图片在所有设备上的物理大小都一样高DPI的设备上系统会拉伸图片低DPI的设备上图片会被缩小这样既会影响UE也会影响APP的执行效率。所以我们需要为不同屏幕密度的设备提供不同的图片他们之间的对应关系如下。我们在用Sketch作图的时候如果1x图片对应的是屏幕是MDPI (160dpi)那么1.5x2x就分别对应HDPIXHDPI。SPSP 全称是 Scale-independent Pixels用于字体大小其概念与DP是一致的也是为了保持设备无关。因为Android用户可以根据喜好来调整字体大小所以要使用sp来表示字体大小。参考文献