理论知识:
1.常用单位
px:pixel像素
in:inch英寸
mm:毫米
pt:1/72英寸
dpi:一英寸长的直线上的像素点的数量,即像素的密度
dp(dip) : Density-independent pixel //密度无关像素,定义为160dpi的屏幕下,1个像素点的长度
sp : Scale-independent Pixels //专用于设定文字大小,和dp类似,但是它除了受到dpi影响,还受到用户的字体偏好设定影响
屏幕的物理尺寸:屏幕对角线的长度,以inch为单位
分辨率: 屏幕上长宽方向上像素点的数量, 例A80为全高清屏,即1080*1920的分辨率// 也称为相对分辨率(使用这种说法的人认为,dpi才是真正的分辨率)
android.util.TypedValue类提供了一个函数,支持把所有的单位换算到px,实现代码如下:
public static float applyDimension(int unit, float value,
DisplayMetrics metrics)
{
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}
手机分辨率主流有4种,
480*854,MDPI;
960*540,HDPI;
1280*720,XHDPI;
1080*1920,XXHDPI;
android对于不同的屏幕给出的适配方案是dp,dp单位的显示效果与dpi无关;
以MDPI为基准,1dp=1px;
HDPI,1dp = 1.5px;
XHDPI,1dp = 2px;
XXHDPI,1dp = 3px;
所以,px = dp * scale ;
scale由设备的pixel密度决定;
使用dp来适配所有的屏幕是不现实的,
1.呈现效果仍后有差异,仅仅是相近而已;
2.当设备的物理尺寸存在差异时,dp就显得无能为力;
解决办法:
根据属性来资源适配机制,即根据不同平台的参数进行针对性的适配,系统会根据设备的具体参数,根据资源文件的属性筛选出最合适的资源;
apk中提供的资源包括animator,anim,color,drawable,layout,menu,raw,values,xml这几种。这些资源保存在res文件下的对应文件夹中。每个文件夹的名字都可以用多种属性来修饰,以便系统在使用过程中根据设备的具体情况来使用不同的资源;
不同的属性以"-"连接,以优先级从高到低的方式排列(否则编译错误),形式如下:
资源名-属性1-属性2...
以下是几种常用的属性:
Language and region:指定区域和多国语言,多国语言最常用的属性,例如en,en-rUS;
Screen size:用来指定屏幕大小,包含这些值,small(基本在3.2寸以上),normal(基本在3.3寸以上),large(基本在5.0寸以上),xlarge(基本在7.5寸以上);
Screen orientation:屏幕方向,值为port或者是land;
Screen pixel density:最常用的属性,值包括,ldpi,mdpi,hdpi,xhdpi,xxhdpi,nodpi,tvdpi。其中,nodpi是开发者不希望系统对图片进行缩放的情况;
Platform version:值为v<version numble>,例如v15的属性修饰的资源;
Available width:值为w<numble>dp,例如适配640dp宽度的设备:w640dp;
Available height:值为h<numble>dp,例如适配640dp高度的设备:h640dp;
指定分辨率,如:800*480;这种方式请注意,某些手机没有实体按键,而是采用了虚拟按键,此时,app所有的尺寸小于设备的屏幕大小,例如某一款手机的分辨率是1280*720,实际上它只能适配1190*720;