Tengo una vista que dibuja un rectángulo con una línea de texto dentro de él. La vista utiliza texto de corte para garantizar que ningún texto se extienda fuera del rectángulo; ignora cualquier texto que lo haga. Esto funciona bien para algunos personajes, pero a menudo las cadenas compuestas por 'l'sy' s se extienden fuera del rectángulo. Entonces, necesito un chequeo de cordura: ¿Hay alguna falla obvia en mi código de abajo, o es posible que Paint.breakText (...) sea inexacto?Android: ¿es Paint.breakText (...) inexacto?
public void onDraw(Canvas canvas)
{
int MARGIN = 1;
int BORDER_WIDTH = 1;
Paint p = new Paint();
p.setAntiAlias(true);
p.setTextSize(12);
p.setTypeface(Typeface.create(Typeface.SERIF, Typeface.NORMAL));
RectF rect = getRect();
float maxWidth = rect.width() - MARGIN - BORDER_WIDTH * 2;
String str = getText();
char[] chars = str.toCharArray();
int nextPos = p.breakText(chars, 0, chars.length, maxWidth, null);
str = str.substring(0, nextPos);
float textX = MARGIN + BORDER_WIDTH;
float textY = (float) (Math.abs(p.getFontMetrics().ascent) + BORDER_WIDTH + MARGIN);
canvas.drawText(str, textX, textY, p);
p.setStrokeWidth(BORDER_WIDTH);
p.setStyle(Style.STROKE);
canvas.drawRect(rect, p);
}
Dudo que este sea el problema. El código dado supone que todo el trazo está dentro del rectángulo (esto se tiene en cuenta con las variables "maxWidth", "textX" y "textY"). Entonces, en todo caso, es probable que el texto se rompa antes de lo esperado, pero nunca debe extenderse fuera del rectángulo. – ab11
El problema era que las métricas fraccionarias (texto subpíxel) no estaban establecidas. – ab11