Android机型适配

一、简介
1.Android平台现状:
碎片化严重:设备繁多、品牌众多、版本各异,芯片、摄像头、分辨率不统一等等。为了保证app在大多数Android设备上有良好的显示的效果就必须要对机型进行适配。
2.适配思路:
(1)语言适配
(2)屏幕适配(尺寸、方向切换)
(3)版本适配(SDK版本)
二、基本概念介绍
1.屏幕尺寸
屏幕尺寸屏幕尺寸指屏幕的对角线的长度,单位是英寸,1英寸=2.54厘米比如常见的屏幕尺寸有:2.42.83.53.74.24.75.05.56.0等。
2.屏幕分辨率
屏幕分辨率是指在横纵方向上的像素点数,单位是px1px=1个像素点。一般以横向像素数*纵向像素数 表示,如1920*1080
3.屏幕像素密度
屏幕像素密度是指每英寸上的像素点数,单位是dpi,即dot per inch的缩写。屏幕像素密度与屏幕尺寸和屏幕分辨率有关,在单一变化条件下,屏幕尺寸越小、分辨率越高,像素密度越大,反之越小。一英寸里面有160个像素,这个屏幕的像素密度就是160dpi
4.尺寸单位换算
(1)px:像素,大多数情况下,比如UI设计、Android原生API都会以px作为统一的计量单位,像是 获取屏幕宽高等。
(2)dp(dip):Density Independent Pixels的缩写,即密度无关像素dpi是屏幕像素密度,假如一英寸里面有160个像素,这个屏幕的像素密度就是160dpi,那么在这种情况下,dppx如何换算呢?Android中,规定以160dpi为基准,1dp=1px,如果密度是320dpi,则1dp=2px,以此类推。
(3)sp:是scale-independent pixels的缩写,dp类似,但是可以根据文字大小首选项进行放缩,是设置字体大小的御用单位
5.关于mdpi、hdpi、xhdpi、xxhdpi
(1)mdpihdpixdpixxdpi用来修饰Android中的drawable/mipmap文件夹及values文件夹,用来区分不同像素密度下的图片和dimen值。
Googlemdpihdpixdpixxdpi官方标准:
名称 像素密度范围 图标尺寸
mdpi 120dpi-160dpi 48x48px
hdpi 160dpi-240dpi 72x72px
xhdpi 240dpi-320dpi 96x96px
xxhdpi 320dpi-480dpi 144x144px
xxxhdpi 480dpi-640dpi 192x192px
(2)图片的选择规则:
a 显示规则:若果在对应的dpi目录中找到,原图使用;如果在高级dpi目录找到,按照比例缩小;在低级dpi找到,按照比例放大。
b.查找规则-先高后低:去屏幕密度对应的目录去找,如果找到就拿来用;如果没找到,就去比这个密度高一级的目录里面去找,如果找到就拿来用,会自动缩小;如果到了xxxhdpi目录还没有找到的话,就会去比自身屏幕密度低一级的目录去找,找到了就拿来用,会自动放大;;
6.values目录
values目录用来放置colors.xml,dimens.xml,strings.xml等,也可以根据屏幕密度设置特定的values目录让满足设定的设备进行加载,比如values-mdpi、values-hdpi、values-xhdpi、values-xxhdpi等等,然后每个目录放置一个demins.xml,使不同分辨率的设备应用不同的尺寸设置。当应用设备在当前dpi对应目录的demins.xml中没有找到目标条目时,采用“就近匹配”原则:
(1)比如,当前为hdpi设备,并且只有以下几个目录,则values的寻找顺序为:
hdpi->xhdpi->mdpi->values,即先向上级dpi目录查找,再向下级dpi目录查找,最后一路向下查找到values目录,如果values下都找不到,就只有找values-ldpi,当然,现在有这个目录的应用不多了。
(2) 把希望在任何设备上视觉大小都一样的尺寸都放置在values目录下并且只放置这一份,其他需要有变化的尺寸则放置在对应目录下即可。
三、适配方案
1.屏幕适配
(1)布局适配
a.尺寸限定符:可以在不同的layout目录中放置同名但布局内容不同的布局。这样在不同尺寸的手机中系统会自动匹配相应的布局,如:
Android机型适配
Android机型适配
布局 屏幕类型 最低分辨率(最小)
layout 默认屏幕 470dp x 320dp
layout-small 小屏幕 426dp x 320dp
layout-large 大屏幕 640dp x 480dp
layout-xlarge 特大屏幕 960dp x 720dp
b. 屏幕方向限定符:用法与尺寸限定符差不多,land-横屏,port-竖屏。看下图,当手机横屏的时候,系统会自动去layout-land/   目录中找布局资源。
Android机型适配
Android机型适配
c. 最小宽度限定符(layout-sw600dp   3.2以前的系统不支持最小宽度限定符),600dp的含义是:代表这个设备的最短的那一边。获取设备的最短边的代码是:
Configuration config = getResources().getConfiguration();
int  smallestScreenWidth = config.smallestScreenWidthDp;
smallestScreenWidth 600想比较就可以知道该设备能否读取layout-sw600dp目录下的资源了。如图:
Android机型适配
Android机型适配
d. 常用技巧: 使用wrap_contentmatch_parent,使用线性布局并使用weight属性,使用相对布局,  尽量用dp/sp,自动拉伸位图:即.9图
2.版本适配
(1)在资源文件做版本适配:
Android机型适配
(2)在代码中动态适配:Androi6.0动态权限的适配
3.语言适配:系统适配字符的时候会首先去相应的目录下找,如果找不到就去默认的/res/values下找。(可以修改一下系统默认语言,再打开App测试)。
操作如下:
Android机型适配
Android机型适配
Android机型适配
Android机型适配