android user-interface kerning android-4.2-jelly-bean

Android kernel kernel(espaciado)



user-interface kerning (3)

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

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

Por debajo de 4.2:

Para Android 4.2.1 (Nexux 7) obtengo:

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 aún 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.restore();

Como puede ver, estoy reajustando la posición del texto, por lo que es 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); } }