package org.itsnat.droid.impl.xmlinflater.drawable; import org.itsnat.droid.impl.xmlinflater.ClassDescMgr; import org.itsnat.droid.impl.xmlinflater.XMLInflaterRegistry; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescAnimationDrawable; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescAnimationDrawableChildItem; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescBitmapDrawable; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescClipDrawable; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescColorDrawable; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescElementDrawable; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescElementDrawableChildDrawableBridge; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescElementDrawableContainer; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescGradientDrawable; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescGradientDrawableChildCorners; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescGradientDrawableChildGradient; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescGradientDrawableChildPadding; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescGradientDrawableChildSize; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescGradientDrawableChildSolid; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescGradientDrawableChildStroke; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescInsetDrawable; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescLayerDrawable; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescLayerDrawableChildItem; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescLevelListDrawable; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescLevelListDrawableChildItem; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescNinePatchDrawable; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescRotateDrawable; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescScaleDrawable; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescStateListDrawable; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescStateListDrawableChildItem; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescTransitionDrawable; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescTransitionDrawableChildItem; import org.itsnat.droid.impl.xmlinflater.shared.classtree.ClassDescResourceBased; /** * Created by jmarranz on 30/04/14. */ public class ClassDescDrawableMgr extends ClassDescMgr<ClassDescResourceBased> { public ClassDescDrawableMgr(XMLInflaterRegistry parent) { super(parent); initClassDesc(); } @Override public ClassDescResourceBased get(String classOrDOMElemName) { return classes.get(classOrDOMElemName); } @Override protected void initClassDesc() { // https://developer.android.com/guide/topics/resources/drawable-resource.html // Las clases suelen tener un método para "inflar": public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs) // en vez de inflarse en el constructor // En la documentación del código fuente al principio se listan los atributos que definen la clase y los item hijo (se añade al nombre del atributo "Item") // Ej Attr: // ref android.R.styleable#AnimationDrawableItem_drawable ClassDescElementDrawableChildDrawableBridge childBridge = new ClassDescElementDrawableChildDrawableBridge(this); addClassDesc(childBridge); ClassDescElementDrawable drawable = new ClassDescElementDrawable(this); // no tiene atributos ni Drawable clase padre // android.graphics.drawable.AnimatedVectorDrawable es level 21 ClassDescBitmapDrawable bitmap = new ClassDescBitmapDrawable(this,drawable); addClassDesc(bitmap); ClassDescColorDrawable color = new ClassDescColorDrawable(this,drawable); addClassDesc(color); // DrawableContainer y derivadas // No llamamos a addClassDesc() porque no hay clase que se instancie, es clase base ClassDescElementDrawableContainer drawableContainer = new ClassDescElementDrawableContainer(this,drawable); ClassDescAnimationDrawable animation = new ClassDescAnimationDrawable(this,drawableContainer); addClassDesc(animation); ClassDescAnimationDrawableChildItem animationItem = new ClassDescAnimationDrawableChildItem(this); addClassDesc(animationItem); ClassDescLevelListDrawable levelList = new ClassDescLevelListDrawable(this,drawableContainer); addClassDesc(levelList); ClassDescLevelListDrawableChildItem levelListItem = new ClassDescLevelListDrawableChildItem(this); addClassDesc(levelListItem); ClassDescStateListDrawable stateList = new ClassDescStateListDrawable(this,drawableContainer); addClassDesc(stateList); ClassDescStateListDrawableChildItem stateListItem = new ClassDescStateListDrawableChildItem(this); addClassDesc(stateListItem); // AnimatedStateListDrawable hereda de StateListDrawable pero es level 21 // android.graphics.drawable.DrawableWrapper es level 23 pero lo vamos teniendo en cuenta // estas són sus derivadas ClassDescClipDrawable clip = new ClassDescClipDrawable(this,drawable); addClassDesc(clip); ClassDescInsetDrawable inset = new ClassDescInsetDrawable(this,drawable); addClassDesc(inset); ClassDescRotateDrawable rotate = new ClassDescRotateDrawable(this,drawable); addClassDesc(rotate); ClassDescScaleDrawable scale = new ClassDescScaleDrawable(this,drawable); addClassDesc(scale); // Derivadas directas de Drawable NO DrawableWrapper ClassDescGradientDrawable gradient = new ClassDescGradientDrawable(this,drawable); addClassDesc(gradient); ClassDescGradientDrawableChildCorners gradientCornersItem = new ClassDescGradientDrawableChildCorners(this); addClassDesc(gradientCornersItem); ClassDescGradientDrawableChildGradient gradientGradientItem = new ClassDescGradientDrawableChildGradient(this); addClassDesc(gradientGradientItem); ClassDescGradientDrawableChildPadding gradientPaddingItem = new ClassDescGradientDrawableChildPadding(this); addClassDesc(gradientPaddingItem); ClassDescGradientDrawableChildSize gradientSizeItem = new ClassDescGradientDrawableChildSize(this); addClassDesc(gradientSizeItem); ClassDescGradientDrawableChildSolid gradientSolidItem = new ClassDescGradientDrawableChildSolid(this); addClassDesc(gradientSolidItem); ClassDescGradientDrawableChildStroke gradientStrokeItem = new ClassDescGradientDrawableChildStroke(this); addClassDesc(gradientStrokeItem); ClassDescLayerDrawable layer = new ClassDescLayerDrawable(this,drawable); addClassDesc(layer); ClassDescLayerDrawableChildItem layerItem = new ClassDescLayerDrawableChildItem(this); addClassDesc(layerItem); ClassDescTransitionDrawable transition = new ClassDescTransitionDrawable(this,layer); addClassDesc(transition); ClassDescTransitionDrawableChildItem transitionItem = new ClassDescTransitionDrawableChildItem(this,layerItem); addClassDesc(transitionItem); // RippleDrawable es level 21 ClassDescNinePatchDrawable ninePatch = new ClassDescNinePatchDrawable(this,drawable); addClassDesc(ninePatch); // ShapeDrawable no se como usarlo como XML pues <shape> se refiere a GradientDrawable, parece que ShapeDrawable es una antigualla o bien realmente sólo se puede usar via objeto Java } }