最近需要研究下drawable是如何从xml中倒入的,Android系统加载过程中是否有什么优化和优秀的点可以了解下,所以看了下相关的源码
首先大概的流程图如下:
从resource.java的getDrawable方法开始看起
这里我们重点查看第三个流程的loadDrawable方法以及loadDrawableForCookie方法以及生成想对应的drawable的inflateFromTag方法。
总结起来,drawable 在加载的过程中会通过xml的属性生成对应的例如shapeDrawable等不同类型的drawable,同时通过文件名作为key值做缓冲。
@Nullable
Drawable loadDrawable(@NonNull Resources wrapper, @NonNull TypedValue value, int id,
int density, @Nullable Resources.Theme theme)
throws NotFoundException {
// If the drawable's XML lives in our current density qualifier,
// it's okay to use a scaled version from the cache. Otherwise, we
// need to actually load the drawable from XML.
//若是图片的需要的分辨率和当前设备的分辨率相同,那么就用可以使用缓冲?
final boolean useCache = density == 0 || value.density == mMetrics.densityDpi;
// Pretend the requested density is actually the display density. If
// the drawable returned is not the requested density, then force it
// to be scaled later by dividing its density by the ratio of
// requested density to actual device density. Drawables that have
// undefined density or no density don't need to be handled here.
//若是drawable没有设定分辨率,这里不用走,若是设定了分辨率,若是drawable设定了分辨率,并且图片的分辨率和想要的分辨率是一样的,那么就将图片的分辨率设置为设备的分辨率,若是不 一样,那么就要进行缩放,我理解的是这里若是在2x的分辨率手机上想要3x的图片,并且图片正好也是3x的图片,那么就只能给设备的分辨率的图片,也就是屏幕2x,给不了3x;若是图片不是3x,而是2x,那么就要进行缩放,也就是原图片分辨率的2x/3x质量??? 为什么这么算呢?
if (density > 0 && value.density > 0 && value.density != TypedValue.DENSITY_NONE) {
if (value.density == density) {
value.density = mMetrics.densityDpi;
} else {
value.density = (value.density * mMetrics.densityDpi) / density;
}
}
try {
if (TRACE_FOR_PRELOAD) {
// Log only framework resources
if ((id >>> 24) == 0x1) {
final String name = getResourceName(id);
if (name != null) {
Log.d("PreloadDrawable", name);
}
}
}
final boolean isColorDrawable;
final DrawableCache caches;
final long key;
//判断背景是否是纯颜色,若是背景是纯颜色的&#x