美文网首页
屏幕适配

屏幕适配

作者: 潇洒人生_cca2 | 来源:发表于2017-06-27 16:45 被阅读0次

    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文件。

    相关文章

      网友评论

          本文标题:屏幕适配

          本文链接:https://www.haomeiwen.com/subject/zjrgqxtx.html