7

Ich stehe vor einem ernsten Problem mit meiner Anwendung, die auf Google Play veröffentlicht wurde und scheinbar auf allen Versionen von Android funktioniert, außer> 4.0. Android 4.2 auf Nexus 7: canvas.drawText() funktioniert nicht richtig

Dies ist ein Screenshoot von meinem Android 4.0 HTC Handy:

enter image description here

Und das ist, was ich auf dem Nexus 7 erhalten, Android 4.2.1 (gleiches Verhalten im Emulator):

enter image description here

ich sehe das gleiche Verhalten für jeden gezeichneten Text canvas.drawText()

mit

die Farbe verwendet, um Text zu zeichnen ist:

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); 

Im Logcat (4.2.1 Emulator) Ich sehe eine Menge von

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

ich diese Einstellungen im Manifest verwenden:

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

tatsächlich ist die Textgröße 0,175f und ich skaliere die Leinwand mit backgroundCanvas.scale (getWidth(), getWidth()); –

Antwort

14

ich meine eigene Frage nach vielen googeln beantworten ...

Der Trick besteht in der Verwendung von setLinearText(true) für die Farben Objekt zum Zeichnen des Textes verwendet. Jetzt sieht alles gut aus.

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); 

Hier ist der Link, der mein Tag spart:

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

Ich hoffe, dass es someonelse helfen kann.

enter image description here

Edited (14/01/2013)

Ich bin immer noch ein Kering Problem konfrontiert (nur bei 4.2:

Der Text wird am besten noch nicht gemacht. 1). Bitte beachten Sie meine andere Frage hier:

Android 4.2.1 wrong character kerning (spacing)

Edited (05/02/2013)

Ich sehe eine andere Projekte hat das gleiche Problem.Schauen Sie sich den folgenden Link:

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

Wenn Sie ausführen, um die Probe auf Nexus 4.2.1 (oder im Simulator Android 4.2) Sie den gleichen "seltsamen" text bekommen ...

Edited (20/02/2013)

eine Abhilfe gefunden, die nicht setLinearText(true) verwendet, schau mal hier:

Android 4.2.1 wrong character kerning (spacing)

+0

Danke, danke, danke! Du hast mich vor dem Wahnsinn gerettet! Es funktioniert schließlich mit setLinearText (true). Ich wünschte, sie würden diese API-Änderungen besser für die Entwickler dokumentieren. Das hat mich zwei Wochen gekostet, um für 4.2.1 zu arbeiten. Grrr .... – ssuperz28

+0

Ich bin froh, ich bin nicht allein mit diesem Problem ... Wie Sie sehen können, scheint die Kerning-Zeichen falsch zu sein (Zeichenabstand ist 0). Hast du das gleiche Problem? Meine andere Frage hier: http://stackoverflow.com/questions/13974129/android-4-2-1-wornng-character-kerning-spacing –

0

Android 4 standardmäßig auf Hardwarebeschleunigung Ein. Einige der Zeichenfunktionen funktionieren nicht richtig damit. Ich kann mich nicht erinnern, welche genau, aber versuche, die Hardwarebeschleunigung in der Manifest-Datei auszuschalten und zu sehen, ob es einen Unterschied macht.

Natürlich kann dies nicht die Ursache sein, aber es ist einen Versuch wert.

+0

Danke. Leider wird das Tag android: hardwareAccelerated nicht unter Android 3.0 erkannt, so dass ich es nicht für meine Anwendung (Android 2.3.3) verwenden kann ... –

+0

Wenn Sie gegen Android 3 oder 4 kompilieren können Sie. Es wird auf Versionen ignoriert, die es nicht unterstützen. (Ändern Sie das Projekt Build-Ziel nicht Ihre Manifest-Datei) – Kuffs

+0

Ok, ich habe Android SDK 3.2, Android: hardwareAccelerated = "false" neu kompiliert und das gleiche Problem. –

1

Ich hatte ein ähnliches Problem, versuchen, eine Ansicht mit benutzerdefinierten Buchstabenabstand zu machen, so dass ich gerade diese 2 Methoden gemacht habe, hoffe jemand findet sie hilfreich.

/** 
* 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); 
} 
Verwandte Themen