Android开发屏幕适配方案

  由于Android系统的开放性,任何用户、开发者、硬件厂商和运营商都可以对Android系统和硬件进行定制,修改成他们自己所需要的样子。使得随着Android设备的增多,设备碎片化、系统碎片化、屏幕尺寸碎片化和屏幕碎片化的程度也在不断加深;

这种碎片化达到什么程度呢?

1、Android系统碎片化:基于Google原生系统,小米定制的MIUI(米粉一个)、华为定制的EMUI和魅族定制的Flyme等等;
2、Android机型屏幕尺寸碎片化:5寸、5.5寸、6寸和现在越来越流行的全面屏及刘海平等等;
3、Android屏幕分辨率碎片化:从一开始的310x480、慢慢发展到480x800、720x1280、1080x1920和1440x2560等等;

  当Android系统、屏幕尺寸、屏幕分辨率出现碎片化的时候,屏幕适配就成了一个亟需解决的问题!由于碎片化的存在,很容易出现同一元素在不同手机屏幕上显示不同的问题。为了保证用户获得一致的用户体验效果,使得某一元素在Android不同系统、不同尺寸、不同分辨率下的手机上能够具有相同的显示效果,能够保持界面上的效果一致,我们需要解决屏幕适配问题,需要对各种手机屏幕进行适配;

考虑 Android 屏幕适配方案之前,先了解一下相关知识点:
  像素(px):通常我们所说的像素,就是构成影像的最小单位,也就是手机屏幕的最小构成单元;单位为px(pixel),1px=1像素点;UI设计图片时会以px作为统一的计量单位;
  分辨率:手机屏幕在横向、纵向上的像素点数总和,一般描述成宽x高,如1080x1920,即横向像素点个数x纵向像素点个数;单位:同像素一样;
  屏幕尺寸(inch):手机对角线的物理尺寸;单位:英寸(inch),一英寸约等于2.54cm;
  屏幕像素密度(dpi):每英寸的像素点数,即每英寸内有多少像素点,如有160个,则像素密度为160dpi;单位:dpi(dots per inch);计算公式:像素密度 = 像素点数 / 尺寸(dpi = px / inch);标准屏幕像素密度(mdpi):即每英寸上有160个像素点(160dpi);

屏幕尺寸、分辨率和像素密度三者关系:

手机的分辨率是宽x高,屏幕大小是以寸为单位,得出:屏幕像素密度(单位/dpi)= 屏幕宽高的平方和,然后开方除以屏幕大小;

  密度无关像素(dp):即与手机终端上的实际物理像素点无关,可以保证在不同屏幕像素密度的设备上显示相同的效果,是Android特有的长度单位;单位:dp/dip(density-independent pixel);

密度无关像素(dp)与像素(px)的转换:1dp =(dpi / 160)x px;

  独立比例像素(sp):即Android开发时设置文字的字体大小的专用单位,按照用户首选的文本尺寸进行字体缩放(属于缩放无关像素);推荐使用偶数,不推荐使用奇数和小数,容易造成精度丢失;如12sp、14sp,12sp以下字体太小;

sp与dp的区别:

1、dp只跟屏幕的像素密度有关;
2、sp和dp很类似但唯一的区别是,Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是正常时 1sp =
1dp = 0.00625 inch,而当文字尺寸是大或者超大时,1sp > 1dp = 0.00625
inch。类似在Windows里调整字体尺寸以后的效果–窗口大小不变,只有文字大小改变;

  屏幕适配问题的本质是使得布局、布局组件、图片资源和用户界面流程等在Android不同尺寸、不同分辨率的手机上具备相同的显示效果;
1、关于布局组件的适配:

1、使用密度无关像素指定尺寸,即dp;
2、使用相对布局或线性布局,不要使用绝对布局;
3、使用wrap_content、match_parent、权重(layout_weight);
4、使用minWidth、minHeight、lines等属性;
5、使用dimens适配;

