I\'m facing a serious issue with my Application, published on Google Play and apparently working fine on all versions of Android except for > 4.0.
This is a screensh
I answer my own question after a lot of googling...
The trick consist in the use of setLinearText(true)
for the Paint object used for drawing the text. Now, everything looks great.
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);
Here the link that saves my day:
http://gc.codehum.com/p/android/issues/detail?id=39755
I hope it can help someonelse.
The text is not rendered at the best yet:
Edited (14/01/2013)
I'm still facing a kering problem (only on 4.2.1). Please see my other question here:
Android 4.2.1 wrong character kerning (spacing)
Edited (05/02/2013)
I see another projects has the same problem. Look at the link below:
http://mindtherobot.com/blog/272/android-custom-ui-making-a-vintage-thermometer/
If you run the sample on Nexus 4.2.1 (or in the simulator Android 4.2) you get the same "strange" text...
Edited (20/02/2013)
Found a workaround that not uses setLinearText(true)
, look here:
Android 4.2.1 wrong character kerning (spacing)
Android 4 defaults to Hardware Acceleration On. Some of the drawing functions do not work properly with this on. Cannot remember which ones exactly but try turning Hardware Acceleration off in the manifest file and see if it makes a difference.
Of course this may not be the cause but it worth a try.
I had a similar problem, trying to make a view with custom letter spacing so I just made this 2 methods, hope someone finds them helpful.
/**
* 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 );
}