package com.xenoage.utils.android.font; import android.graphics.Paint; import android.graphics.Paint.FontMetrics; import android.graphics.Typeface; import com.xenoage.utils.font.FontInfo; import com.xenoage.utils.font.TextMeasurer; import com.xenoage.utils.font.TextMetrics; import com.xenoage.utils.math.Units; /** * Android implementation of a {@link TextMeasurer}. * * TODO: I'm not sure yet about the units Android uses * for drawing/measuring text. The computations done here * were found by experiments and are not optimal, just a first * guess. * * @author Andreas Wenger */ public class AndroidTextMeasurer implements TextMeasurer { @Override public TextMetrics measure(FontInfo font, String text) { Paint paint = new Paint(); paint.setTypeface(Typeface.SERIF); //currently only serif is supported paint.setTextSize(font.getSize()); return measure(paint, text); } public static TextMetrics measure(Paint paint, String text) { FontMetrics metrics = new FontMetrics(); paint.getFontMetrics(metrics); float ascent = Units.pxToMm(Math.abs(metrics.ascent), 1); float descent = Units.pxToMm(metrics.descent, 1); float leading = Units.pxToMm(metrics.leading, 1); float width = Units.pxToMm(paint.measureText(text), 1); return new TextMetrics(ascent, descent, leading, width); } }