近来出了不少关于Android适配的文章和第三方库,能够说已是一波潮流了,甚至上了Github Trending;它们的原理都是同样的,即来自于今日头条的技术分享: 一种极低成本的Android屏幕适配方式。更深刻一点,其本质就是缩放,也有人叫作百分比适配,更早也有库实现这个AutoLayout。关于这些库,我隐隐以为有问题,但要说为何又说不清楚。理了一个礼拜的思路,大概整理出如下几个点。android
首先,这种缩放式的适配替代了DP方式,但没有解决DP要解决的问题。咱们知道实际显示大小和效果是看像素px和ppi的,那为何要弄出一个dp和dpi呢?这起初就是为了可让一样的控件在不一样的设备上物理尺寸看起来同样,不会被“缩放;实际上这里已经进行了缩放了(以mdpi为准,xhdpi就是mdpi的1.5倍);因此咱们用dp就不须要进行缩放了。在中文的Android guide页面,咱们还能够看到这个提示(支持多种屏幕,英文版已经修改,中文版仍是旧的):git
虽然系统为使您的应用适用于不一样的屏幕,会进行缩放和大小调整,但您应针对不一样的屏幕尺寸和密度优化应用。这样能够最大程度优化全部设备上的用户体验,用户会 认为您的应用其实是专为他们的设备而设计,而不是简单地拉伸以适应其设备屏幕。github
值得一说的是,dp这种缩放为了兼容不一样屏幕,是倍数的缩放,而不是简单的拉伸。个人理解上效果比今日头条的拉伸适配更通用的。经过DP缩放,市面上的手机如今宽的dp值通常介于320dp到411dp中间。前面提到的文章和库效果看起来都不错,我理解是如今测试的例子是取了中间值360dp或375dp进行缩放,缩放比例不大的缘故。微信
其次,这种适配只是粗暴的缩放了,并无考虑图片资源的问题。使用DP作适配的时候,咱们能够经过各类drawable-xxxdpi指定图片资源,这些图片和指定好的控件大小也是恰好适配的,举个例子,一个用户头像大小是40dp*40dp,设计通常会给一个默认图,这个默认图的不一样尺寸咱们能够放在drawable-mdpi(40px*40px),drawable-xhdpi(60px*60px),drawable-xxhdpi(80px*80px)几个文件夹,这些尺寸和控件在不一样dpi设备上展现实际像素大小是相同的。我并无看到如今这种缩放怎么解决这个问题。网络
再说设计,合格的设计自己就处理了不一样设备的兼容问题,这种适配方式容易走入误区。如今设计通常出图的时候是以720px或750px或1080px做为原型大小宽的大小,这里已经默认用了Android的DP概念了(720px是750px是做为xhdpi,1080px是xxhdpi)。一个设计图或者原型图,展现的是页面的显示逻辑;这种逻辑不会是从1080p切换到720p或768p就不行。包括设计内在的margin或者padding,不会由于这种变化就须要进行调整。控件大小也是如此。以下面图片所示,一个微信头像在1080px设计图上展现的是80px(40dp), 同一个设计师就算用720px做图导出来的也回事40dp。由于这个40dp不是设计师凭空而来的。适配时若是安装设计的思路还原逻辑(头像在左侧,标题和时间在头像右侧,距离头像15dp,具体金额和总值在右侧);这样作出来的布局是能够同时适配320dp到411dp任意宽度的屏幕的。 ide
理解了设计的逻辑,适配起来并不麻烦,使用DP就够了。一样是上面的图片,咱们看底部的tab切换(红包明细/其余明细)。若是咱们认为一整个tab控件的宽是308dp,就这样写上去了,会出现什么问题?原设计图的宽是360dp的,两边各留出了26dp。直接写308dp在360dp上表现是没有问题的,可是在320dp的设备上两边就只会各自留出6dp,一样地在411dp的设备上两边就会留出51.5dp。这样的适配效果和设计图对比必定看出来一个太窄,一个太宽。但若是两边各自留出26dp,而后控件自己match_parent呢?从视觉上看应该和设计图是差很少的这两种适配相比没有哪一种更麻烦,适配效果好坏只看有没有清楚的认识到设计的逻辑,是否是按照设计的思路作。布局
Android手机屏幕的大小基本介于320dp到411dp之间(平板不在此列);设计图也就那几种规格,换算过来720p和1080p的是360dp,750*1334是375dp。按照设计的内在逻辑去适配,使用DP也并不复杂,效果也是最佳的。虽然这里只说手机,但若是按照这样适配,就算是在平板上,显示效果也是能够的,而不是一个拉伸的界面。测试