[Android 总结] 屏幕适配方案 续

接着上一篇的《屏幕适配方案》,上一篇讲了dp 的作用,接下说下其他的真实适配方案。

2.宽高限定符适配

所谓宽高限定符适配,就是在资源文件下生成不同分辨率的资源文件,然后在不同的分辨率下生成不同的dimens


根据分辨率不同生成不一样的资源文件

设定一个基准的分辨率,其他分辨率都根据这个基准分辨率来计算,在不同的尺寸文件夹内部,根据该尺寸编写对应的dimens文件

比如以1080*1920为基准分辨率,其他的根据这个基准换算出相应的值放在目标文件下。

假设一张图片在这个分辨率下的大小为180*180,那么我们的宽高可以这样写

android:layout_height="@dimen/px_180"    android:layout_width="@dimen/px_180" 

在“values -1080x1920” 这个资源文件下 :

<dimen name="px_180">180px</dimen>

那么对于720*1280的分辨率的手机来说,换算的结果就是

宽为:180/(1080/720) = 180/1.5 = 120 px

高为:180/(1920/1280) = 180/1.5 = 120 px

所以:在values -720x1280 这个资源文件下" px_180 "为 :

 <dimen name="px_180">120px</dimen> 

    这样,我们的UI设计界面使用的就是基准分辨率设计,那么我们就可以按照设计稿上的尺寸填写相对应的dimens引用了,而当APP运行在不同分辨率的手机中时,这些系统会根据这些dimens引用去该分辨率的文件夹下面寻找对应的值。这样基本解决了我们的适配问题,而且极大的提升了我们UI开发的效率。理论上只要不同分辨率下资源文件齐全,那么我们的页面就是适配所有的手机了。

    其实这也就是这种适配方案的缺点了!我们需要知道市场上所有分辨率的手机,并且一一为他们写资源文件。比如1920x1080的手机就一定要找到1920x1080的限定符,否则就只能用统一的默认的dimens文件了。而使用默认的尺寸的话,UI就很可能变形,简单说,就是容错机制很差,而且不宜于维护,每改一个值要所有的资源文件都修改

3.UI适配框架AutoLayout

    这个框架是我之前采用过的一种适配方式,是鸿洋大佬写Layout 适配方案,github地址 AndroidAutoLayout

目前项目已经停止维护了,这里贴下博客《Android AutoLayout全新的适配方式 堪称适配终结者》。

第一步:

在你的项目的AndroidManifest中注明你的设计稿的尺寸


标识自己的设计稿尺寸

第二步:

让你的Activity继承自AutoLayoutActivity.

     然后我们就可以直接在布局文件里面使用具体的像素值了,比如,设计稿上是96*96,那么我们可以直接写96px,APP运行时,框架会帮助我们根据不同手机的具体尺寸按比例伸缩。这可以说是一个极好的方案,因为它在宽高限定符适配的基础上更进一步,并且解决了容错机制的问题,可以说完美的达成了开发高效和适配精准的两个要求,框架要在运行时会在onMeasure里面做变换,我们自定义的控件可能会被影响或限制,可能有些特定的控件,需要单独适配。

    这种方案的好处是不用再 为多种分辨率写多个dimens了,再也不用去计算百分比了,也不用再跟UI扯皮说dp的是事情了,但是目前该框架已经停止维护了。

4.smallestWidth 限定符适配方案

