Android屏幕适配

Posted by 程序亦非猿 on 2016-01-12

屏幕适配

Android设备众多,虽然Android会自动缩放,重新定尺寸来适应,但是you should make the effort to optimize your application for different screen sizes and densities

概念

  • Screen size

屏幕大小(屏幕的对角线长度,单位为英寸,1英寸=2.54cm),按屏幕大小可分:small, normal, large, and extra-large.

  • Screen density(dpi)

屏幕密度,某个尺寸区域内的像素密度(跟数学题求密度差不多,即面积/数量),它通常就是dpi (dots per inch),
根据屏幕密度可分为low, medium, high, extra-high, extra-extra-high, and extra-extra-extra-high.,
与我们项目中的mdpi,hdpi,xhdpi等对应,可以看出xextra的缩写,h是high的缩写~

  • Resolution
    分辨率,整个屏幕所包含的物理像素,如经常听到的10801920,480800,屏幕大小一定,分辨率越高越清晰,这相信大家都知道

  • Density-independent pixel (dp/dip)
    密度独立像素,我们布局的时候最常用也最推荐的单位就是这个了!

Android按160dpi为标准,在160dpi的设备中,1dp=1px,由此也可以得知dp与px的换算公式:px = dp * (dpi / 160)

非常值得注意的是,在Android中有个DisplayMetrics类,它存放了部分displayer的信息,当我们在PX与DP之间转换时,我们可能已经见到过如下方法:

1
2
3
4
5
6
7
8
9
10
11
public static int dip2px(Context context, float dpValue)
{
final float density = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
public static int px2dip(Context context, float pxValue)
{
final float density = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}

注意,代码中的density与我们之前所说的screen density不同,这个density是 (screen density)/160 的值!!!
所以把它代入到之前的换算公式中去就得到了px=dp*density,那么为什么代码中出现了0.5f呢?那是为了避免精度损失.

PS:如果你需要知道当前设备的dpi,可以用metrics.densityDpi来获取,另外其实Android系统还有一个类提供了各种单位之间的转换–>TypedValue

sw/sh/w/h

sw,sh是3.2开始出现的限定词:如: layout-sw600dp, values-sw600dp

  • swdp 表示smallestwidth,当最下宽度大于N时采用,如sw600dp表示设备的宽度大于600dp时采用
  • shdp 表示smallestheight

    PS: sw,sh不会随着屏幕变化而变化,

  • wdp,hdp 与之前的不同,它们随着屏幕的变化而变化的

值得一说的是,并不推荐用这种方式!

资料

Supporting Multiple Screens