Android kernel kernel (espaciado)

Cuando uso el método Canvas y drawText() veo una representación diferente en Android 4.2.1.

Por debajo de 4.2:

enter image description here

Para Android 4.2.1 (Nexux 7) obtengo:

enter image description here

Como puede ver, el consumo de texto es muy ajustado. Parece ser un problema de interletraje introducido en 4.2.1. La pintura utilizada para dibujar texto no es nada especial:

 titlePaint = new Paint(); titlePaint.setAntiAlias(true); titlePaint.setColor(0xffffffff); titlePaint.setTextSize(0.125f); titlePaint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); titlePaint.setTextAlign(Align.CENTER); titlePaint.setLinearText(true); 

Si no uso titlePaint.setLinearText(true) obtengo un resultado extraño en 4.2.1 como puede ver allí:

Android 4.2 en Nexus 7: canvas.drawText () no funciona correctamente

EDITAR:

Este comportamiento extraño se ha informado al equipo de Android: http://code.google.com/p/android/issues/detail?id=39755 pero todavía no es un problema “oficial”.

EDITAR (2):

Algunos rumores afirman que el problema es un textSize <1.0f …

Solución, que estoy usando actualmente:

 scalePaint.setTextSize(1.5f); 

luego, en el método onDraw:

 canvas.save(); canvas.scale(0.01f, 0.01f); canvas.drawText(""+i, 0.5f*100, 0.8f*100, scalePaint); canvas.restre(); 

Como puede ver, estoy reajustando la posición del texto, por lo que está donde se supone que debe estar.

Respondo mi propia pregunta después de aceptar la única respuesta que propuso una solución alternativa para mi problema específico. Esa podría ser una solución “buena” y “definitiva”:

 public static void drawTextOnCanvasWithMagnifier(Canvas canvas, String text, float x, float y, Paint paint) { if (android.os.Build.VERSION.SDK_INT <= 15) { //draw normally canvas.drawText(text, x, y, paint); } else { //workaround float originalTextSize = paint.getTextSize(); final float magnifier = 1000f; canvas.save(); canvas.scale(1f / magnifier, 1f / magnifier); paint.setTextSize(originalTextSize * magnifier); canvas.drawText(text, x * magnifier, y * magnifier, paint); canvas.restore(); paint.setTextSize(originalTextSize); } } 

Este es un error en Android y, aunque ya se envió al rastreador de errores, es posible que desee hacer +1 allí para llamar la atención: Issue 39755

Utilice esta función para dibujar correctamente con las funciones de word wrap new line break y text alignment .

 static void drawTextWithStaticLayout(Canvas canvas, float x, float y, String text, int wrapWidth, TextPaint paint,Layout.Alignment alignment) { if (android.os.Build.VERSION.SDK_INT <= 15) { StaticLayout sl = new StaticLayout(text,paint, wrapWidth, alignment,1.0f,0.0f,false); sl.draw(canvas); } else { float originalTextSize = paint.getTextSize(); final float magnifier = 1000f; canvas.save(); canvas.translate(x,y); canvas.scale(1f / magnifier, 1f / magnifier); paint.setTextSize(originalTextSize * magnifier); StaticLayout sl = new StaticLayout(text,paint, (int)magnifier*wrapWidth, alignment,1.0f,0.0f,false); sl.draw(canvas); canvas.restore(); paint.setTextSize(originalTextSize); } }