什么网站可免费发布信息,很好用的炫酷WordPress主题,南昌人才网,apple esc企业解决方案为什么要适配#xff0c;适配的好处等等这里就不说了#xff0c;直接说我们要怎么适配#xff0c;请看下面的内容。1.重要概念px#xff1a;pixel#xff0c;像素Android原生API#xff0c;UI设计计量单位#xff0c;如获取屏幕宽高。屏幕分辨率#xff1a;指在纵向和横…为什么要适配适配的好处等等这里就不说了直接说我们要怎么适配请看下面的内容。1.重要概念pxpixel像素Android原生APIUI设计计量单位如获取屏幕宽高。屏幕分辨率指在纵向和横向方向上的像素点数单位是px一般显示方式是纵向像素数量*横向像素数量如1920*1080。屏幕尺寸一般是屏幕对角线长度单位是英寸常见尺寸有3.54.04.34.75.06.0等。屏幕像素密度ppi pixel per inch的缩写意思是每英寸屏幕上的像素数因为屏幕尺寸是商家生产时就规定好的屏幕尺寸一样的手机屏幕宽高却不一定一样所以通常取屏幕对角线像素数量和屏幕尺寸(屏幕对角线长度)来计算屏幕像素密度计算公式就是通过勾股定理和分辨率计算得到屏幕对角线像素数量再除以屏幕尺寸。手机参数上也会有这个数值。dpidot per inch点像素密度它的计算方法也和ppi一样但从很多方面上dpi是和ppi有区别的ppi是用在设备上的单位比如显示器而dpi是用在印刷品上的单位比如要打印一幅地图在图像上的像素看起来是一个个点或者方块这时候通常就将两者混用。要注意的是我们并不能在Android适配时直接使用手机参数上的ppi值而是使用dpiAndroid对dpi根据大小做了规定的分档以160dpi为基准分为ldpi(120dpi)、mdpi(160dpi)、hdpi(240dpi)、xhdpi(320dpi)、xxhdpi(480dpi)等当然现在手机的分辨率和尺寸更加多像560dpi600dpi也有举个例子Nexus 6 ppi是493那按道理我们计算出来的dpi也是493但Android的分档里面并没有493dpi所以实际上它的dpi是560而这个值我们是可以在手机的系统文件里面修改的。一定程度上我们甚至可以说分辨率和适配没有关系我们需要考虑的是dpi值而这个值是可以与分辨率没有关系的是手机厂家设的。dp/dipdensity independent pixels密度无关像素Android设计的一个单位它与px存在一个换算关系Android规定在160dpi时1dp等于1px那么320dpi时1dp就等于2px所以当px换算为dp时dp 160 * px / dpidp换算为px时px dp * dpi /160。换算方法代码px与dp的相互换算spscale independent pixels比例无关像素是Android推荐使用的字体大小单位同样是密度无关而且看上去似乎使用dp也没问题(以前的Android开发很多是这样写)但是原因就在比例上字体除了数值设置外还受到系统字体大小设置的影响而使用sp是适应这种变化的dp则不会跟随系统字体大小设置的变化而变化所以除非你想字体大小不随着系统字体大小设置变化字体大小单位都使用sp。但是sp与设计图上px的转换可以使用dp与px的换算公式。2.适配适配方案有很多种比如百分比布局比如根据每个要适配的屏幕都写一套布局比如分辨率等比缩放等。但都有这样那样的问题Apk体积增大难以维护……我个人比较推荐以下的做法多个demins(dp写法)我们可以把控件的大小数值写在多个dimens xml文件中让应用显示控件大小的时候像获取图片资源一样根据规则选择具体的值。而dimens文件在values文件夹下其实就是应用到不同的values文件夹下的dimens文件中读取到需要的值。但这个“规则”的设置就是最考验适配技巧的时候了诀窍在于我们怎么去命名values文件夹和对设计稿上控件大小进行符合“规则”的单位换算。让我们来看一下怎么去做values文件夹根据限定符去命名屏幕尺寸指最短的可用屏幕区域。如sw480dp表示适配可用屏幕尺寸起码为480dp的情况。屏幕分辨率必须较大数值在前较小数值在后如1920x1080表示适配分辨率为1920x1080的情况其中x是英文字母x而不是乘号。屏幕像素密度如mdpi表示适配屏幕像素密度值近似或等于mdpi(160dpi)的情况。屏幕方向如land(横向)、port(竖向)表示适配屏幕方向为land或者port的情况。版本vX(X代表版本号现在是1到23)表示适配SDK版本为X的情况。还有很多这里就不一一细说了。限定符可以组合起来使用来限定更精确的情况如values-mdpi-land-1920×1080-v19表示适配SDK版本为19分辨率为1920×1080的横向屏幕的mdpi手机。学过组合的都知道这里能有多少种限定符组合而且其中分辨率的值还是不定的只要有厂家生产不同分辨率的手机我们就可以有无数种限定符组合然而我们并不用惧怕限定符的适配是向下匹配的譬如有values-port-1920x1080的手机屏幕需要适配当我们建立的values文件夹里面没有一样的时候就适配到下一级比如values-port-1280x720(如果有而且是最接近目标的话)如果还没有一直向下最后起码能适配到values这个没有限定符的。这里现在只考虑竖屏的时候(横屏就是增加land限定符而且数值变化太大布局也可能需要专门去写适配的原理还是一样的这里就以竖屏为例)根据以下的例子1.UI给我们做了一套1920x1080的图片通常将该分辨率的图片放在drawable-xxhdpi的文件夹下应为通常分辨率为1920x1080的屏幕都是xxhdpi(480dpi)的。2.这时候图片上有一个90x30(px)的控件在1920x1080的机子的布局里面根据换算方法转换成30x10(dp)而xhdpi(320dpi)的1280x720上是多少呢设在该屏幕上的长为A像素(px)根据比例式A/72030/1080那么就知道A为20px那么根据换算公式dp还是103.我们再来看看两个机子它们的sw是多少dp选短边计算1080/480/160360720/320/160360那么结合第二点来看只要sw相同无论具体的在屏幕上显示的px是多少dp都是相同的dp相同代表视觉大小是相同的意味着我们看到的布局效果是一样的适配解决所以我们只需要使用规则给values文件夹命名如下values-swXXXdp就可以了。大概像这样values文件夹命名可能有人有疑问了那么如果遇上一些超级奇葩的厂家给机子设置了很奇葩的dpi值呢单靠这个规则就真的OK吗譬如遇上分辨率为1980x1080但dpi是mdpi的屏幕时这台机子的尺寸就是短边1080/160/1601080dp那么我们只需要建立一个values-sw1080dp的文件夹具体的dp值就是控件长的px值B 30/1080*1080 30dp 30 / (160/160 ) 30这并没有什么问题。其实可以看出来这不是分辨率等比缩放的写法吗只不过把等比缩放之后的分辨率再根据换算方法将px换成dp罢了。但是分辨率可以有无穷多种而以下是可以使用的通用屏幕尺寸的一些值1.320针对以下屏幕配置的设备240x320ldpi(QVGA手持设备)320x480mdpi(手持设备)480x800hdpi(高分辨率手持设备)2.480针对480x800mdpi的屏幕(平板或手持设备)3.600针对600x1024mdip的屏幕(7英寸平板)4.720针对720x1280mdip的屏幕(10英寸平板)注意当应用程序提供了多个带有不同值的最小宽度限定符资源目录时系统会使用最接近(不超出)设备最小宽度的那个资源。这个限定符被添加在API级别13中。还要看android:requiresSmallestWidthDp属性它声明了与你的应用程序兼容的最小的最小宽度并且smallestScreenWidthDp配置字段会持有这个设备最小宽度的值。那么我们的灵活性就大大提高的同时相对于少则十几多则数十的分辨率种类会使用近似值的sw-XXXdp写法就只需要少于十种的就可以搞定了。当然按照前面说的限定符规则在sw-XXXdp的基础上我们还可以加上版本号屏幕方向去针对某些系统版本的手机或者平板同样是比使用分辨率的少很多。最后的问题就是就算要处理的只有几个dimens文件但每个里面可能有十分多的值一个个换算新建修改简直是折磨人的但既然我们知道了换算的规则知道了dimens的调用规则写个方法去修改xml的文件内容是很简单的代码请下载(这里要感谢柯铿)Android屏幕适配