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:
- Android UI DPI problema - es xxxhdpi recursos necesarios?
- Hacer fondo transparente de los iconos de Android en eclipse
- Fuente personalizada en Android
- ¿Cómo puedo permitir que un usuario reordene los elementos en una lista?
- ContentProvider insert () siempre se ejecuta en el hilo de interfaz de usuario?
Para Android 4.2.1 (Nexux 7) consigo:
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 …
- Implementar doble clic para el botón en Android
- ¿Dejar de presionar dos botones a la vez?
- Independiente android ventana de monitor en android studio 2.1
- IOS-como herramienta de guión gráfico para el proyecto de Android?
- ¿Buenas herramientas para desarrollar una GUI en Android?
- sugerir herramienta para la creación de prototipos de IU en Android - AppInventor, otros?
- Actualizaciones de interfaz de usuario de subprocesos en Android
- Android, cómo desenfocar / vidrio / helada actividad actual
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
- No se puede resolver el destino 'android-21'
- Límites de escala y límites de panorámica ImageView Pinch-zoom