屏幕尺寸,屏幕分辨率 的含义
- 屏幕尺寸: 屏幕的对角线长度,单位是英寸(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种方法
- 将图片放在drawable-nodpi目录下
- 将BitmapFactory.Options.inScaled设置为false (默认是true)