dpi是什么呢?
dpi是“dot per inch”的缩写,每英寸像素数。
四种密度分类: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)
通常状况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。java
dpi计算公式
DPI=对角线的像素值/尺寸android
手机屏幕分辨率和屏幕密度是两码事!并非800*480的分辨率手机图片就应该放在hdpi文件夹中。5.0英寸 800*480属于mdpi布局
也能够经过代码获取:图片
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels; // 屏幕宽度(像素)
int height = metric.heightPixels; // 屏幕高度(像素)
float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)
int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
android会根据屏幕自己的尺寸与密度特性,自动载入对应的资源,并把它们从逻辑像素(DIP,用于定义界面布局)转换成屏幕上的物理像素。资源
首先看看 系统是如何经过Resources的getDrawable(int id)方法找图片的get
public Drawable getDrawable(int id) throws NotFoundException {
TypedValue value;
synchronized (mAccessLock) {
value = mTmpValue;
if (value == null) {
value = new TypedValue();
} else {
mTmpValue = null;
}
getValue(id, value, true);
}
Drawable res = loadDrawable(value, id);
synchronized (mAccessLock) {
if (mTmpValue == null) {
mTmpValue = value;
}
}
return res;
}
TypedValue 咱们能够理解为存储数据的类型,主要被Resouces使用于持有的资源值
经过getValue(id,value,true)方法去获得该id的资源的属性源码
public void getValue(int id, TypedValue outValue, boolean resolveRefs)
throws NotFoundException {
boolean found = mAssets.getResourceValue(id, 0, outValue, resolveRefs);
if (found) {
return;
}
throw new NotFoundException("Resource ID #0x"
+ Integer.toHexString(id));
}
最后经过loadDrawable(value, id)获得drawable,该方法到了底层的C代码,大体意思就是经过TypedValue中的方法和属性就能够得到咱们想要的属性值,而后加载图片it
OK,下面来作个实验.io
试验一: 手机是1280*720 4.3英寸 属于xdpi 图片分辨率为960*640 (按正常图片不缩放 图片放在手机里面 应该不会充满 整个手机) 我把图片放在不float
文件夹 加载时间(ms) 图片显示 说明
drawable 311 充满屏幕 图片有拉伸
drawable-nodpi 130 未充满屏幕 图片显示正常
drawable-ldpi 442 充满屏幕 图片有拉伸
drawable-mdpi 383 充满屏幕 图片有拉伸
drawable-hdpi 226 充满屏幕 图片有拉伸
drawable-xhdpi 109 未充满屏幕 图片显示正常
试验二: 手机是800*480 4.3英寸 属于hdpi 图片分辨率为960*640 (按正常图片不缩放 图片放在手机里面 应该充满 整个手机) 我把图片放在不一样drawable文件夹中
文件夹 加载时间(ms) 图片显示 说明
drawable 290 充满屏幕 图片拉伸
drawable-nodpi 127 充满屏幕 图片显示正常
drawable-ldpi 369 充满屏幕 图片拉伸
drawable-mdpi 346 充满屏幕 图片拉伸
drawable-hdpi 124 充满屏幕 图片显示正常
drawable-xhdpi 241 未充满屏幕 图片缩放
获得结论:
drawable-nodpi 中 图片不会被拉伸
系统在获得图片时候,会先到设备对应的dpi的文件夹下去去找资源文件,找到后应该不会作缩放直接返回图片。
若是没有在对应的dpi文件夹中找到,回去其余文件夹中查找,找到后会作相应的缩放。
在高dpi找到的图片会缩放,在低dpi的会拉伸
还有就是 源码中能够看出 loadDrawable的过程实在C层作的。经过系统资源id加载会比java层直接加载图片更便捷。