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:
- Recuperando onBindViewHolder al desplazarse por la vista Recycler
- AlertDialog para envolver su contenido
- Cambiar el color de texto de un solo ClickableSpan cuando se presiona sin afectar a otros ClickableSpans en el mismo TextView
- Diferencia entre R.layout y android.R.layout
- Cambiar el título del encabezado de NavigationView
Y esto es lo que obtengo en Nexus 7, Android 4.2.1 (mismo comportamiento en el emulador):
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" />
- Listview en android no actualizó la vista hasta que se arrastró
- Actividad que solo se inicia una vez después de una nueva instalación?
- Diseño deslizante como google maps v7
- Desactivar oscurecimiento oscuro en el cajón de navegación
- android.content.res.Resources $ NotFoundException: String resource ID # 0x12 - onLocationChanged ()
- Margen relativo de Android RelativeLayout
- ¿Cómo mostrar el archivo .gif en la vista de la imagen?
- Cómo crear la interfaz de usuario como la foto adjunta
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:
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.
- Android comportamiento de la variable estática en la caída de la aplicación
- ¿Hay una manera de detener Mobile Safari insertando comas en campos numéricos en formularios HTML?