我个人觉得 smallestWidth 限定符屏幕适配方案 是宽高限定符屏幕适配方案的升级版。因为 smallestWidth 限定符屏幕适配方案 只是把 dimens.xml 文件中的值从 px 换成了 dp,原理和使用方式都是没变的。如下图:


    其实smallestWidth 限定符屏幕适配方案的原理也很简单,开发者先在项目中根据主流屏幕的最小宽度 (smallestWidth)生成一系列values-sw<N>dp文件夹 (含有dimens.xml文件),当把项目运行到设备上时,系统会根据当前设备屏幕的最小宽度 (smallestWidth)去匹配对应的values-sw<N>dp文件夹,而对应的values-sw<N>dp文件夹中的dimens.xml文字中的值,又是根据当前设备屏幕的最小宽度 (smallestWidth)而定制的,所以一定能适配当前设备

    如果系统根据当前设备屏幕的最小宽度 (smallestWidth)没找到对应的values-sw<N>dp文件夹,则会去寻找与之最小宽度 (smallestWidth)相近的values-sw<N>dp文件夹,系统只会寻找小于或等于当前设备最小宽度 (smallestWidth)values-sw<N>dp,这就是优于宽高限定符屏幕适配方案的容错率,并且也可以少生成很多values-sw<N>dp文件夹,减轻App的体积。

   注意这里不是宽度,而是最小的那一边的宽度。,我们的手机或者平板设备是可以旋转的,当横屏切换时屏幕的高宽也会互换。这里最小宽度就是不区分屏幕方向的,它只会把屏幕的高度和宽度中值最小的一方认为是最小宽度,这个最小宽度是根据屏幕来定的,是固定不变的,所以不管怎么旋转,系统只认定最小的那一边为最小宽度

    如果想让屏幕宽度随着屏幕的旋转,就是旋转后适配不同的资源文件呢,可以再根据values-w<N>dp(去掉sw中的s) 生成一套资源文件,比如

values-w1080dp     values-w1920dp  

这样,当竖屏的时候手机宽度为1080的就会使用values-w1080dp 文件下的值,当横屏了宽度变为1920了,系统就会使用values-w1920dp 文件下的值。

  如果想区分屏幕的方向来做适配该怎么办呢?那就只有再根据屏幕方向限定符生成一套资源文件咯,后缀加上-land-port即可,像这样,values-sw720dp-land (最小宽度 720 dp 横向)values-sw1920dp-port (最小宽度 1920 dp 纵向)


smallestWidth的计算规则

    如果想在程序上直接运行跑出结果可以这样用:

Configuration config = getResources().getConfiguration();

int smallestScreenWidth = config.smallestScreenWidthDp;

同宽高限定一样,不同最小宽度下的,以一个为基准,按比例算出其他的值。比如,我以1080dp为基准如下图:


values-sw720dp-land下的基准值


values-sw720dp-land 下的根据1080按比例换算出来的

    目前 这套方案也是我比较常用的,个人觉得比较完美的适配方案了。从开发效率上,它不逊色于上述任意一种方案。根据固定的放缩比例,我们基本可以按照UI设计的尺寸不假思索的填写对应的dimens引用。一上面的两个图为例,我在values-sw1080dp文件夹下的diemns文件意味着手机的最小宽度的dp值是1080,然后我的设计稿也是以1080像素的手机设计的,我就以他为基准,每个设计稿中像素是多少我就在values-sw1080dp 填写相同是值就可以,如果是sw720dp的手机,1080刚好是720的1.5倍,那diemns里面的值也是除以1.5就可以了。

    不过smallestWidth适配方案有是在Android 3.2 以后引入的,,不过目前所有的项目应该最低支持版本应该都是4.0了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容

  • [{"reportDate": "2018-01-23 23:28:49","fluctuateCause": n...
    加勒比海带_4bbc阅读 767评论 1 2
  • 2018-07-27#日反思 -# 每日金句:优秀是一种习惯。 -【早起打卡】20180727 -【践行人员】jo...
    Joiezhong阅读 136评论 0 0
  • 前言 Android的屏幕适配应该是我们开发者经常遇到的“头疼”问题了,经常会碰到产品投诉,这里怎么和原型图尺寸不...
    graychen阅读 354评论 0 1
  • 2018.07.27日晨 整个北方大区在京拉练中~ 抵京已有四天,疲惫中带着兴奋。阿里做这件事或许真的 为商家解决...
    尤里山治阅读 125评论 0 0
  • 今天早晨爬起来,打开电脑,准备参加珠峰队的小组会。发现只有我一个人,再翻开会议通知,珠峰队安排的时间是29日早晨6...
    bdec4e2f6612阅读 464评论 0 51