Android background drawable加载过程
View 部分
在View的构造方法内:
// 构造方法
public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
this(context);
//省略部分代码
final TypedArray a = context.obtainStyledAttributes(
attrs, com.android.internal.R.styleable.View, defStyleAttr, defStyleRes);
retrieveExplicitStyle(context.getTheme(), attrs);
saveAttributeDataForStyleable(context, com.android.internal.R.styleable.View, attrs, a,
defStyleAttr, defStyleRes);
Drawable background = null;
final int N = a.getIndexCount();
for (int i = 0; i < N; i++) {
int attr = a.getIndex(i);
switch (attr) {
case com.android.internal.R.styleable.View_background:
//这里赋值
background = a.getDrawable(attr);
break;
}
}
//省略部分代码
}
跟踪 TypedArray.getDrawable
TypedArray.getDrawable
|- TypedArray.getDrawableForDensity()
|- Resources.loadDrawable()
|- ResourcesImpl.loadDrawable()
|- ResourcesImpl.loadDrawable()
|- ResourcesImpl.loadDrawableForCookie()
|- ResourcesImpl.loadXmlDrawable()
|- Drawable.createFromXmlForDensity()
|- Drawable.createFromXmlInnerForDensity()
|- DrawableInflater.inflateFromXml()
|- DrawableInflater.inflateFromXmlForDensity()
|- DrawableInflater.inflateFromTag()
具体实现
在这里可以看到所有的drawable节点和对应的drawable的Java对象
@NonNull
@SuppressWarnings("deprecation")
private Drawable inflateFromTag(@NonNull String name) {
switch (name) {
case "selector":
return new StateListDrawable();
case "animated-selector":
return new AnimatedStateListDrawable();
case "level-list":
return new LevelListDrawable();
case "layer-list":
return new LayerDrawable();
case "transition":
return new TransitionDrawable();
case "ripple":
return new RippleDrawable();
case "adaptive-icon":
return new AdaptiveIconDrawable();
case "color":
return new ColorDrawable();
case "shape":
return new GradientDrawable();
case "vector":
return new VectorDrawable();
case "animated-vector":
return new AnimatedVectorDrawable();
case "scale":
return new ScaleDrawable();
case "clip":
return new ClipDrawable();
case "rotate":
return new RotateDrawable();
case "animated-rotate":
return new AnimatedRotateDrawable();
case "animation-list":
return new AnimationDrawable();
case "inset":
return new InsetDrawable();
case "bitmap":
return new BitmapDrawable();
case "nine-patch":
return new NinePatchDrawable();
case "animated-image":
return new AnimatedImageDrawable();
default:
return null;
}
}