2、关于布局的适配:
  通过伸缩控件来适应各种不同屏幕大小的布局,但是有些控件伸缩之后,未必能达到最好的用户体验;此时应用程序应该不仅仅实现了可自适应的布局,还应该提供一些方案根据屏幕的配置来加载不同的布局,可以通过配置限定符(configuration qualifiers)来实现;配置限定符允许程序在运行时根据当前设备的配置自动加载合适的资源(如为不同尺寸屏幕设置不同的布局);

1、使用Size限定符,如(large等);
2、使用最小宽度(smallest-width)限定符,通过指定某个最小宽度(以dp为单位)来精确定位屏幕从而加载不同的UI资源;
3、使用布局别名;
4、使用屏幕方向限定符:横屏(layout-land)和竖屏(layout-port);
5、多套layout适配;

3、关于图片的适配:

1、Logo图标,建议按照官方标准做好各个图标;
2、普通图片和图标,建议按照官方的密度类型进行切图即可,但一般我们只需xhdpi或xxhdpi的切图即可满足我们的需求,我目前是放在xhdpi;
3、自动拉伸位图,九宫图即Nine-Patch的图片类型;
4、动画、自定义View、shape;
5、ImageView的ScaleType适配,一般情况下,设置为centerCrop能获得较好的适配效果,但具体还要实际开发;

4、关于代码适配: 
  代码中可以使用Google提供的API对设备的屏幕宽高进行测量,然后按照需求进行设置;
5、关于接口适配: 
  本地加载图片前,判断手机分辨率或像素密度,向服务器请求对应级别的图片,按需返回图片;

6、百分比适配方法:
下面介绍一种适配方案,即我目前使用的一种适配方法:百分比适配方法,步骤如下:

1、以某一分辨率为基准,生成所有分辨率对应像素数列表;
2、将生成的像素数列表存放在res目录下对应的values文件下;
3、根据UI设计师给出设计图上的尺寸,找到对应像素数的单位,然后设置给控件即可;

注:这里推荐一个工具来帮我们完成不同分辨率对应像素数列表,这个工具是张鸿洋大佬提供的,下载链接

注:工具默认基准为400x320;下面看一下怎么使用该工具:

第一步: 
  打开终端,切到autolayout.jar所在的文件目录,如:设置基准为320x400,额外支持尺寸有:1080x1920、1440x2560,命令如下:

java -jar autolayout.jar 320 400 1080,1920_1440,2560

第二步: 
  在autolayout.jar所在的目录下会生成一个res文件,里面包含一系列不同分辨率对应像素数列表,把生成的各像素数列放到对应的资源文件values目录下(注意宽高要对应);
这里写图片描述
将上面res文件夹下的文件,放到工程项目的对应res下;
这里写图片描述
注意: 

必须在默认values文件夹里面也创建对应默认lay_x.xml和lay_y.xml文件(注意对应单位改为dp,而不是上面那些px);因为对于没有生成对应分辨率文件的手机,会使用默认的values文件夹,如果默认values文件夹没有就会报错,从而无法进行屏幕适配;而由于没有对应的分辨率文件,在不知道机型分辨率的情况下,默认分辨率文件夹只好默认为:x1 = 1dp以保证尽量兼容,这也是这个解决方案的一个弊端;

第三步: 
  根据UI给出的某一分辨率设计图上的尺寸,找到对应像素数的单位,然后设置到对应的控件即可;

这种百分比适配方案也有小缺点,但是基本可以满足90%的机型适配,缺点如下:

1、由于实际上还是使用px作为长度的度量单位,所以和google的要求使用dp作为度量单位会有所背离;
2、必须尽可能多的包含所有分辨率对应像素数列表,因为这个是使用这个方案的基础,如果有某个分辨率缺少,将无法完成该屏幕的适配;
3、过多的分辨率像素数描述xml文件会增加软件包的大小和维护的难度;

今天学习了Android开发屏幕适配方案,做个总结笔记,方便以后查看!
参考:
Android开发:最全面、最易懂的Android屏幕适配解决方案

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值