美文网首页
屏幕适配

屏幕适配

作者: 潇洒人生_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文件。

相关文章

  • 屏幕适配总结

    屏幕适配总结 为什么要针对屏幕做适配 drawable目录常见问题 : 屏幕适配方案:

  • Android屏幕适配-应用篇

    目录 Android屏幕适配-基础篇Android屏幕适配-应用篇 Android屏幕适配最主要的原因:  是由于...

  • 屏幕适配的那些坑

    屏幕适配的那些坑 屏幕适配的那些坑

  • LayaAir屏幕适配

    LayaAir屏幕适配 官方教程链接:LayaAir实战开发11-屏幕适配 屏幕适配 随着移动端设备(手机、平板、...

  • she

    1.适配的分类 系统适配 屏幕适配 1.1屏幕适配历史 1.1.1autoresizing 去掉auto layo...

  • Android屏幕适配

    一. 为什么要适配屏幕 android屏幕大小、屏幕密度碎片化严重 二. 怎么样适配屏幕 图片适配 应用图标提供不...

  • 屏幕适配AutoResizing

    适配器简介 AutoResizing 屏幕适配的历史 -iPhonestyGS\IPhone4 -没有屏幕适配可言...

  • css media 适配屏幕宽度

    H5 屏幕适配 css media 适配屏幕宽度;js 通过 适配获取屏幕宽度,来执行对应方法; max-widt...

  • 关于iOS适配的一点事

    屏幕适配及文字适配

  • Android屏幕适配(4)常见:第三种

    前言:Android屏幕适配(1)基础知识篇Android屏幕适配(2)常见:第一种Android屏幕适配(3)常...

网友评论

      本文标题:屏幕适配

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