Android 4.2.1 carácter incorrecto kerning (espaciado)

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

Por debajo de 4.2:

Introduzca aquí la descripción de la imagen

Para Android 4.2.1 (Nexux 7) consigo:

Introduzca aquí la descripción de la imagen

Como se puede ver el texto El consumo es muy estrecho. Parece ser un problema de kerning introducido en 4.2.1. La pintura usada para dibujar el 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 utilizo titlePaint.setLinearText(true) obtengo un extraño resultado en 4.2.1 como se puede ver allí:

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

EDITAR:

Este extraño comportamiento ha sido reportado al equipo de Android: http://code.google.com/p/android/issues/detail?id=39755 pero aún no es un problema "oficial".

EDIT (2):

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

Solución que estoy utilizando actualmente:

 scalePaint.setTextSize(1.5f); 

Entonces, 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 reestructurando la posición del texto, así que es donde se supone que es.

Respondo a mi propia pregunta después de aceptar la única respuesta que propuso una solución para mi problema específico. Eso podría ser una solución "agradable" 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); } } 

Se trata de un error en Android y, aunque ya se ha enviado al rastreador de errores, es posible que desee marcarlo con +1 para obtener algo de atención: Número 39755

  • ¿Por qué mis estados de botones personalizados no funcionan?
  • ¿Cómo mostrar una vista durante 3 segundos, y luego ocultarlo?
  • Hay un iUI para el Android
  • ¿Por qué necesitamos actualizar la aplicación para móviles?
  • ¿Cómo se crean botones con anchuras iguales?
  • ¿Cómo puedo ejecutar el código en el hilo de la interfaz de usuario en una prueba de Android JUnit sin una actividad?
  • Aplicación para Android que muestra bordes negros que superponen los bordes de la interfaz de usuario - algún tipo de modo de compatibilidad?
  • Establecer atributos (margen, gravedad, etc ...) en una vista de Android mediante programación (sin XML)
  • No se muestra ninguna imagen de fondo en Galaxy Nexus (SOLO)?
  • FragmentActivity TabHost con Fragmento y Actividad
  • Android - ¿cómo pasar los datos al Runnable en runOnUiThread?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.