屏幕适配

Android开发屏幕适配相信是大多数人的硬伤,因为手机品牌繁多,所以适配起来比较麻烦,适配不是技术难点,是个麻烦点,那好,现在咱们就聊聊,关于适配现在大多数的解决方案。

适配主要靠平时写代码的良好习惯:

(1)使用wrap_content、match_parent、weight

(2)使用线性布局和相对布局

(3)部分情况下使用.9图片

(4)合理使用fragment

(5)使用dp,sp单位

(6)百分比例适配,每个控件宽度为屏幕宽度的百分比例,在代码中实现控件的宽高和位置摆放。

存在的问题:

上述(5):字体的使用,相信大多数开发者是使用sp为单位,存在一种情况,如果使用sp为单位,现在手机上有一种功能可以选择字体大小,如果是把字体放大或者缩小,那么自己就会变化,如果自己的布局是适配的那么自己的界面就会看起来非常丑,所以现在主流app基本不可能做到调大字体布局跟着变化,当然也可以做,这要根据需求而定,如果想要字体放大或者缩小字体不变,UI不跟着变化,那么字体就不能使用sp,而是使用dp。

上述(6):百分比固然可以可以精确定位UI所展示的位置,但是有些需求是在不同手机上展示的方式是不相同的,比如一个页面在其中一个手机上占手机屏幕的一半,在另一个手机上也占手机上的一半就会变得非常丑,所以UI需求,也许占手机的80%会比较好看,也更加合理,这时就不能用weight进行等比分割了,除非有硬性要求。

适配方案

拿到UI设计图,根据设计图上标的px,首先把px转化成dp

px转dp,通过这样的转化,可以拿到设计图上px对应的dp,由于设计图基本就属于主流机型,所以拿着个dp去写布局也就能实现大部分的适配。

AutoLayout第三方库,号称适配终结者

拿到设计图,meta信息中填入设计图的尺寸,然后不需要额外计算,布局直接抄设计图上的尺寸,不产生任何多余的资源文件,完成各种分辨率的适配。

原理:这个px并不代表1像素,我在内部会进行百分比化处理,也就是说:720px高度的屏幕,你这里填写72px,占据10%;当这个布局文件运行在任何分辨率的手机上,这个72px都代表10%的高度,这就是本库适配的原理。

用法:

1.将autolayout引入

dependencies {

compile project(':autolayout')

}

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

3.Activity中开启设配:让你的Activity去继承AutoLayoutActivity,由于大多数Activity继承AutoLayoutActivity不太方便,所以一般不采用这种方式,一般使用AutoXXXLayout代替系统原有的XXXLayout。当然,你可以放心的是,所有的系统属性原有的属性都会支持,不过根布局上就不支持px的自动百分比化了,但是一般根布局都是MATCH_PARENT,而上述的方式,根布局也是可以直接px的百分比化的。

存在的问题:

1.TextView这个控件呢,可能和设计稿上会有一些出入,并非是此库的原因,而是与生俱来的特性。如何你将高度写死,也会发现文字显示不全。

2.alertDialog或者popupwindow无法适配。

3.这个适配方案没有考虑statusbar和navagation bar。在带虚拟按键的手机上面会很明显。谷歌nexus和华为大部分机型都是自带虚拟按键的,我们可以简单的测试一下。就加载一个圆形的头像,你会发现头像被压扁了。

4.UI绘制效率低。布局会先使用原始px值绘制一次UI,然后再使用适配后的px值再次绘制一次,导致UI两次绘制。

5.内存开销更大。会产生大量布局代理类,导致内存开销增大。

总结

上述AutoLayout看似强大,其实也是有非常多的问题,所以在大型项目中不建议采用,因为如果在做到一半发现未知问题,那么改起来就比较麻烦了。

使用布局别名

如果要将用户界面设计成在手机上显示单面板,但在 7 英寸平板电脑、电视和其他较大的设备上显示多面板,那么我们就需要提供以下文件:

res/layout/main.xml: 单面板布局

res/layout-large: 多面板布局

res/layout-sw600dp: 多面板布局

后两个文件是相同的,因为其中一个用于和 Android 3.2 设备匹配,而另一个则是为使用较低版本 Android 的平板电脑和电视准备的。

根据UI设计图生成dimen

我们假设手机屏幕的宽度都是320某单位,那么我们将一个屏幕宽度的总像素数平均分成320份,每一份对应具体的像素就可以了。
我们将一个屏幕宽度分为320份,高度480份,然后按照实际像素对每一个单位进行复制,放在对应values-widthxheight文件夹下面的lax.xml和lay.xml里面,这样就可以统一所有你想要的分辨率的单位了

产生的问题:

由于在生成的values文件夹里,没有对应的分辨率,其实一开始是报错的,因为默认的values没有对应dimen,所以我只能在默认values里面也创建对应文件,但是里面的数据却不好处理,因为不知道分辨率,我只好默认为x1=1dp保证尽量兼容。这也是这个解决方案的几个弊端,对于没有生成对应分辨率文件的手机,会使用默认values文件夹,如果默认文件夹没有,就会出现问题。
这个方案虽然是一劳永逸,但是由于实际上还是使用的px作为长度的度量单位,所以多少和google的要求有所背离,不好说以后会不会出现什么不可预测的问题。其次,如果要使用这个方案,你必须尽可能多的包含所有的分辨率,因为这个是使用这个方案的基础,如果有分辨率缺少,会造成显示效果很差,甚至出错的风险,而这又势必会增加软件包的大小和维护的难度,所以大家自己斟酌,择优使用。

最终方案

上述说了那么多基本是现在采用适配的技术了,但是发现好像每一个方案都存在问题,所以适配麻烦点就是在这,不能使用某一项技术去实现适配,要把所有的技术结合起来,下面我要谈谈我对适配方案的理解。

1.上述讲的良好习惯作为基础

2.px转化成dp,才这里开始写布局

3.碰到难以适配的机型可以写布局别名

4.在部分情况下可以使用代码适配

通过上述方法基本已经能够适配大部分机型,如果还有特殊问题,应该针对解决,不建议使用第三方库,和写多个dimen文件。

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

推荐阅读更多精彩内容