2016-06-01 11 views
1

Ich habe eine benutzerdefinierte EditText-Klasse erstellt, die Zeilennummern als nächste auf der linken Seite jeder Zeile zeichnet. Dies funktioniert gut, aber so etwas wie dies Ich möchte auch den Hintergrund der Zeilennummern auf grau und zu erreichen:Zeichnen von Zeilennummern mit Hintergrund in Custom Android Editingtext

what i want it to look like

In OnDraw Verfahren, in dem ich die Zahlen zeichne ich habe wirklich versucht, dicke Linie zu ziehen, aber es bekommt immer über die Zeilennummern gezogen, egal wo ich es anlege, vor dem Anruf zieht die Zeilennummer oder danach. Hier ist mein Code

protected void onDraw(Canvas canvas) { 
    int baseline = getBaseline(); 

    for (int i = 0; i < getLineCount(); i++) { 
     //line still gets drawn over the text 
     canvas.drawText("" + (i + 1), rect.left, baseline, paint); 
     canvas.drawLine(rect.left,baseline,rect.right,rect.top,fill); 
     canvas.drawText("" + (i + 1), rect.left, baseline, paint); 

     baseline += getLineHeight(); 

    } 

    super.onDraw(canvas); 
} 

Haben Sie Vorschläge, wie Sie die Zeile im Hintergrund erscheinen lassen?

Dank

+1

Ich sehe nicht, wo Sie immer 'rect' aktualisieren, so dass ich würde vermuten, dass es eine neue Linie der' drawLine() 'über eine frühere Zeile Nummer Zeichnung. Warum benutzen Sie nicht einfach 'drawRect()' für den Hintergrund und aktualisieren 'rect' für jede Zeile? –

+0

Dank ein bisschen tiefer, das ist genau das, was ich getan habe. –

Antwort

0

Try eine Linie, an der die Breite der Leitungsnummer zu ziehen. vor die Schleife:

Paint linePaint = new Paint(getPaint()); // copy original Paint 
linePaint.setARGB(255, 200, 200, 200); // some grey color 
String strCount = String.valueOf(getLineCount()); 

float[] symbolWidths = new float[strCount.length()]; 
linePaint.getTextWidths(strCount, symbolWidths); 

float strokeWidth = 0; 
for (float width : symbolWidths) 
    strokeWidth += width; 
strokeWidth = strokeWidth *2/*I dnt knw y*/ + strokeWidth; 
linePaint.setStrokeWidth(strokeWidth); 
setPadding((int)strokeWidth/2, 0, 0, 0); // text padding 

canvas.drawLine(rect.left, getLineHeight() * getLineCount(), rect.right, rect.top, linePaint);