package org.itsnat.droid.impl.xmlinflater.drawable.classtree; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.NinePatchDrawable; import org.itsnat.droid.ItsNatDroidException; import org.itsnat.droid.impl.dom.DOMAttr; import org.itsnat.droid.impl.dom.drawable.DOMElemDrawable; import org.itsnat.droid.impl.util.NamespaceUtil; import org.itsnat.droid.impl.xmlinflated.drawable.ElementDrawableChildRoot; import org.itsnat.droid.impl.xmlinflater.BitmapUtil; import org.itsnat.droid.impl.xmlinflater.XMLInflaterContext; import org.itsnat.droid.impl.xmlinflater.drawable.AttrDrawableContext; import org.itsnat.droid.impl.xmlinflater.drawable.BitmapDrawableUtil; import org.itsnat.droid.impl.xmlinflater.drawable.ClassDescDrawableMgr; import org.itsnat.droid.impl.xmlinflater.shared.attr.AttrDescReflecMethodBoolean; /** * Created by jmarranz on 10/11/14. */ public class ClassDescNinePatchDrawable extends ClassDescElementDrawableBased<NinePatchDrawable> { public ClassDescNinePatchDrawable(ClassDescDrawableMgr classMgr,ClassDescElementDrawableBased<? super NinePatchDrawable> parent) { super(classMgr,"nine-patch",parent); } @Override public ElementDrawableChildRoot createElementDrawableChildRoot(DOMElemDrawable rootElem, AttrDrawableContext attrCtx) { // http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.3_r1/android/graphics/drawable/Drawable.java#Drawable.createFromXmlInner%28android.content.res.Resources%2Corg.xmlpull.v1.XmlPullParser%2Candroid.util.AttributeSet%29 // http://stackoverflow.com/questions/5079868/create-a-ninepatch-ninepatchdrawable-in-runtime XMLInflaterContext xmlInflaterContext = attrCtx.getXMLInflaterContext(); Context ctx = xmlInflaterContext.getContext(); DOMAttr attrSrc = rootElem.getDOMAttribute(NamespaceUtil.XMLNS_ANDROID, "src"); if (attrSrc == null) throw new ItsNatDroidException("Missing src attribute in element " + rootElem.getTagName()); // No necesita escalar pues por definiciĆ³n es "flexible" Bitmap bitmap = BitmapUtil.getBitmap(attrSrc.getResourceDesc(),xmlInflaterContext.getBitmapDensityReference(),ctx,classMgr.getXMLInflaterRegistry()); NinePatchDrawable drawable = BitmapDrawableUtil.createNinePatchDrawable(bitmap,ctx.getResources()); return new ElementDrawableChildRoot(drawable); } @Override public boolean isAttributeIgnored(NinePatchDrawable resource, String namespaceURI, String name) { if (super.isAttributeIgnored(resource,namespaceURI,name)) return true; return isSrcAttribute(namespaceURI, name); // Se usa al construir el drawable } private static boolean isSrcAttribute(String namespaceURI,String name) { return NamespaceUtil.XMLNS_ANDROID.equals(namespaceURI) && name.equals("src"); } @Override public Class<NinePatchDrawable> getDrawableOrElementDrawableClass() { return NinePatchDrawable.class; } @SuppressWarnings("unchecked") protected void init() { super.init(); addAttrDescAN(new AttrDescReflecMethodBoolean(this, "dither", true)); } }