Japp, du implementerar ResourceHandler. Under rendrering kommer getImage samt getText anropas när rendreraren stöter på Image samt Text element. ResourceHandlern skall retunera en referens till aktuell grafik/text. Interfaces ser ut så här:
Kod:
public interface ResourceHandler {
ImageResource getImage(Image definition);
TextResource getText(Text definition);
Context getContext();
public static final class TextResource {
public static enum Type {
CharSequence,
ResourceId;
}
public final Type type;
public final Object value;
public final int resourceId;
public TextResource(Type type, Object value, int resourceId) {
this.type = type;
this.value = value;
this.resourceId = resourceId;
}
}
public static final class ImageResource {
public static enum Type {
Uri,
Bitmap,
Drawable,
ResourceId;
}
public final Type type;
public final Object value;
public final int resourceId;
public ImageResource(Type type, Object value, int resourceId) {
this.type = type;
this.value = value;
this.resourceId = resourceId;
}
}
}
Argumenten Image samt Text är definitionerna som är specade i layouten som har parsats. Alla fält är typade, och validerade, förutom content som kan vara valfri sträng. Ett exempel på hur Text-klassen ser ut:
Kod:
public class Text extends AbstractElement {
public final Format format;
public final Set<Gravity> gravity;
public final Lines lines;
public final Float size;
public final Set<FontStyle> style;
public final Integer color;
public final Integer color2;
public Text(String content, int contentIndex, double x, double y, double w, double h,
Set<Gravity> gravity, Lines lines, Float size,
Set<FontStyle> style, Integer color, Integer color2, Format format) {
super(content, contentIndex, x, y, w, h);
this.gravity = Collections.unmodifiableSet(gravity);
this.lines = lines;
this.size = size;
this.style = Collections.unmodifiableSet(style);
this.color = color;
this.color2 = color2;
this.format = format;
}
public void accept(ElementVisitor visitor) {
visitor.visit(this);
}
AbstractElement:
Kod:
public abstract class AbstractElement implements VisitableElement {
public final String content;
public final int contentIndex;
public final double x;
public final double y;
public final double w;
public final double h;
public AbstractElement(String content, int contentIndex, double x, double y, double w, double h) {
this.content = content;
this.contentIndex = contentIndex;
this.x = x;
this.y = y;
this.w = w;
this.h = h;
}
}
Allt är immutable, och värden är aldrig satta till null, de har antingen ett värde som är angivet i layouten, eller ett defaultvärde.
När en layout parsas läggs alla element i en lista, elementet som är angivet överst i layoutfilen kommer alltid ritas före elementet som är angivet efter. Dvs allt ritas bakifrån och framåt om man tänker i Z.
När jag kommer tillbaka from USA ska jag göra clock-elementet. Det kommer ha samma attribut som AbstractElement plus några attribut för att ange digital/analog, och ev resursnamn för visarna. Kanske något mer, men inget jag kommer på nu. I ResourceHandler lägger jag då till metoden getClock(Clock definition)
Edit: Såg att när jag postade koden togs generics bort. Alla Set har en type. T.ex typen för "Set style" är FontStyle.