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

Estoy enfrentando un problema grave con mi aplicación, publicado en Google Play y aparentemente funciona bien en todas las versiones de Android excepto para> 4.0.

Esta es una captura de pantalla de mi teléfono HTC con Android 4.0:

enter image description here

Y esto es lo que obtengo en Nexus 7, Android 4.2.1 (el mismo comportamiento en el emulador):

enter image description here

Veo el mismo comportamiento para cada texto dibujado usando canvas.drawText()

la pintura utilizada para dibujar texto es:

 paint = new Paint(); paint.setAntiAlias(true); paint.setColor(color); //some color paint.setTextSize(size); //some size paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); paint.setTextAlign(Align.CENTER); 

En el logCat (emulador 4.2.1) veo mucha

 12-18 20:42:21.096: W/Trace(276): Unexpected value from nativeGetEnabledTags: 0 

Yo uso estas configuraciones en el manifiesto:

   

Respondo mi propia pregunta después de mucho googlear …

El truco consiste en el uso de setLinearText(true) para el objeto Paint utilizado para dibujar el texto. Ahora, todo se ve genial.

 paint = new Paint(); paint.setAntiAlias(true); paint.setColor(color); paint.setTextSize(size); paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); paint.setTextAlign(Align.CENTER); paint.setLinearText(true); 

Aquí el enlace que salva mi día:

http://gc.codehum.com/p/android/issues/detail?id=39755

Espero que pueda ayudar a alguien más.

El texto no se representa al máximo todavía:

enter image description here

Editado (14/01/2013)

Todavía estoy enfrentando un problema de Kering (solo en 4.2.1). Por favor vea mi otra pregunta aquí:

Android kernel kernel (espaciado)

Editado (05/02/2013)

Veo que otros proyectos tienen el mismo problema. Mira el siguiente enlace:

http://mindtherobot.com/blog/272/android-custom-ui-making-a-vintage-thermometer/

Si ejecuta la muestra en Nexus 4.2.1 (o en el simulador Android 4.2) obtendrá el mismo texto “extraño” …

Editado (20/02/2013)

Encontré una solución alternativa que no usa setLinearText(true) , mira aquí:

Android kernel kernel (espaciado)

Tuve un problema similar, tratando de hacer una vista con espaciado de letras personalizado, así que hice estos 2 métodos, espero que alguien los encuentre útiles.

 /** * Draws a text in the canvas with spacing between each letter. * Basically what this method does is it split's the given text into individual letters * and draws each letter independently using Canvas.drawText with a separation of * {@code spacingX} between each letter. * @param canvas the canvas where the text will be drawn * @param text the text what will be drawn * @param left the left position of the text * @param top the top position of the text * @param paint holds styling information for the text * @param spacingPx the number of pixels between each letter that will be drawn */ public static void drawSpacedText(Canvas canvas, String text, float left, float top, Paint paint, float spacingPx){ float currentLeft = left; for (int i = 0; i < text.length(); i++) { String c = text.charAt(i)+""; canvas.drawText(c, currentLeft, top, paint); currentLeft += spacingPx; currentLeft += paint.measureText(c); } } /** * returns the width of a text drawn by drawSpacedText */ public static float getSpacedTextWidth(Paint paint, String text, float spacingX){ return paint.measureText(text) + spacingX * ( text.length() - 1 ); } 

Android 4 está predeterminado en Aceleración de hardware activada. Algunas de las funciones de dibujo no funcionan correctamente con esto. No puedo recordar cuáles exactamente, pero bash desactivar la aceleración de hardware en el archivo de manifiesto y ver si hace una diferencia.

Por supuesto, esta puede no ser la causa, pero vale la pena intentarlo.