应朋友之邀,介绍一下关于Android适配的问题。

做launcher一年了,最多的就是适配,各种分辨各种尺寸的手机,会出现很多问题,今天就借这个机会总结一下,不一定全面,只是根据自己遇到的情况进行总结。

适配主要包括布局适配,语言适配,还有功能适配。我们遇到做多的就是布局适配问题,其实语言适配问题也主要是影响布局适配,功能适配主要是针对不同厂商出的rom不同导致一些功能调用有所差异,比如相机调用等。

布局适配


要想做好布局适配,首先你要了解几大布局控件的属性和详细使用方法,如果你不了解他的特性就会使用混乱,导致很多问题,布局显示不到位,嵌套太多,导致性能下降等,当然本文不涉及性能问题,只讲适配问题。

在布局适配中我们会总结出一些原则:左右边距统一原则,居中原则,右对齐原则,左对齐原则,均分原则。

1.左右边距统一原则:我在项目开发中,遇到过很多次,同一个应用不同页面边距各不相同,这样在我们切换页面时会发现也没的显示跳动,很不美观,这就是我们设计问题。为了美观,方便观看,应用的内容和手机边框都会有一定的距离,有一些新设计者不注重这个问题,导致同一个界面左右边距不同,同一个应用不同页面相同方位的边距不同,这样就很影响美观,布局很难看,为了美观,我们尽量让整个应用的所有界面的所有左右边距都一样,一般设置值为20dp即可,如果时小屏手机可以设置为10dp,这样方便统一界面。如下图所示,在中间蓝色框中的列表,左右边距都是相同的,这样比较美观。

图一

图一

2.居中原则:如下图所示,中间黄色部分就是居中的,但是只是左右居中,上下并没有居中,这种布局相对简单,但是适配却比较麻烦,麻烦的原因是如果定死图片宽高大屏手机显得图片很小,如果按照大屏去写在小屏手机上就会显示的非常大,最好的方式就是安装百分比去设置,但是xml设置百分比要引入百分比包,还有方案就是动态设置百分比,也就是在java代码中读取屏幕宽度来设置图片的宽,然后高度自适应就好。

图二

图二

3.左对齐原则:如下图所示,中间红色框中的部分,每个Item有一个图片和一个标题,这种只要是最典型的右对齐结构,图片和文字均在右边,只要设置右边距就好,这样每个手机都是一样的,不用管右边空白部分,这种适配比较简单。

图三

图三

4.右对齐原则:如图一所示,中间部分,每个选项后面有一个指示图标,这种表示还能进行其他操作,这种布局都是在右边,这种设置,你只需要让他们右对齐,然后设置相同的边距即可,不用考虑左边的情况,这样的适配就不需要考虑屏幕大小,只要内容不是过长。

5.均分原则:如小图,中间的标题栏,中间三个标题各占一份,这样的布局就是用线性布局,然后用权重,三个标题均分整个屏幕宽度,然后让标题内容居中显示即可,当然,如果文字过长,需要省略显示,你要设置他们之间的间距和左右边距。(这种情况一般发生在多国语言,如果只是中文那你比较幸福)

图四

图四

6.除了上面的一些原则,还有一些是把上面这些原则组合使用的,比如如下图或者图三的标题栏,都是左右对齐和居中原则,中间图标均分,这样显得很整齐。但是在下面的图中的中间标题,显示多个,但是并不是均分,要想适配肯定是不能写死的,那就要用线性布局来,按照一定的比例来分配整个宽度,如果是其他语言或者更多的选项那只能做左右滑动了。

图五

图五

7.GridView:常用用法就是设置每行的列数,然后设置又有边距,中间内容均分,但是在如果都是图片,图片大小不一致如何搞,那就要设置图片的scaleType属性,或者在代码中设置,来让图片占满整个图片显示区,当然,有些需求还要求你定义ImageView来设定图片的宽高比,这样每个Item显示的图片都是一样大的,并且没有空白部分。

图六

图六

还有如下情况,卡片效果,为了适配各种图片,各种手机最好的做法就是自定义ImageView,设置好宽高比,这样所有手机显示都相似,不需要特殊适配。

图七

图七

8.比例适配:下图是我使用的一个跑步软件的界面。那个公里和配速占的宽度是不一样的,这样的适配有两种方案,一种是将公里的宽度写死,然后剩下的占满整个屏幕,另一种是按照比例来设置,但是我更趋于第一种写法,因为前面的文字很简单,不会占用很大的距离,如果设置比例,前面的宽度变化很大,要么显得拥挤要么显得空旷。

图八

图八

还有就是如下图所示,蓝色框中的内容部分是在宽度上均分的,所以只需要设置宽度均分,然后高度自适应就好,也不需要对不同屏幕进行特殊处理。

图九

图九

多语言适配


不同语言占用长度相差很大,我们现在的项目就是做国际化,很多国家的语言,这就导致很多设计不能像中文一样简练,导致很多布局的设计都要调节。这种就避免左右分配空间,尽量在高度上分配空间。如果实在要在宽度上分配,那么要考虑左右滑动。

比较特殊的还有阿拉伯语,切换到阿拉伯语之后界面的左右是相反的,也就是左边的按钮到右边,右边的会到左边如果需要做阿拉伯语适配的,就需要考虑在设置左右对齐时要选择好布局。

绝对适配


绝对适配就是我们在做Launcher中用到的,所有尺寸写死,然后在res中配置不同屏幕分辨率的dimens.xml文件,这种适配过程需要很大人力物力成本,要有专门的人员进行适配,要有各种手机进行适配,因此这种在应用开发中是不建议做的,如果做也只做系统提供的几种即可,一般按照我上面讲解的进行适配,然后在values-hdpi,values-xhdpi,values-xxhdpi等这些文件夹中的dimens.xml中配置字体大小或者尺寸即可,这用对于我们app的开发是能够满足使用的。

但是对于Launcher的开却是不行的,需要更详细的配置过程。下面是我们项目中的一个适配尺寸文件:

图十

可以看到里面有很多文件,没有做过这种适配的可能不太了解,我下面根据实例来讲解一下算法,

例如:value-sw360-xxhdpi-1920x1080
首先介绍sw360的算法,下面是我用安兔兔获取的一个手机的分辨率和屏幕密度,

图十一

那么,sw = 160 * 1080 / 480 = 360,

由下面的图标关系可知,1080对应xxhdpi,那么就对应value-sw360-xxhdpi-1920x1080,那么为什么还要写xxhdpi,如果我在来取一个手机的参数,1280x720,分比率为320,那么sw = 160 * 720 / 320 = 360,同样还是360,因此为了更详细后面还要添加xhdpi才能够确定手机分辨率。

图十二

app图标适配,不同分辨率的手机显示在桌面显示的图标也是有区别的,需要的图标尺寸如下:

图十三

为了更好的显示图标,你需要UI设计上面几个尺寸的图标放到不同的图片文件夹下面。

总结


上面介绍了多种适配,都是理论性的,因为那些布局的使用基本都没有问题,主要是思想的问题,所以只写了理论,在适配过程中最主要的是宽度方向上,因为高度一般都是可滑动的,因此相对简单,设置好宽度,高度方向可以自适应,或者写死都行,没有太大的影响。

比较难的就是图片适配,要设置宽高比或者设置scaleType属性来解决比较好。还有一些更复杂的设计需要自己多去实践。还有一个注意的就是如果宽度不能定死那就用边距或者比例来限制宽度,会帮助你解决很多问题。