屏幕尺寸,屏幕分辨率 的含义

  • 屏幕尺寸: 屏幕的对角线长度,单位是英寸(in). 1英寸 = 2.54厘米
  • 屏幕分辨率: 屏幕横向和纵向的像素点数.(例如: 横向 1080px,纵向 1920px,则屏幕分辨率表示为: 1920 * 1080)

ppi, dpi, dip, dp, sp, px各代表什么?

  • ppi: 屏幕像素密度(pixels per inch), 是指屏幕上每英寸包含的像素点的数目.
    ppi = 屏幕对角线像素数目 / 屏幕尺寸
  • dpi: (dots per inch), 和ppi是相同概念的不同叫法. Android中主要采用dpi的叫法.
  • dip: 屏幕密度无关的像素(density independent pixels)
    Android中以 160dpi 的屏幕为基准, 规定在此屏幕上 1dip = 1px, 因此dip的公式为 1dip = DPI/160 px
  • dp: dip 的缩写
  • sp: (scale independent pixels), 和dp类似,只不过sp的缩放系数可以根据用户喜好设定,常用于设置文字大小
    1sp = scaleFactor px
  • px: 1像素

Android中图片的适配

  • drawable-ldpi          dpi = 120
  • drawable-mdpi        dpi = 160 (基准)
  • drawable-hdpi         dpi = 240
  • drawable-xhdpi       dpi = 320
  • drawable-xxhdpi     dpi = 480
  • drawable-xxxhdpi   dpi = 640

假设我们的屏幕dpi是480(对应的目录是drawable-xxhdpi)

  • drawable-xxhdpi目录中有需要的图片,那么系统将选取该图片并且不需要缩放.
  • 假设drawable-xxhdpi目录中没有需要的图片,那么系统将选取其它目录中的图片,并进行缩放
int screenDPI;//屏幕dpi
int dirDPI;//选取的图片所在目录对应的dpi
int dirImageWidth;//该目录下图片的宽度(像素)
int dirImageHeight;//该目录下图片的高度(像素)

那么系统缩放之后, Bitmap的宽度 w = dirImageWidth * screenDPI / dirDPI
               Bitmap的高度 h = dirImageHeight * screenDPI / dirDPI

BitmapFactory.decodexx会自动进行缩放, 放在drawable-nodpi目录中的除外

假设我们的屏幕dpi是480(对应的目录是drawable-xxhdpi), 目标图片尺寸 192 * 192

我们将这张图片放到不同的目录下,然后通过BitmapFactory.decodexx 来获取Bitmap,看看缩放后的尺寸:

图片放在 drawable-hdpi 中,缩放后的尺寸: 384 * 384
图片放在 drawable-xxxhdpi 中,缩放后的尺寸: 144 * 144
图片放在 drawable-nodpi 中, 不缩放: 192 * 192
...
  • 当屏幕dpi介于 drawable-xhdpi 和 drawable-xxhdpi 之间时(例如dpi = 400),那么系统将选用drawable-xxhdpi中的图片,并缩放
  • Android中的 density = densityDpi / 160
  • 假设设计师是以dpi=480的屏幕为基准来设计的,那么相应的切图应该放在drawable-xxhdpi目录中,假设其中一个图片的尺寸为72 * 72,那么XML中给他的大小应该设置为 24dp.  (72 / density)
  • 如果不希望BitmapFactory.decode出来的Bitmap被缩放,有2种方法
  1. 将图片放在drawable-nodpi目录下
  2. 将BitmapFactory.Options.inScaled设置为false (默认是true)