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

Estoy enfrentando un problema serio con mi aplicación, publicada en Google Play y al parecer funcionando bien en todas las versiones de Android excepto para> 4.0.

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

Introduzca aquí la descripción de la imagen

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

Introduzca aquí la descripción de la imagen

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

La pintura utilizada para dibujar el 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 (4.2.1 emulador) veo un montón de

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

Utilizo esta configuración en el manifiesto:

  <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8" /> 

Respondo a mi propia pregunta después de un montón de google …

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

 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.

El texto no se representa en el mejor de los casos:

Introduzca aquí la descripción de la imagen

Editado (14/01/2013)

Todavía me enfrento a un problema de kering (sólo en 4.2.1). Por favor vea mi otra pregunta aquí:

Android 4.2.1 carácter incorrecto kerning (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)

Encontrar una solución que no utiliza setLinearText(true) , mira aquí:

Android 4.2.1 carácter incorrecto kerning (espaciado)

Tuve un problema similar, tratando de hacer una vista con el espaciado de letras personalizadas por lo que acaba de hacer este 2 métodos, espero que alguien los encuentra útil.

 /** * 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 se ajusta por defecto a Aceleración de hardware activada. Algunas de las funciones de dibujo no funcionan correctamente con esto activado. No recuerdo cuáles exactamente, pero intente desactivar la aceleración de hardware en el archivo de manifiesto y ver si hace una diferencia.

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

  • Alineación derecha de la disposición de Android
  • Cómo compilar y ejecutar Google Contacts App en Android Emulator
  • Android GridLayout obtener fila / columna
  • Hacer una pantalla completa en sólo la disposición-tierra de Android cuando se reproduce videoView
  • Cómo anclar un botón en la parte inferior de un diseño relativo en android
  • Combinar la imagen de fondo, el estilo de fondo dibujable en un botón
  • Debe utilizar "sp" en lugar de "dp" para los tamaños de texto
  • ¿Cómo establecer el ancho y la altura para la vista personalizada en forma programática?
  • Error al generar el archivo final: java.io.FileNotFoundException: xxx \ bin \ resources.ap_ no existe
  • ProgressBar y ProgressBarStyleHorizontal de relleno
  • View obtiene su estado dibujable (presionado, etc ...) de su padre
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.