package org.itsnat.droid.impl.xmlinflater.animinterp.classtree; import android.content.Context; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.BounceInterpolator; import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; import org.itsnat.droid.impl.util.MiscUtil; import org.itsnat.droid.impl.xmlinflater.animinterp.ClassDescInterpolatorMgr; import java.lang.reflect.Constructor; /** * Created by Jose on 15/10/2015. */ public class ClassDescInterpolatorNoField extends ClassDescInterpolatorBased<Interpolator> { protected Class<Interpolator> clasz; protected Constructor<? extends Interpolator> constructor; public ClassDescInterpolatorNoField(ClassDescInterpolatorMgr classMgr,String tagName) { super(classMgr, tagName, null); } @Override public Class<Interpolator> getDeclaredClass() { return clasz; } @Override protected void init() { initClass(); super.init(); } //@SuppressWarnings("unchecked") protected Class<Interpolator> initClass() { // El motivo de ésto es evitar usar el .class lo que obliga a cargar la clase aunque no se use, así la clase nativa se carga cuando se necesita por primera vez if (clasz == null) { this.clasz = resolveClass(); } return clasz; } @SuppressWarnings("unchecked") protected Class<Interpolator> resolveClass() { String tagName = getClassOrDOMElemName(); String className = Character.toUpperCase(tagName.charAt(0)) + tagName.substring(1); return (Class<Interpolator>) MiscUtil.resolveClass(className); } @Override protected Interpolator createResourceNative(Context ctx) { // Para tres clases no hace falta crear dinámicamente los objetos String tagName = getClassOrDOMElemName(); if ("accelerateDecelerateInterpolator".equals(tagName)) return new AccelerateDecelerateInterpolator(ctx,null); else if ("bounceInterpolator".equals(tagName)) return new BounceInterpolator(ctx,null); else if ("linearInterpolator".equals(tagName)) return new LinearInterpolator(ctx,null); else throw MiscUtil.internalError(); } }