2013-08-15 5 views
8

Derzeit verwende ich paintObject.measureText(textCopy.substring(0,i)) beim Durchlaufen einer Kopie des TextView-Textes. Zum Beispiel gibt measureText("abc".substring(0,1)) mir die relativen x Koordinaten von 'b'. Die y Koordinate erhalte ich von layout.getLineTop(). Dies funktioniert, aber nicht genau für x Koordinaten für nicht monospaced Fonts. Ich kann ein wenig kalibrieren, aber auf jedem Gerät funktioniert es anders.Finden Sie die genauen Koordinaten eines einzelnen Zeichens in einem TextView

Die beste Lösung, die ich mir vorstellen kann, ist das Überschreiben der Klasse, die für das Zeichnen der TextView auf dem Bildschirm verantwortlich ist und, hoffentlich, die Koordinaten jedes Zeichens auf dem Bildschirm gezeichnet.

Weiß jemand, welche Klasse ich überschreiben muss, um dies zu erreichen? Oder vielleicht eine andere kreative Lösung?

+0

Sollte der Text irgendein Markup enthalten (wie einige HTML-Tags)? Wenn nicht, können Sie einfach "onDraw()" von TextView überschreiben und den Text wie gewünscht zeichnen. –

+0

Es könnte übergreifenden Text enthalten. – Igor

+0

Nun, das verkompliziert die Dinge ein wenig, in "onDraw()" müssen Sie jedes Zeichen basierend auf dem Bereich, zu dem es gehört, wie fett oder kursiv usw., aktualisieren, indem Sie die zum Zeichnen verwendete Farbe aktualisieren. –

Antwort

7

Nun, es scheint so ein Fehler von Paint.measureText() oder andere tiefere Klasse. Aber ich habe ENDLICH einen Weg darum herum gefunden:

layout.getPrimaryHorizontal(int offset) 

Das ist sehr einfach. Sie durchlaufen nur das Layout mit der Länge des verwendeten Textes.

Es wird das x des Zeichens REGARDLESS der Zeilenposition zurückgeben. So Linien bekomme ich immer noch von der layout.getLineTop(). Übrigens, wenn Sie die layout.getLineTop() verwenden, beachten Sie, dass es ein seltsames Verhalten, möglicherweise einen Fehler gibt. Ich habe einen Fehlerbericht here eingereicht.