2017-08-06 4 views
0

Ohne Wort Zeilen umgebrochen?Android möglich zum Zeichnen von Zeilennummern in EditText?

Was ich tun möchte, ist eine Klasse, die EditText Zeilennummern auf der linken Seite jeder Zeile zu erweitern. Auf der Vorderseite ist dies ziemlich einfach, indem man die Zeilen 0 bis super.getLineCount() iteriert und einen Index am Anfang einer Zeile zeichnet.

Aber was ich sehe nicht ein einfaches sagen zu tun; Überspringe Zeilen, die umgebrochen sind (Zeilen, die nicht mit einer \n enden). Zum Beispiel in vim würde es mögen:

example

Was ich bin mit dem obigen Szenario zu tun (Linie zählt nicht umgebrochen Linien Skipping)

protected void onDraw(Canvas canvas) { 

...   
     int count = getLineCount(); 
     for (int i = 0; i < count; ++i) { 
      getLineBounds(i, mRect); 
      String num = String.valueOf(i + 1); 
      mPaint.getTextBounds(num, 0, num.length(), mNumberRect); 
      canvas.drawText(num, NUMBER_LEFT_PAD, mRect.top + mTextHeight - 5, mPaint); 
     } 

... 

    super.onDraw(canvas); 
} 

Wie würde ich die Linien Wort erkennen eingewickelte Linien und welche sind durchbrochene Linien?

+0

'getLayout(). GetLineStart (i)' gibt Ihnen die Position des ersten Zeichens in einer gegebenen Zeile. Überprüfen Sie, ob das Zeichen 'position - 1'' \ n' ist, und zeichnen Sie keine Zeilennummer, wenn dies der Fall ist. Sie müssen ein separates "int" verwenden, um die gezeichneten Zeilennummern zu verfolgen. –

Antwort

-1

Ich empfehle es. (draw line numbers in edittext)

@Override 
     protected void onDraw(Canvas canvas) { 
      int baseline = getBaseline() 
      for (int i = 0; i < getLineCount(); i++) { 
       canvas.drawText("" + (i+1), rect.left, baseline, paint); 
       baseline += getLineHeight(); 
      } 
      super.onDraw(canvas); 
     } 
+2

Dies ist genau das, was ich versuchte, Mühe in diese Frage zu vermeiden. Der ganze Körper meiner Frage erklärt den Unterschied zwischen diesem (was ich jetzt habe) und was ich zu erreichen versuche. Danke trotzdem. –

1

gehen Sie vor, was Mike gesagt, Sie dies erreichen können, indem jede gerenderte Linie zu überprüfen, ob es sich um eine tatsächliche Linie ist (voran durch einen Zeilenumbruch \n) oder ein Wortumbruch Zeile und nur Zeilennummern erhöhen/zeichnen, wenn es eine tatsächliche Zeile ist.

protected void onDraw(Canvas canvas) { 
    int count = getLineCount(); 
    int lineNumber = 1; 
    for (int i = 0; i < count; ++i) { 
     getLineBounds(i, mRect); 
     String num = String.valueOf(i + 1); 
     mPaint.getTextBounds(num, 0, num.length(), mNumberRect); 
     if (i == 0) { 
      canvas.drawText(num, NUMBER_LEFT_PAD, mRect.top + mTextHeight - 5, mPaint); 
      ++lineNumber; 
     } else if (getText().charAt(getLayout().getLineStart(i) - 1) == '\n') { 
      canvas.drawText(num, NUMBER_LEFT_PAD, mRect.top + mTextHeight - 5, mPaint); 
      ++lineNumber; 
     } 
    } 
    super.onDraw(canvas); 
}