Android设备各种机型和型号层出不穷,加大了Android开发人员对各种机型的适配工作,我们日常开发如何做各种机型的适配工作就显得很重要。从概念到原理逐一击破适配的重点和难点。
屏幕尺寸:指设备的物理尺寸,对角线的长度。常见的屏幕尺寸有3.5寸、4.0寸、5.0寸等
分辨率:横纵向方向像素点数量。常见的分辨率有1080*1920等
像素密度(dpi):表示每英寸屏幕所拥有的像素的数量,对角线像素点除以屏幕大小。常见像素密度有120、160、240、320
放大像素(sp):主要适用于字体显示,在系统更换字体大小时会随之改变,与独立像素密度一样都是为了排除像素密度的干扰。在特定情况下,sp作为单位的效果和以dp作为单位的效果是一样的。
密度独立像素(dp):这是一个相对值,以像素密度160dpi为基准。在像素密度为160dpi设备 上1dp=1px,在像素密度为240dpi设备上1dp=1.5px,以此类推。这个单位规定了基准,并排除像素密度的干扰所以1dp的长度在各个设备上面的物理长度是一致的。
Android SDK提供了一些API来获取与此相关的API,现在就来介绍一下。
public static void getDeviceInfo(Activity activity) {
DisplayMetrics mDisplayMetrics = new DisplayMetrics();
try {
Display mDisplay = activity.getWindow().getWindowManager().getDefaultDisplay();
mDisplay.getMetrics(mDisplayMetrics);
Point mPoint = new Point();
Display.class.getMethod("getRealSize", new Class[]{Point.class}).invoke(mDisplay, new Object[]{mPoint});
int l = mPoint.x;
int k = mPoint.y;
String mResolution= l + "*" + k;
String mDensityDpi= mDisplayMetrics.densityDpi + " dpi";
Log.e("TAG", "分辨率:" + mResolution+ "\n像素密度:" + mDensityDpi);
} catch (Exception e) {
e.printStackTrace();
}
}
在使用自己手机获取到的数据是:分辨率1080*2340
,像素密度440dpi
。由此我们能计算得出手机的物理尺寸大约是5.86英寸
。
下面的表格代表res下资源文件各个文件夹名称代表的含义
选项(名称)[项目] | 密度值(dpi)[设备] | 分辨率(举例)[设备] |
---|---|---|
mipmap-ldpi | 0(不含)~120(含) | 240*320 |
mipmap-mdpi | 120(不含)~160(含) | 320*480 |
mipmap-hdpi | 160(不含)~240(含) | 480*800 |
mipmap-xhdpi | 240(不含)~320(含) | 720*1280 |
mipmap-xxhdpi | 320(不含)~480(含) | 1080*1920 |
… | …(+160) | … |
自动适配
如果只准备了一张图片放在某个特定的文件夹下面,那么像素密度与其不匹配的设备读取该图片也没有出现图片过大或者过小,这是因为设备自动适配了这张图片。
标识(mdpi) | 像素密度(160dpi) | 图片分辨率(100*100) | 缩放比例(1) |
---|---|---|---|
ldpi | 120dpi | 75*75 | 0.75 |
hdpi | 240dpi | 150*150 | 1.5 |
xhdpi | 320dpi | 200*200 | 2 |
xxhdpi | 480dpi | 300*300 | 3 |
上面的表格表示项目中的图片(100×100)放在mdpi文件夹下面,那么像素密度为120dpi的设备显示图片的时候会先把图片分辨率自动转化成75×75,如果布局显示该图片的长宽为wrap-content的话,各个设备上面显示的都是100dp×100dp图片,这就是Android自动适配的机制。
手动适配
有的时候我们需要指定设备设配,比如某个文字我们要求在mdpi(中等像素密度)的设备上面显示的大小比较特殊,那么我们就需要手动在res文件夹下面创建一个文件夹values-mdpi,创建xml文件dimens(可自定)编辑:
<resources>
<dimen name="base_width">10dpdimen>
resources>
再创建一个values文件夹,创建xml文件dimens(可自定,与上面保持一致即可)编辑:
<resources>
<dimen name="base_width">20dpdimen>
resources>
这样就表示除了mdpi(中等像素密度)设备以外其他设备读取该文件夹下面的。在布局中引用以下即可。引用如下:
android:layout_width="@dimen/base_width"
其实value文件夹可以有很多限定条件,具体 点击查看。
全面屏是当下形容手机最流行的关键词,关于全面屏手机的适配,谷歌也给出了相应的适配方案,但我们首先也要知道为什么需要适配全面屏手机。这是因为全面屏手机的长宽比例不再是以前的16:9了,对于这种特殊的长宽比例开发者就需要去优化应用,更优美地显示在设备上。
提高最大屏幕纵横比,在AndroidManifest.xml中做如下配置即可:
<meta-data android:name="android.max_aspect" android:value="ratio_float"/>
一般将ratio_float设置成2.1可满足目前地全面屏手机,此时支持的最大长宽比例为18.9:9
随着时间地推移如果出现长宽比更大的设备的时候这个值还要增加。